env.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { computed, ref, watch } from "vue";
  2. export const urlUpdateQuery = (
  3. link: string,
  4. params: Record<string, string>,
  5. rep = false
  6. ) => {
  7. const url = new URL(link);
  8. const ndx = url.hash.indexOf("?");
  9. let search: URLSearchParams;
  10. if (!rep && ~ndx) {
  11. search = new URLSearchParams({
  12. ...(urlGetQuery(link) as any),
  13. ...params,
  14. });
  15. for (const key in params) {
  16. search.set(key, params[key]);
  17. }
  18. } else {
  19. search = new URLSearchParams(params);
  20. }
  21. url.hash = url.hash.substring(0, ndx + 1) + search.toString();
  22. return url.toString();
  23. };
  24. export const urlGetQuery = (link: string) => {
  25. const url = new URL(link);
  26. const hash = url.hash;
  27. const ndx = hash.indexOf("?");
  28. if (!~ndx) return {};
  29. const sParams = new URLSearchParams(hash.substring(ndx));
  30. const rParams: Record<string, string> = {};
  31. [...sParams.entries()].forEach((item) => {
  32. rParams[item[0]] = item[1];
  33. });
  34. return rParams;
  35. };
  36. export const params = ref<Record<string, any>>({});
  37. const sParams = new URLSearchParams(location.search);
  38. [...sParams.entries()].forEach((item) => {
  39. params.value[item[0]] = item[1];
  40. });
  41. const updateParams = () => {
  42. const rParams = urlGetQuery(location.href);
  43. params.value = rParams;
  44. for (const key in params.value) {
  45. if (["tabulationId", "overviewId"].includes(key)) {
  46. params.value[key] = Number(params.value[key]);
  47. }
  48. }
  49. };
  50. updateParams();
  51. let updateNeedReload = true;
  52. export const preventReload = () => {
  53. updateNeedReload = false;
  54. setTimeout(() => (updateNeedReload = true));
  55. };
  56. watch(
  57. () => ({ ...params.value }),
  58. (nParams, oParams) => {
  59. const sParams = new URLSearchParams();
  60. for (const key in params.value) {
  61. params.value[key] && sParams.append(key, params.value[key]);
  62. }
  63. const ndx = location.hash.indexOf("?");
  64. const path =
  65. location.hash.substring(0, ~ndx ? ndx : undefined) +
  66. "?" +
  67. sParams.toString();
  68. if (location.hash) {
  69. location.replace(path);
  70. } else {
  71. location.replace(`#` + path);
  72. }
  73. if (!updateNeedReload) {
  74. return;
  75. }
  76. const keys = new Set([...Object.keys(nParams), ...Object.keys(oParams)]);
  77. for (const key of keys) {
  78. if (!nParams[key] || (nParams[key] && oParams[key])) {
  79. if (nParams[key] !== oParams[key]) {
  80. setTimeout(() => {
  81. location.reload();
  82. }, 100);
  83. return;
  84. }
  85. }
  86. }
  87. },
  88. { deep: true }
  89. );
  90. window.addEventListener("hashchange", updateParams);
  91. const getQuisk = (key: string) =>
  92. computed({
  93. get() {
  94. return params.value[key];
  95. },
  96. set(val: string) {
  97. params.value[key] = val;
  98. },
  99. });
  100. export const tabulationId = getQuisk("tabulationId");
  101. export const overviewId = getQuisk("overviewId");
  102. export const token = getQuisk("token");