UNPKG

2.23 kBJavaScriptView Raw
1/* eslint-disable react/prop-types */
2
3import * as React from 'react'
4import {shallowEqualObjects} from 'shallow-equal'
5import {createGenerateId} from 'jss'
6import JssContext from './JssContext'
7
8const initialContext = {}
9
10export default function JssProvider(props) {
11 const managersRef = React.useRef({})
12 const prevContextRef = React.useRef()
13 const registryRef = React.useRef(null)
14
15 const createContext = (parentContext, prevContext = initialContext) => {
16 const {registry, classNamePrefix, jss, generateId, disableStylesGeneration, media, id, isSSR} =
17 props
18
19 const context = {...parentContext}
20
21 if (registry) {
22 context.registry = registry
23
24 // This way we identify a new request on the server, because user will create
25 // a new Registry instance for each.
26 if (registry !== registryRef.current) {
27 // We reset managers because we have to regenerate all sheets for the new request.
28 managersRef.current = {}
29 registryRef.current = registry
30 }
31 }
32
33 context.managers = managersRef.current
34
35 if (id !== undefined) {
36 context.id = id
37 }
38
39 if (generateId !== undefined) {
40 context.generateId = generateId
41 } else if (!context.generateId || !prevContext || context.id !== prevContext.id) {
42 context.generateId = createGenerateId(context.id)
43 }
44
45 if (classNamePrefix) {
46 context.classNamePrefix = (context.classNamePrefix || '') + classNamePrefix
47 }
48
49 if (media !== undefined) {
50 context.media = media
51 }
52
53 if (jss) {
54 context.jss = jss
55 }
56
57 if (disableStylesGeneration !== undefined) {
58 context.disableStylesGeneration = disableStylesGeneration
59 }
60
61 if (isSSR !== undefined) {
62 context.isSSR = isSSR
63 }
64
65 if (prevContext && shallowEqualObjects(prevContext, context)) {
66 return prevContext
67 }
68
69 return context
70 }
71
72 const renderProvider = (parentContext) => {
73 const {children} = props
74 const context = createContext(parentContext, prevContextRef.current)
75 prevContextRef.current = context
76 return <JssContext.Provider value={context}>{children}</JssContext.Provider>
77 }
78
79 return <JssContext.Consumer>{renderProvider}</JssContext.Consumer>
80}