-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
RelayTestRenderer.js
82 lines (67 loc) · 2.22 KB
/
RelayTestRenderer.js
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
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
* @flow strict-local
*/
'use strict';
const React = require('react');
const ReactRelayContext = require('../ReactRelayContext');
const invariant = require('invariant');
const {createOperationDescriptor, getRequest} = require('relay-runtime');
import type {Variables, Snapshot} from 'relay-runtime';
type Props = {
environment: $FlowFixMe,
query: $FlowFixMe,
variables: Variables,
children: React.Element<$FlowFixMe>,
};
class RelayTestRenderer extends React.Component<Props, $FlowFixMe> {
constructor(props: Props) {
super(props);
invariant(
React.Children.count(this.props.children) === 1,
'Expected only a single child to be passed to `RelayTestContainer`',
);
invariant(
React.isValidElement(this.props.children),
'Expected child of `RelayTestContainer` to be a React element',
);
const {query, environment, variables} = props;
const operation = getRequest((query: $FlowFixMe));
const operationDescriptor = createOperationDescriptor(operation, variables);
const snapshot = environment.lookup(
operationDescriptor.fragment,
operationDescriptor,
);
this.state = {data: snapshot.data};
environment.subscribe(snapshot, this._onChange);
}
_onChange = (snapshot: Snapshot): void => {
this.setState({data: snapshot.data});
};
render(): React.Element<typeof ReactRelayContext.Provider> {
const childProps = this.props.children.props;
const newProps = {...childProps, ...this.state.data};
return (
<ReactRelayContext.Provider
value={{
environment:
this.props.environment || this.props.children.props.environment,
variables:
this.props.variables || this.props.children.props.variables,
}}>
{React.cloneElement(
this.props.children,
newProps,
// $FlowFixMe: error found when enabling flow for this file.
this.props.children.children,
)}
</ReactRelayContext.Provider>
);
}
}
module.exports = RelayTestRenderer;