@@ -5,6 +5,7 @@ import {createContext, useState} from 'react';
55import { Key } from 'react-aria-components' ;
66import { style } from '@react-spectrum/s2/style' with { type : 'macro' } ;
77import { useLayoutEffect } from '@react-aria/utils' ;
8+ import { useLocalStorage } from './useLocalStorage' ;
89
910const exampleStyle = style ( {
1011 backgroundColor : 'layer-1' ,
@@ -59,66 +60,35 @@ const themePicker = style({
5960
6061export const ExampleSwitcherContext = createContext < Key | null > ( null ) ;
6162
62- const DEFAULT_EXAMPLES = [ 'Vanilla CSS' , 'Tailwind' ] as Key [ ] ;
63+ const DEFAULT_EXAMPLES = [ 'Vanilla CSS' , 'Tailwind' ] ;
6364
6465export function ExampleSwitcher ( { type = 'style' , examples = DEFAULT_EXAMPLES , children} ) {
65- let [ selected , setSelected ] = useState < Key > ( examples [ 0 ] ) ;
66- let [ theme , setTheme ] = useState ( 'indigo' ) ;
66+ let [ selected , setSelected ] = useLocalStorage ( type , examples [ 0 ] ) ;
67+ let [ theme , setTheme ] = useLocalStorage ( 'theme' , 'indigo' ) ;
68+ let [ value , setValue ] = useState ( examples [ 0 ] ) ;
6769
68- useLayoutEffect ( ( ) => {
69- if ( ! type ) {
70- return ;
71- }
72-
73- let search = new URLSearchParams ( location . search ) ;
74- let exampleType = search . get ( type ) ?? localStorage . getItem ( type ) ;
75- if ( exampleType && examples . includes ( exampleType ) ) {
76- setSelected ( exampleType ) ;
77- }
78-
79- let theme = localStorage . getItem ( 'theme' ) ;
80- if ( theme ) {
81- setTheme ( theme ) ;
82- }
83-
84- let controller = new AbortController ( ) ;
85- window . addEventListener ( 'storage' , e => {
86- if ( e . key === type && e . newValue && examples . includes ( e . newValue ) ) {
87- setSelected ( e . newValue ) ;
88- }
70+ if ( ! examples . includes ( selected ) ) {
71+ selected = examples [ 0 ] ;
72+ }
8973
90- if ( e . key === 'theme' && e . newValue ) {
91- setTheme ( e . newValue ) ;
92- }
93- } , { signal : controller . signal } ) ;
94- return ( ) => controller . abort ( ) ;
95- } , [ type , examples ] ) ;
74+ if ( ! type ) {
75+ selected = value ;
76+ }
9677
9778 useLayoutEffect ( ( ) => {
9879 document . documentElement . style . setProperty ( '--tint' , `var(--${ theme } )` ) ;
9980 } , [ theme ] ) ;
10081
101- let onSelectionChange = key => {
102- setSelected ( key ) ;
103-
82+ let onSelectionChange = ( key : Key ) => {
10483 if ( type ) {
105- localStorage . setItem ( type , key ) ;
106- window . dispatchEvent ( new StorageEvent ( 'storage' , {
107- key : type ,
108- oldValue : String ( selected ) ,
109- newValue : String ( key )
110- } ) ) ;
84+ setSelected ( String ( key ) ) ;
85+ } else {
86+ setValue ( String ( key ) ) ;
11187 }
11288 } ;
11389
114- let onThemeChange = key => {
115- setTheme ( key ) ;
116- localStorage . setItem ( 'theme' , key ) ;
117- window . dispatchEvent ( new StorageEvent ( 'storage' , {
118- key : 'theme' ,
119- oldValue : String ( theme ) ,
120- newValue : String ( key )
121- } ) ) ;
90+ let onThemeChange = ( key : Key | null ) => {
91+ setTheme ( String ( key ) ) ;
12292 } ;
12393
12494 return (
0 commit comments