Skip to content

Commit d8bc2f7

Browse files
authored
feat: Generate sharable link for code-explorer (#49)
1 parent c1e0d56 commit d8bc2f7

File tree

1 file changed

+52
-21
lines changed

1 file changed

+52
-21
lines changed

src/hooks/use-explorer.ts

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { create } from "zustand";
2-
import { devtools, persist } from "zustand/middleware";
2+
import {
3+
devtools,
4+
persist,
5+
StateStorage,
6+
createJSONStorage,
7+
} from "zustand/middleware";
38
import type { Options } from "espree";
49
import {
510
defaultCode,
@@ -71,37 +76,63 @@ type ExplorerState = {
7176
setPathIndex: (pathIndex: PathIndex) => void;
7277
};
7378

79+
const hashStorage: StateStorage = {
80+
getItem: (key): string => {
81+
const searchParams = new URLSearchParams(location.hash.slice(1));
82+
const storedValue = searchParams.get(key) ?? "";
83+
return storedValue ? JSON.parse(atob(storedValue)) : "";
84+
},
85+
setItem: (key, newValue): void => {
86+
const searchParams = new URLSearchParams(location.hash.slice(1));
87+
const encodedValue = btoa(JSON.stringify(newValue));
88+
searchParams.set(key, encodedValue);
89+
location.hash = searchParams.toString();
90+
},
91+
removeItem: (key): void => {
92+
const searchParams = new URLSearchParams(location.hash.slice(1));
93+
searchParams.delete(key);
94+
location.hash = searchParams.toString();
95+
},
96+
};
97+
7498
export const useExplorer = create<ExplorerState>()(
7599
devtools(
76100
persist(
77-
set => ({
78-
tool: "ast",
79-
setTool: tool => set({ tool }),
101+
persist(
102+
set => ({
103+
tool: "ast",
104+
setTool: tool => set({ tool }),
80105

81-
code: defaultCode,
82-
setCode: code => set({ code }),
106+
code: defaultCode,
107+
setCode: code => set({ code }),
83108

84-
language: "javascript",
85-
setLanguage: language => set({ language }),
109+
language: "javascript",
110+
setLanguage: language => set({ language }),
86111

87-
jsOptions: defaultJsOptions,
88-
setJsOptions: jsOptions => set({ jsOptions }),
112+
jsOptions: defaultJsOptions,
113+
setJsOptions: jsOptions => set({ jsOptions }),
89114

90-
jsonOptions: defaultJsonOptions,
91-
setJsonOptions: jsonOptions => set({ jsonOptions }),
115+
jsonOptions: defaultJsonOptions,
116+
setJsonOptions: jsonOptions => set({ jsonOptions }),
92117

93-
markdownOptions: defaultMarkdownOptions,
94-
setMarkdownOptions: markdownOptions => set({ markdownOptions }),
118+
markdownOptions: defaultMarkdownOptions,
119+
setMarkdownOptions: markdownOptions =>
120+
set({ markdownOptions }),
95121

96-
wrap: true,
97-
setWrap: wrap => set({ wrap }),
122+
wrap: true,
123+
setWrap: wrap => set({ wrap }),
98124

99-
viewModes: defaultViewModes,
100-
setViewModes: viewModes => set({ viewModes }),
125+
viewModes: defaultViewModes,
126+
setViewModes: viewModes => set({ viewModes }),
101127

102-
pathIndex: defaultPathIndex,
103-
setPathIndex: pathIndex => set({ pathIndex }),
104-
}),
128+
pathIndex: defaultPathIndex,
129+
setPathIndex: pathIndex => set({ pathIndex }),
130+
}),
131+
{
132+
name: "eslint-explorer",
133+
storage: createJSONStorage(() => hashStorage),
134+
},
135+
),
105136
{
106137
name: "eslint-explorer",
107138
},

0 commit comments

Comments
 (0)