Skip to content

Commit d10ebc0

Browse files
feat: implement new helper function to keep param state in sync (#732)
1 parent 9e90103 commit d10ebc0

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

apps/dojo/src/contexts/url-params-context.tsx

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,27 @@ interface URLParamsProviderProps {
3434
children: ReactNode;
3535
}
3636

37-
export function URLParamsProvider({ children }: URLParamsProviderProps) {
38-
const router = useRouter();
39-
const pathname = usePathname();
40-
const searchParams = useSearchParams();
41-
42-
// Initialize state from URL params
43-
const [state, setState] = useState<URLParamsState>(() => ({
37+
function generateURLParamsState(searchParams: URLSearchParams): URLParamsState {
38+
return {
4439
view: (searchParams.get("view") as View) || "preview",
4540
sidebarHidden: searchParams.get("sidebar") === "false",
4641
chatDefaultOpen: searchParams.get("chatDefaultOpen") !== "false",
4742
frameworkPickerHidden: searchParams.get("frameworkPicker") === "false",
4843
viewPickerHidden: searchParams.get("viewPicker") === "false",
4944
featurePickerHidden: searchParams.get("featurePicker") === "false",
45+
file: searchParams.get("file") || undefined,
5046
codeLayout: (searchParams.get("codeLayout") as "sidebar" | "tabs") || "sidebar",
5147
theme: (searchParams.get("theme") as "light" | "dark") || "light",
52-
}));
48+
};
49+
}
50+
51+
export function URLParamsProvider({ children }: URLParamsProviderProps) {
52+
const router = useRouter();
53+
const pathname = usePathname();
54+
const searchParams = useSearchParams();
55+
56+
// Initialize state from URL params
57+
const [state, setState] = useState<URLParamsState>(() => generateURLParamsState(searchParams));
5358

5459
// Update URL when state changes
5560
const updateURL = (newState: Partial<URLParamsState>) => {
@@ -137,17 +142,7 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
137142

138143
// Sync state with URL changes (e.g., browser back/forward)
139144
useEffect(() => {
140-
const newState: URLParamsState = {
141-
view: (searchParams.get("view") as View) || "preview",
142-
sidebarHidden: searchParams.get("sidebar") === "false",
143-
chatDefaultOpen: searchParams.get("chatDefaultOpen") !== "false",
144-
frameworkPickerHidden: searchParams.get("frameworkPicker") === "false",
145-
viewPickerHidden: searchParams.get("viewPicker") === "false",
146-
featurePickerHidden: searchParams.get("featurePicker") === "false",
147-
file: searchParams.get("file") || undefined,
148-
codeLayout: (searchParams.get("codeLayout") as "sidebar" | "tabs") || "sidebar",
149-
theme: (searchParams.get("theme") as "light" | "dark") || "light",
150-
};
145+
const newState: URLParamsState = generateURLParamsState(searchParams);
151146

152147
setState(newState);
153148
}, [searchParams]);

0 commit comments

Comments
 (0)