1
- ' use client' ;
1
+ " use client" ;
2
2
3
- import React , { createContext , useContext , useState , useEffect , ReactNode } from ' react' ;
4
- import { useRouter , usePathname , useSearchParams } from ' next/navigation' ;
3
+ import React , { createContext , useContext , useState , useEffect , ReactNode } from " react" ;
4
+ import { useRouter , usePathname , useSearchParams } from " next/navigation" ;
5
5
import { View } from "@/types/interface" ;
6
6
7
7
interface URLParamsState {
@@ -11,6 +11,7 @@ interface URLParamsState {
11
11
viewPickerHidden : boolean ;
12
12
featurePickerHidden : boolean ;
13
13
file ?: string ;
14
+ codeLayout : "sidebar" | "tabs" ;
14
15
}
15
16
16
17
interface URLParamsContextType extends URLParamsState {
@@ -20,6 +21,7 @@ interface URLParamsContextType extends URLParamsState {
20
21
setViewPickerHidden : ( disabled : boolean ) => void ;
21
22
setFeaturePickerHidden : ( disabled : boolean ) => void ;
22
23
setCodeFile : ( fileName : string ) => void ;
24
+ setCodeLayout : ( layout : "sidebar" | "tabs" ) => void ;
23
25
}
24
26
25
27
const URLParamsContext = createContext < URLParamsContextType | undefined > ( undefined ) ;
@@ -40,6 +42,7 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
40
42
frameworkPickerHidden : searchParams . get ( "frameworkPicker" ) === "false" ,
41
43
viewPickerHidden : searchParams . get ( "viewPicker" ) === "false" ,
42
44
featurePickerHidden : searchParams . get ( "featurePicker" ) === "false" ,
45
+ codeLayout : ( searchParams . get ( "codeLayout" ) as "sidebar" | "tabs" ) || "sidebar" ,
43
46
} ) ) ;
44
47
45
48
// Update URL when state changes
@@ -90,8 +93,22 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
90
93
}
91
94
}
92
95
96
+ // Update codeLayout param
97
+ if ( newState . codeLayout !== undefined ) {
98
+ if ( newState . codeLayout === "sidebar" ) {
99
+ params . delete ( "codeLayout" ) ;
100
+ } else {
101
+ params . set ( "codeLayout" , newState . codeLayout ) ;
102
+ }
103
+ }
104
+
105
+ // Update file param
106
+ if ( newState . file !== undefined ) {
107
+ params . set ( "file" , newState . file ) ;
108
+ }
109
+
93
110
const queryString = params . toString ( ) ;
94
- router . push ( pathname + ( queryString ? '?' + queryString : '' ) ) ;
111
+ router . push ( pathname + ( queryString ? "?" + queryString : "" ) ) ;
95
112
} ;
96
113
97
114
// Sync state with URL changes (e.g., browser back/forward)
@@ -102,6 +119,8 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
102
119
frameworkPickerHidden : searchParams . get ( "frameworkPicker" ) === "false" ,
103
120
viewPickerHidden : searchParams . get ( "viewPicker" ) === "false" ,
104
121
featurePickerHidden : searchParams . get ( "featurePicker" ) === "false" ,
122
+ file : searchParams . get ( "file" ) || undefined ,
123
+ codeLayout : ( searchParams . get ( "codeLayout" ) as "sidebar" | "tabs" ) || "sidebar" ,
105
124
} ;
106
125
107
126
setState ( newState ) ;
@@ -144,6 +163,12 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
144
163
updateURL ( { file : fileName } ) ;
145
164
} ;
146
165
166
+ const setCodeLayout = ( codeLayout : "sidebar" | "tabs" ) => {
167
+ const newState = { ...state , codeLayout } ;
168
+ setState ( newState ) ;
169
+ updateURL ( { codeLayout } ) ;
170
+ } ;
171
+
147
172
const contextValue : URLParamsContextType = {
148
173
...state ,
149
174
setView,
@@ -152,19 +177,16 @@ export function URLParamsProvider({ children }: URLParamsProviderProps) {
152
177
setViewPickerHidden,
153
178
setFeaturePickerHidden,
154
179
setCodeFile,
180
+ setCodeLayout,
155
181
} ;
156
182
157
- return (
158
- < URLParamsContext . Provider value = { contextValue } >
159
- { children }
160
- </ URLParamsContext . Provider >
161
- ) ;
183
+ return < URLParamsContext . Provider value = { contextValue } > { children } </ URLParamsContext . Provider > ;
162
184
}
163
185
164
186
export function useURLParams ( ) : URLParamsContextType {
165
187
const context = useContext ( URLParamsContext ) ;
166
188
if ( context === undefined ) {
167
- throw new Error ( ' useURLParams must be used within a URLParamsProvider' ) ;
189
+ throw new Error ( " useURLParams must be used within a URLParamsProvider" ) ;
168
190
}
169
191
return context ;
170
192
}
0 commit comments