1 |
|
2 |
|
3 | import * as React from 'react'
|
4 | import {shallowEqualObjects} from 'shallow-equal'
|
5 | import {createGenerateId} from 'jss'
|
6 | import JssContext from './JssContext'
|
7 |
|
8 | const initialContext = {}
|
9 |
|
10 | export 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 |
|
25 |
|
26 | if (registry !== registryRef.current) {
|
27 |
|
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 | }
|