context.js
2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// @flow
import { isBrowser, type CSSContextType } from '@emotion/utils'
import * as React from 'react'
import createCache from '@emotion/cache'
let CSSContext = React.createContext(isBrowser ? createCache() : null)
export let Provider = CSSContext.Provider
let withCSSContext = function withCSSContext<Props>(
func: (props: Props, context: CSSContextType) => React.Node
): React.StatelessFunctionalComponent<Props> {
return (props: Props) => (
<CSSContext.Consumer>
{(
// $FlowFixMe we know it won't be null
context: CSSContextType
) => {
return func(props, context)
}}
</CSSContext.Consumer>
)
}
let consume = (func: CSSContextType => React.Node) => {
return (
<CSSContext.Consumer>
{
// $FlowFixMe we know it won't be null
func
}
</CSSContext.Consumer>
)
}
if (!isBrowser) {
class BasicProvider extends React.Component<
{ children: CSSContextType => React.Node },
{ value: CSSContextType }
> {
state = { value: createCache() }
render() {
return (
<CSSContext.Provider {...this.state}>
{process.env.PREACT
? // $FlowFixMe
this.props.children[0](this.state.value)
: this.props.children(this.state.value)}
</CSSContext.Provider>
)
}
}
withCSSContext = function withCSSContext<Props>(
func: (props: Props, context: CSSContextType) => React.Node
): React.StatelessFunctionalComponent<Props> {
return (props: Props) => (
<CSSContext.Consumer>
{context => {
if (context === null) {
return (
<BasicProvider>
{newContext => {
return func(props, newContext)
}}
</BasicProvider>
)
} else {
return func(props, context)
}
}}
</CSSContext.Consumer>
)
}
consume = (func: CSSContextType => React.Node) => {
return (
<CSSContext.Consumer>
{context => {
if (context === null) {
return (
<BasicProvider>
{newContext => {
return func(newContext)
}}
</BasicProvider>
)
} else {
return func(context)
}
}}
</CSSContext.Consumer>
)
}
}
export { consume, withCSSContext }