@@ -3,26 +3,88 @@ const choices = [ReactRouterExample, ReachRouterExample].reduce(
33 { }
44)
55
6+ function usePersistentState ( initializer , key ) {
7+ const result = React . useState (
8+ JSON . parse ( sessionStorage . getItem ( key ) || 'null' ) || initializer
9+ )
10+
11+ React . useEffect ( ( ) => {
12+ sessionStorage . setItem ( key , JSON . stringify ( result [ 0 ] ) )
13+ } , [ key , result ] )
14+
15+ return result
16+ }
17+
618function Example ( ) {
7- const [ choice , setChoice ] = React . useState ( Object . keys ( choices ) [ 0 ] )
19+ const [ choice , setChoice ] = usePersistentState (
20+ Object . keys ( choices ) [ 0 ] ,
21+ 'choice'
22+ )
23+ const [ maxHistoryLength , setMaxHistoryLength ] = usePersistentState (
24+ 2 ,
25+ 'maxHistoryLength'
26+ )
27+ const [ persist , setPersist ] = usePersistentState ( false , 'persist' )
28+ const [ debug , setDebug ] = usePersistentState ( false , 'debug' )
829
930 const Component = choices [ choice ]
1031
11- function handleChange ( e ) {
32+ function handleExampleChange ( e ) {
1233 window . history . pushState ( null , null , '/' )
1334 setChoice ( e . target . value )
1435 }
1536
1637 return (
1738 < div >
18- < select value = { choice } onChange = { handleChange } >
19- { Object . keys ( choices ) . map ( c => (
20- < option key = { c } > { c } </ option >
21- ) ) }
22- </ select >
39+ < fieldset >
40+ < div >
41+ < select value = { choice } onChange = { handleExampleChange } >
42+ { Object . keys ( choices ) . map ( c => (
43+ < option key = { c } > { c } </ option >
44+ ) ) }
45+ </ select >
46+ </ div >
47+ < div >
48+ < label >
49+ < span > max history length </ span >
50+ < input
51+ type = "number"
52+ value = { maxHistoryLength }
53+ onChange = { e => setMaxHistoryLength ( + e . target . value ) }
54+ />
55+ </ label >
56+ </ div >
57+ < div >
58+ < label >
59+ < span > persist </ span >
60+ < input
61+ type = "checkbox"
62+ checked = { persist }
63+ onChange = { ( ) => setPersist ( p => ! p ) }
64+ />
65+ { persist && < span > open the console</ span > }
66+ </ label >
67+ </ div >
68+ < div >
69+ < label >
70+ < span > debug </ span >
71+ < input
72+ type = "checkbox"
73+ checked = { debug }
74+ onChange = { ( ) => setDebug ( d => ! d ) }
75+ />
76+ { debug && < span > open the console!</ span > }
77+ </ label >
78+ </ div >
79+ </ fieldset >
80+
2381 < div style = { { display : 'flex' } } >
2482 < div style = { { flex : 0.5 } } >
25- < Component />
83+ < Component
84+ maxHistoryLength = { maxHistoryLength }
85+ persist = { persist }
86+ debug = { debug }
87+ />
2688 </ div >
2789 < div style = { { flex : 1 , marginLeft : '3rem' } } >
2890 < Source fileName = { choice } />
0 commit comments