Skip to content

Commit c40e67c

Browse files
authored
feat(JssProvider): provide custom isSSR flag (#1610)
* jss provider accepts isSSR * size snapshot
1 parent 36b6a2c commit c40e67c

8 files changed

Lines changed: 38 additions & 27 deletions

File tree

packages/react-jss/.size-snapshot.json

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
{
22
"react-jss.js": {
3-
"bundled": 136053,
4-
"minified": 50140,
5-
"gzipped": 16739
3+
"bundled": 136245,
4+
"minified": 50224,
5+
"gzipped": 16773
66
},
77
"react-jss.min.js": {
8-
"bundled": 103003,
9-
"minified": 39999,
10-
"gzipped": 13855
8+
"bundled": 103195,
9+
"minified": 40083,
10+
"gzipped": 13886
1111
},
1212
"react-jss.cjs.js": {
13-
"bundled": 21581,
14-
"minified": 9508,
15-
"gzipped": 3183
13+
"bundled": 21759,
14+
"minified": 9601,
15+
"gzipped": 3220
1616
},
1717
"react-jss.esm.js": {
18-
"bundled": 19703,
19-
"minified": 8047,
20-
"gzipped": 2975,
18+
"bundled": 19855,
19+
"minified": 8114,
20+
"gzipped": 3000,
2121
"treeshaked": {
2222
"rollup": {
23-
"code": 426,
24-
"import_statements": 368
23+
"code": 442,
24+
"import_statements": 375
2525
},
2626
"webpack": {
27-
"code": 1967
27+
"code": 1922
2828
}
2929
}
3030
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import * as React from 'react'
2+
import isInBrowser from 'is-in-browser'
23

34
export default React.createContext({
45
classNamePrefix: '',
5-
disableStylesGeneration: false
6+
disableStylesGeneration: false,
7+
isSSR: !isInBrowser
68
})

packages/react-jss/src/JssProvider.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export default function JssProvider(props) {
1313
const registryRef = React.useRef(null)
1414

1515
const createContext = (parentContext, prevContext = initialContext) => {
16-
const {registry, classNamePrefix, jss, generateId, disableStylesGeneration, media, id} = props
16+
const {registry, classNamePrefix, jss, generateId, disableStylesGeneration, media, id, isSSR} =
17+
props
1718

1819
const context = {...parentContext}
1920

@@ -57,6 +58,10 @@ export default function JssProvider(props) {
5758
context.disableStylesGeneration = disableStylesGeneration
5859
}
5960

61+
if (isSSR !== undefined) {
62+
context.isSSR = isSSR
63+
}
64+
6065
if (prevContext && shallowEqualObjects(prevContext, context)) {
6166
return prevContext
6267
}

packages/react-jss/src/createUseStyles.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as React from 'react'
2-
import isInBrowser from 'is-in-browser'
32
import {ThemeContext as DefaultThemeContext} from 'theming'
43

54
import JssContext from './JssContext'
@@ -13,10 +12,12 @@ import getSheetIndex from './utils/getSheetIndex'
1312
import {manageSheet, unmanageSheet} from './utils/managers'
1413
import getSheetClasses from './utils/getSheetClasses'
1514

16-
const useInsertionEffect = isInBrowser
17-
? React.useInsertionEffect || // React 18+ (https://github.com/reactwg/react-18/discussions/110)
18-
React.useLayoutEffect
19-
: React.useEffect
15+
function getUseInsertionEffect(isSSR) {
16+
return isSSR
17+
? React.useEffect
18+
: React.useInsertionEffect || // React 18+ (https://github.com/reactwg/react-18/discussions/110)
19+
React.useLayoutEffect
20+
}
2021

2122
const noTheme = {}
2223

@@ -61,14 +62,14 @@ const createUseStyles = (styles, options = {}) => {
6162
return [newSheet, newSheet ? addDynamicRules(newSheet, data) : null]
6263
}, [context, theme])
6364

64-
useInsertionEffect(() => {
65+
getUseInsertionEffect(context.isSSR)(() => {
6566
// We only need to update the rules on a subsequent update and not in the first mount
6667
if (sheet && dynamicRules && !isFirstMount.current) {
6768
updateDynamicRules(data, sheet, dynamicRules)
6869
}
6970
}, [data])
7071

71-
useInsertionEffect(
72+
getUseInsertionEffect(context.isSSR)(
7273
() => () => {
7374
if (sheet) {
7475
unmanageSheet({

packages/react-jss/src/createUseStyles.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ describe('React-JSS: createUseStyles', () => {
3434
const MyComponent = createStyledComponent(styles)
3535

3636
renderToString(
37-
<JssProvider registry={registry} generateId={() => 'button'}>
37+
<JssProvider registry={registry} generateId={() => 'button'} isSSR>
3838
<MyComponent theme={{exampleColor: 'blue'}} />
3939
</JssProvider>
4040
)

packages/react-jss/src/flow-types.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export type Context = {|
3636
disableStylesGeneration?: boolean,
3737
media?: string,
3838
generateId?: GenerateId
39+
isSSR?: boolean
3940
|}
4041

4142
export type HOCProps<Theme, Props> = Props & {

packages/react-jss/src/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ declare const JssProvider: ComponentType<{
2323
disableStylesGeneration?: boolean
2424
children: ReactNode
2525
id?: CreateGenerateIdOptions
26+
isSSR?: boolean
2627
}>
2728

2829
interface Managers {
@@ -35,6 +36,7 @@ declare const JssContext: Context<{
3536
managers?: Managers
3637
sheetOptions: StyleSheetFactoryOptions
3738
disableStylesGeneration: boolean
39+
isSSR: boolean
3840
}>
3941

4042
type ClassesForStyles<

packages/react-jss/test-utils/createCommonBaseTests.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default ({createStyledComponent}) => {
5757
})
5858
const generateId = () => 'id'
5959
renderToString(
60-
<JssProvider registry={registry} generateId={generateId}>
60+
<JssProvider registry={registry} generateId={generateId} isSSR>
6161
<MyComponent />
6262
</JssProvider>
6363
)
@@ -81,7 +81,7 @@ export default ({createStyledComponent}) => {
8181
options
8282
)
8383
renderToString(
84-
<JssProvider registry={registry}>
84+
<JssProvider registry={registry} isSSR>
8585
<MyComponent />
8686
</JssProvider>
8787
)

0 commit comments

Comments
 (0)