From bf4f83f31c76d839a8e8ee6ce317f7c93b9e50de Mon Sep 17 00:00:00 2001 From: Brandon McConnell Date: Mon, 24 Nov 2025 09:03:44 -0500 Subject: [PATCH] feat: implement new helper function to keep param state in sync --- apps/dojo/src/contexts/url-params-context.tsx | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/apps/dojo/src/contexts/url-params-context.tsx b/apps/dojo/src/contexts/url-params-context.tsx index ac062155b..f3644cc82 100644 --- a/apps/dojo/src/contexts/url-params-context.tsx +++ b/apps/dojo/src/contexts/url-params-context.tsx @@ -34,22 +34,27 @@ interface URLParamsProviderProps { children: ReactNode; } -export function URLParamsProvider({ children }: URLParamsProviderProps) { - const router = useRouter(); - const pathname = usePathname(); - const searchParams = useSearchParams(); - - // Initialize state from URL params - const [state, setState] = useState(() => ({ +function generateURLParamsState(searchParams: URLSearchParams): URLParamsState { + return { view: (searchParams.get("view") as View) || "preview", sidebarHidden: searchParams.get("sidebar") === "false", chatDefaultOpen: searchParams.get("chatDefaultOpen") !== "false", frameworkPickerHidden: searchParams.get("frameworkPicker") === "false", viewPickerHidden: searchParams.get("viewPicker") === "false", featurePickerHidden: searchParams.get("featurePicker") === "false", + file: searchParams.get("file") || undefined, codeLayout: (searchParams.get("codeLayout") as "sidebar" | "tabs") || "sidebar", theme: (searchParams.get("theme") as "light" | "dark") || "light", - })); + }; +} + +export function URLParamsProvider({ children }: URLParamsProviderProps) { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + + // Initialize state from URL params + const [state, setState] = useState(() => generateURLParamsState(searchParams)); // Update URL when state changes const updateURL = (newState: Partial) => { @@ -137,17 +142,7 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) { // Sync state with URL changes (e.g., browser back/forward) useEffect(() => { - const newState: URLParamsState = { - view: (searchParams.get("view") as View) || "preview", - sidebarHidden: searchParams.get("sidebar") === "false", - chatDefaultOpen: searchParams.get("chatDefaultOpen") !== "false", - frameworkPickerHidden: searchParams.get("frameworkPicker") === "false", - viewPickerHidden: searchParams.get("viewPicker") === "false", - featurePickerHidden: searchParams.get("featurePicker") === "false", - file: searchParams.get("file") || undefined, - codeLayout: (searchParams.get("codeLayout") as "sidebar" | "tabs") || "sidebar", - theme: (searchParams.get("theme") as "light" | "dark") || "light", - }; + const newState: URLParamsState = generateURLParamsState(searchParams); setState(newState); }, [searchParams]);