@@ -20,13 +20,6 @@ const useEffectOrLayoutEffect = isInBrowser ? React.useLayoutEffect : React.useE
2020
2121const noTheme = { }
2222
23- const reducer = ( prevState , action ) => {
24- if ( action . type === 'updateSheet' ) {
25- return action . payload
26- }
27- return prevState
28- }
29-
3023const createUseStyles = < Theme : { } > (styles: Styles< Theme > , options?: HookOptions< Theme > = { } ) => {
3124 const { index = getSheetIndex ( ) , theming, name, ...sheetOptions } = options
3225 const ThemeContext = ( theming && theming . context ) || DefaultThemeContext
@@ -42,111 +35,75 @@ const createUseStyles = <Theme: {}>(styles: Styles<Theme>, options?: HookOptions
4235 const context = React . useContext ( JssContext )
4336 const theme = useTheme ( )
4437
45- const [ state , dispatch ] = React . useReducer ( reducer , null , ( ) => {
46- const sheet = createStyleSheet ( {
47- context,
48- styles,
49- name,
50- theme,
51- index,
52- sheetOptions
53- } )
54-
55- let dynamicRules
56- let classes
57- if ( sheet ) {
58- if ( context . registry ) {
59- context . registry . add ( sheet )
60- }
61- dynamicRules = addDynamicRules ( sheet , data )
62- classes = getSheetClasses ( sheet , dynamicRules )
63- }
64-
65- return {
66- sheet,
67- dynamicRules,
68- classes : classes || { }
69- }
70- } )
71-
72- useEffectOrLayoutEffect (
38+ const [ sheet , dynamicRules ] = React . useMemo (
7339 ( ) => {
74- if ( state . sheet ) {
40+ const newSheet = createStyleSheet ( {
41+ context,
42+ styles,
43+ name,
44+ theme,
45+ index,
46+ sheetOptions
47+ } )
48+
49+ const newDynamicRules = newSheet ? addDynamicRules ( newSheet , data ) : null
50+
51+ if ( newSheet ) {
7552 manageSheet ( {
7653 index,
7754 context,
78- sheet : state . sheet ,
55+ sheet : newSheet ,
7956 theme
8057 } )
8158 }
8259
83- return ( ) => {
84- const { sheet, dynamicRules} = state
85-
86- if ( ! sheet ) return
87-
88- unmanageSheet ( {
89- index,
90- context,
91- sheet,
92- theme
93- } )
94-
95- if ( dynamicRules ) {
96- removeDynamicRules ( sheet , dynamicRules )
97- }
98- }
60+ return [ newSheet , newDynamicRules ]
9961 } ,
100- [ state . sheet ]
62+ [ context , theme ]
10163 )
10264
10365 useEffectOrLayoutEffect (
10466 ( ) => {
10567 // We only need to update the rules on a subsequent update and not in the first mount
106- if ( state . sheet && state . dynamicRules && ! isFirstMount . current ) {
107- updateDynamicRules ( data , state . sheet , state . dynamicRules )
68+ if ( sheet && dynamicRules && ! isFirstMount . current ) {
69+ updateDynamicRules ( data , sheet , dynamicRules )
10870 }
10971 } ,
11072 [ data ]
11173 )
11274
11375 useEffectOrLayoutEffect (
114- ( ) => {
115- if ( ! isFirstMount . current ) {
116- const newSheet = createStyleSheet ( {
117- context,
118- styles,
119- name,
120- theme,
121- index,
122- sheetOptions
123- } )
124- const newDynamicRules = newSheet && addDynamicRules ( newSheet , data )
125- const newClasses = newSheet ? getSheetClasses ( newSheet , newDynamicRules ) : { }
126-
127- dispatch ( {
128- type : 'updateSheet' ,
129- payload : {
130- sheet : newSheet ,
131- dynamicRules : newDynamicRules ,
132- classes : newClasses
133- }
134- } )
135- }
136- } ,
137- [ theme , context ]
76+ ( ) =>
77+ // cleanup only
78+ ( ) => {
79+ if ( sheet ) {
80+ unmanageSheet ( {
81+ index,
82+ context,
83+ sheet,
84+ theme
85+ } )
86+ }
87+
88+ if ( sheet && dynamicRules ) {
89+ removeDynamicRules ( sheet , dynamicRules )
90+ }
91+ } ,
92+ [ sheet ]
13893 )
13994
95+ const classes = sheet && dynamicRules ? getSheetClasses ( sheet , dynamicRules ) : { }
96+
14097 // $FlowFixMe
141- React . useDebugValue ( state . classes )
98+ React . useDebugValue ( classes )
14299 // $FlowFixMe
143100 React . useDebugValue ( theme === noTheme ? 'No theme' : theme )
144101
145102 React . useEffect ( ( ) => {
146103 isFirstMount . current = false
147104 } )
148105
149- return state . classes
106+ return classes
150107 }
151108}
152109
0 commit comments