UNPKG

2.45 kBJavaScriptView Raw
1/**
2 * Copyright (c) Facebook, Inc. and its affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 *
8 * @format
9 */
10// flowlint ambiguous-object-type:error
11'use strict';
12
13var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
15var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
16
17var React = require('react');
18
19var ReactRelayContext = require('./ReactRelayContext');
20
21var assertFragmentMap = require('./assertFragmentMap');
22
23var invariant = require("fbjs/lib/invariant");
24
25var mapObject = require("fbjs/lib/mapObject");
26
27var readContext = require('./readContext');
28
29var _require = require('./ReactRelayContainerUtils'),
30 getComponentName = _require.getComponentName,
31 getContainerName = _require.getContainerName;
32
33var _require2 = require('relay-runtime'),
34 getFragment = _require2.getFragment;
35
36/**
37 * Helper to create the Relay HOCs with ref forwarding, setting the displayName
38 * and reading the React context.
39 */
40function buildReactRelayContainer(ComponentClass, fragmentSpec, createContainerWithFragments) {
41 // Sanity-check user-defined fragment input
42 var containerName = getContainerName(ComponentClass);
43 assertFragmentMap(getComponentName(ComponentClass), fragmentSpec);
44 var fragments = mapObject(fragmentSpec, getFragment);
45 var Container = createContainerWithFragments(ComponentClass, fragments);
46 Container.displayName = containerName;
47
48 function forwardRef(props, ref) {
49 var context = readContext(ReactRelayContext);
50 !(context != null) ? process.env.NODE_ENV !== "production" ? invariant(false, '`%s` tried to render a context that was not valid this means that ' + '`%s` was rendered outside of a query renderer.', containerName, containerName) : invariant(false) : void 0;
51 return /*#__PURE__*/React.createElement(Container, (0, _extends2["default"])({}, props, {
52 __relayContext: context,
53 componentRef: props.componentRef || ref
54 }));
55 }
56
57 forwardRef.displayName = containerName;
58 var ForwardContainer = React.forwardRef(forwardRef);
59
60 if (process.env.NODE_ENV !== "production") {
61 // Used by RelayModernTestUtils
62 ForwardContainer.__ComponentClass = ComponentClass;
63 ForwardContainer.displayName = containerName;
64 } // $FlowFixMe[incompatible-return]
65
66
67 return ForwardContainer;
68}
69
70module.exports = buildReactRelayContainer;
\No newline at end of file