useJson.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { decompressFromBase64 } from "lz-string";
  2. import { altogic } from "src/api/altogic";
  3. import { defaultJson } from "src/constants/data";
  4. import useGraph from "src/store/useGraph";
  5. import create from "zustand";
  6. interface Json {
  7. _id: string;
  8. createdAt: string;
  9. updatedAt: string;
  10. json: string;
  11. name: string;
  12. private: false;
  13. }
  14. interface JsonActions {
  15. setJson: (json: string) => void;
  16. getJson: () => string;
  17. fetchJson: (jsonId: string | string[] | undefined) => void;
  18. setError: (hasError: boolean) => void;
  19. setHasChanges: (hasChanges: boolean) => void;
  20. }
  21. const initialStates = {
  22. data: null as Json | null,
  23. json: "",
  24. loading: true,
  25. hasChanges: false,
  26. hasError: false,
  27. };
  28. export type JsonStates = typeof initialStates;
  29. const useJson = create<JsonStates & JsonActions>()((set, get) => ({
  30. ...initialStates,
  31. getJson: () => get().json,
  32. fetchJson: async jsonId => {
  33. if (jsonId) {
  34. const { data } = await altogic.endpoint.get(`json/${jsonId}`);
  35. if (data) {
  36. const decompressedData = decompressFromBase64(data.json);
  37. if (decompressedData) {
  38. useGraph.getState().setGraph(decompressedData);
  39. return set({ data, json: decompressedData ?? undefined, loading: false });
  40. }
  41. }
  42. }
  43. useGraph.getState().setGraph(defaultJson);
  44. set({ json: defaultJson, loading: false });
  45. },
  46. setJson: json => {
  47. useGraph.getState().setGraph(json);
  48. set({ json, hasChanges: true });
  49. },
  50. setError: (hasError: boolean) => set({ hasError }),
  51. setHasChanges: (hasChanges: boolean) => set({ hasChanges }),
  52. }));
  53. export default useJson;