UNPKG

4.77 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.observer = void 0;
4var react_1 = require("react");
5var staticRendering_1 = require("./staticRendering");
6var useObserver_1 = require("./useObserver");
7var warnObserverOptionsDeprecated = true;
8var hasSymbol = typeof Symbol === "function" && Symbol.for;
9// Using react-is had some issues (and operates on elements, not on types), see #608 / #609
10var ReactForwardRefSymbol = hasSymbol
11 ? Symbol.for("react.forward_ref")
12 : typeof react_1.forwardRef === "function" && (0, react_1.forwardRef)(function (props) { return null; })["$$typeof"];
13var ReactMemoSymbol = hasSymbol
14 ? Symbol.for("react.memo")
15 : typeof react_1.memo === "function" && (0, react_1.memo)(function (props) { return null; })["$$typeof"];
16// n.b. base case is not used for actual typings or exported in the typing files
17function observer(baseComponent,
18// TODO remove in next major
19options) {
20 var _a;
21 if (process.env.NODE_ENV !== "production" && warnObserverOptionsDeprecated && options) {
22 warnObserverOptionsDeprecated = false;
23 console.warn("[mobx-react-lite] `observer(fn, { forwardRef: true })` is deprecated, use `observer(React.forwardRef(fn))`");
24 }
25 if (ReactMemoSymbol && baseComponent["$$typeof"] === ReactMemoSymbol) {
26 throw new Error("[mobx-react-lite] You are trying to use `observer` on a function component wrapped in either another `observer` or `React.memo`. The observer already applies 'React.memo' for you.");
27 }
28 // The working of observer is explained step by step in this talk: https://www.youtube.com/watch?v=cPF4iBedoF0&feature=youtu.be&t=1307
29 if ((0, staticRendering_1.isUsingStaticRendering)()) {
30 return baseComponent;
31 }
32 var useForwardRef = (_a = options === null || options === void 0 ? void 0 : options.forwardRef) !== null && _a !== void 0 ? _a : false;
33 var render = baseComponent;
34 var baseComponentName = baseComponent.displayName || baseComponent.name;
35 // If already wrapped with forwardRef, unwrap,
36 // so we can patch render and apply memo
37 if (ReactForwardRefSymbol && baseComponent["$$typeof"] === ReactForwardRefSymbol) {
38 useForwardRef = true;
39 render = baseComponent["render"];
40 if (typeof render !== "function") {
41 throw new Error("[mobx-react-lite] `render` property of ForwardRef was not a function");
42 }
43 }
44 var observerComponent = function (props, ref) {
45 return (0, useObserver_1.useObserver)(function () { return render(props, ref); }, baseComponentName);
46 };
47 // Don't set `displayName` for anonymous components,
48 // so the `displayName` can be customized by user, see #3192.
49 if (baseComponentName !== "") {
50 ;
51 observerComponent.displayName = baseComponentName;
52 }
53 // Support legacy context: `contextTypes` must be applied before `memo`
54 if (baseComponent.contextTypes) {
55 ;
56 observerComponent.contextTypes = baseComponent.contextTypes;
57 }
58 if (useForwardRef) {
59 // `forwardRef` must be applied prior `memo`
60 // `forwardRef(observer(cmp))` throws:
61 // "forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))"
62 observerComponent = (0, react_1.forwardRef)(observerComponent);
63 }
64 // memo; we are not interested in deep updates
65 // in props; we assume that if deep objects are changed,
66 // this is in observables, which would have been tracked anyway
67 observerComponent = (0, react_1.memo)(observerComponent);
68 copyStaticProperties(baseComponent, observerComponent);
69 if ("production" !== process.env.NODE_ENV) {
70 Object.defineProperty(observerComponent, "contextTypes", {
71 set: function () {
72 var _a;
73 throw new Error("[mobx-react-lite] `".concat(this.displayName || ((_a = this.type) === null || _a === void 0 ? void 0 : _a.displayName) || "Component", ".contextTypes` must be set before applying `observer`."));
74 }
75 });
76 }
77 return observerComponent;
78}
79exports.observer = observer;
80// based on https://github.com/mridgway/hoist-non-react-statics/blob/master/src/index.js
81var hoistBlackList = {
82 $$typeof: true,
83 render: true,
84 compare: true,
85 type: true,
86 // Don't redefine `displayName`,
87 // it's defined as getter-setter pair on `memo` (see #3192).
88 displayName: true
89};
90function copyStaticProperties(base, target) {
91 Object.keys(base).forEach(function (key) {
92 if (!hoistBlackList[key]) {
93 Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(base, key));
94 }
95 });
96}
97//# sourceMappingURL=observer.js.map
\No newline at end of file