@webkrafters/react-observable-context 5.0.0-rc.2 → 5.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +17 -4
- package/dist/main/hooks/use-prehooks-ref/index.test.d.ts +0 -1
- package/dist/main/hooks/use-prehooks-ref/index.test.js +0 -21
- package/dist/main/hooks/use-render-key-provider/index.test.d.ts +0 -1
- package/dist/main/hooks/use-render-key-provider/index.test.js +0 -72
- package/dist/main/hooks/use-store/index.test.d.ts +0 -1
- package/dist/main/hooks/use-store/index.test.js +0 -456
- package/dist/main/index.test.d.ts +0 -11
- package/dist/main/index.test.js +0 -1298
- package/dist/main/test-apps/normal.d.ts +0 -36
- package/dist/main/test-apps/normal.js +0 -243
- package/dist/main/test-apps/with-connected-children.d.ts +0 -25
- package/dist/main/test-apps/with-connected-children.js +0 -229
- package/dist/main/test-apps/with-pure-children.d.ts +0 -15
- package/dist/main/test-apps/with-pure-children.js +0 -127
- package/dist/model/storage/index.test.d.ts +0 -1
- package/dist/model/storage/index.test.js +0 -139
- package/dist/test-artifacts/data/create-state-obj.d.ts +0 -58
- package/dist/test-artifacts/data/create-state-obj.js +0 -95
- package/dist/test-artifacts/suppress-render-compat.d.ts +0 -1
- package/dist/test-artifacts/suppress-render-compat.js +0 -7
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { SelectorMap } from '../../index';
|
|
3
|
-
export type TestState = {
|
|
4
|
-
color: string;
|
|
5
|
-
customer: {
|
|
6
|
-
name: {
|
|
7
|
-
first: string;
|
|
8
|
-
last: string;
|
|
9
|
-
};
|
|
10
|
-
phone: string;
|
|
11
|
-
};
|
|
12
|
-
price: number;
|
|
13
|
-
type: string;
|
|
14
|
-
};
|
|
15
|
-
export declare const ObservableContext: import("../../index").ObservableContext<Partial<TestState>>;
|
|
16
|
-
export declare const useObservableContext: <S extends SelectorMap>(selectorMap?: S) => import("../../index").Store<Partial<TestState>, S>;
|
|
17
|
-
export declare const Reset: React.FC;
|
|
18
|
-
export declare const CapitalizedDisplay: React.FC<{
|
|
19
|
-
text: string;
|
|
20
|
-
}>;
|
|
21
|
-
export declare const CustomerPhoneDisplay: React.FC;
|
|
22
|
-
export type Data<SELECTOR_MAP extends SelectorMap = SelectorMap> = {
|
|
23
|
-
[selectorKey in keyof SELECTOR_MAP]: Readonly<unknown>;
|
|
24
|
-
};
|
|
25
|
-
export declare const TallyDisplay: React.FC;
|
|
26
|
-
export declare const Editor: React.FC;
|
|
27
|
-
export declare const ProductDescription: React.FC;
|
|
28
|
-
export declare const PriceSticker: React.FC;
|
|
29
|
-
export declare const Product: React.FC<{
|
|
30
|
-
prehooks?: import("../../index").Prehooks<{
|
|
31
|
-
[x: string]: *;
|
|
32
|
-
}>;
|
|
33
|
-
type: string;
|
|
34
|
-
}>;
|
|
35
|
-
declare const App: React.FC;
|
|
36
|
-
export default App;
|
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.Product = exports.PriceSticker = exports.ProductDescription = exports.Editor = exports.TallyDisplay = exports.CustomerPhoneDisplay = exports.CapitalizedDisplay = exports.Reset = exports.useObservableContext = exports.ObservableContext = void 0;
|
|
30
|
-
const react_1 = __importStar(require("react"));
|
|
31
|
-
const lodash_isempty_1 = __importDefault(require("lodash.isempty"));
|
|
32
|
-
const __1 = require("..");
|
|
33
|
-
exports.ObservableContext = (0, __1.createContext)();
|
|
34
|
-
const useObservableContext = (selectorMap) => (0, __1.useContext)(exports.ObservableContext, selectorMap);
|
|
35
|
-
exports.useObservableContext = useObservableContext;
|
|
36
|
-
const Reset = () => {
|
|
37
|
-
const { resetState } = (0, exports.useObservableContext)();
|
|
38
|
-
(0, react_1.useEffect)(() => console.log('Reset component rendered.....'));
|
|
39
|
-
const reset = (0, react_1.useCallback)(() => resetState(['@@STATE']), [resetState]);
|
|
40
|
-
return (react_1.default.createElement("button", { onClick: reset }, "reset context"));
|
|
41
|
-
};
|
|
42
|
-
exports.Reset = Reset;
|
|
43
|
-
exports.Reset.displayName = 'Reset';
|
|
44
|
-
const CapitalizedDisplay = ({ text }) => {
|
|
45
|
-
(0, react_1.useEffect)(() => console.log(`CapitalizedDisplay( ${text} ) component rendered.....`));
|
|
46
|
-
return text && (react_1.default.createElement(react_1.default.Fragment, null, `${text[0].toUpperCase()}${text.length > 1 ? text.slice(1) : ''}`));
|
|
47
|
-
};
|
|
48
|
-
exports.CapitalizedDisplay = CapitalizedDisplay;
|
|
49
|
-
exports.CapitalizedDisplay.displayName = 'CapitalizedDisplay';
|
|
50
|
-
const CustomerPhoneDisplay = () => {
|
|
51
|
-
const { data } = (0, exports.useObservableContext)({ phone: 'customer.phone' });
|
|
52
|
-
(0, react_1.useEffect)(() => console.log('CustomerPhoneDisplay component rendered.....'));
|
|
53
|
-
return (react_1.default.createElement(react_1.default.Fragment, null, `Phone: ${data.phone ?? 'n.a.'}`));
|
|
54
|
-
};
|
|
55
|
-
exports.CustomerPhoneDisplay = CustomerPhoneDisplay;
|
|
56
|
-
exports.CustomerPhoneDisplay.displayName = 'CustomerPhoneDisplay';
|
|
57
|
-
const TallyDisplay = () => {
|
|
58
|
-
const { data: { color, name, price, type } } = (0, exports.useObservableContext)({
|
|
59
|
-
color: 'color',
|
|
60
|
-
name: 'customer.name',
|
|
61
|
-
price: 'price',
|
|
62
|
-
type: 'type'
|
|
63
|
-
});
|
|
64
|
-
(0, react_1.useEffect)(() => console.log('TallyDisplay component rendered.....'));
|
|
65
|
-
return (react_1.default.createElement("div", { style: { margin: '20px 0 10px' } },
|
|
66
|
-
react_1.default.createElement("div", { style: { float: 'left', fontSize: '1.75rem' } },
|
|
67
|
-
"Customer:",
|
|
68
|
-
' ',
|
|
69
|
-
(0, lodash_isempty_1.default)(name.first) && (0, lodash_isempty_1.default)(name.last)
|
|
70
|
-
? 'n.a.'
|
|
71
|
-
: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
72
|
-
react_1.default.createElement(exports.CapitalizedDisplay, { text: name.first }),
|
|
73
|
-
' ',
|
|
74
|
-
react_1.default.createElement(exports.CapitalizedDisplay, { text: name.last })))),
|
|
75
|
-
react_1.default.createElement("div", { style: { clear: 'both', paddingLeft: 3 } },
|
|
76
|
-
react_1.default.createElement(exports.CustomerPhoneDisplay, null)),
|
|
77
|
-
react_1.default.createElement("table", null,
|
|
78
|
-
react_1.default.createElement("tbody", null,
|
|
79
|
-
react_1.default.createElement("tr", null,
|
|
80
|
-
react_1.default.createElement("td", null,
|
|
81
|
-
react_1.default.createElement("label", null, "Type:")),
|
|
82
|
-
react_1.default.createElement("td", null,
|
|
83
|
-
react_1.default.createElement(exports.CapitalizedDisplay, { text: type }))),
|
|
84
|
-
react_1.default.createElement("tr", null,
|
|
85
|
-
react_1.default.createElement("td", null,
|
|
86
|
-
react_1.default.createElement("label", null, "Color:")),
|
|
87
|
-
react_1.default.createElement("td", null,
|
|
88
|
-
react_1.default.createElement(exports.CapitalizedDisplay, { text: color }))),
|
|
89
|
-
react_1.default.createElement("tr", null,
|
|
90
|
-
react_1.default.createElement("td", null,
|
|
91
|
-
react_1.default.createElement("label", null, "Price:")),
|
|
92
|
-
react_1.default.createElement("td", null, price.toFixed(2))))),
|
|
93
|
-
react_1.default.createElement("div", { style: { textAlign: 'right' } },
|
|
94
|
-
react_1.default.createElement(exports.Reset, null))));
|
|
95
|
-
};
|
|
96
|
-
exports.TallyDisplay = TallyDisplay;
|
|
97
|
-
exports.TallyDisplay.displayName = 'TallyDisplay';
|
|
98
|
-
const Editor = () => {
|
|
99
|
-
const { setState } = (0, exports.useObservableContext)();
|
|
100
|
-
const fNameInputRef = (0, react_1.useRef)(null);
|
|
101
|
-
const lNameInputRef = (0, react_1.useRef)(null);
|
|
102
|
-
const phoneInputRef = (0, react_1.useRef)(null);
|
|
103
|
-
const priceInputRef = (0, react_1.useRef)(null);
|
|
104
|
-
const colorInputRef = (0, react_1.useRef)(null);
|
|
105
|
-
const typeInputRef = (0, react_1.useRef)(null);
|
|
106
|
-
const updateColor = (0, react_1.useCallback)(() => {
|
|
107
|
-
setState({ color: colorInputRef?.current?.value }); // as unknown as string
|
|
108
|
-
}, []);
|
|
109
|
-
const updateName = (0, react_1.useCallback)(() => {
|
|
110
|
-
setState({
|
|
111
|
-
customer: {
|
|
112
|
-
name: {
|
|
113
|
-
first: fNameInputRef.current.value,
|
|
114
|
-
last: lNameInputRef.current.value
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
}, []);
|
|
119
|
-
const updatePhone = (0, react_1.useCallback)(() => {
|
|
120
|
-
const phone = phoneInputRef.current.value;
|
|
121
|
-
if (phone.length && !/[0-9]{10}/.test(phone)) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
setState({ customer: { phone } });
|
|
125
|
-
}, []);
|
|
126
|
-
const updatePrice = (0, react_1.useCallback)(() => {
|
|
127
|
-
setState({ price: Number(priceInputRef.current.value) });
|
|
128
|
-
}, []);
|
|
129
|
-
const updateType = (0, react_1.useCallback)(() => {
|
|
130
|
-
setState({ type: typeInputRef.current.value });
|
|
131
|
-
}, []);
|
|
132
|
-
(0, react_1.useEffect)(() => console.log('Editor component rendered.....'));
|
|
133
|
-
return (react_1.default.createElement("fieldset", { style: { margin: '10px 0' } },
|
|
134
|
-
react_1.default.createElement("legend", null, "Editor"),
|
|
135
|
-
react_1.default.createElement("h3", { style: { margin: '0.5rem 0' } }, "Customer:"),
|
|
136
|
-
react_1.default.createElement("div", { style: { float: 'left', margin: '10px 0' } },
|
|
137
|
-
react_1.default.createElement("label", { htmlFor: 'firstName' },
|
|
138
|
-
react_1.default.createElement("input", { ref: fNameInputRef, placeholder: "First name" })),
|
|
139
|
-
' ',
|
|
140
|
-
react_1.default.createElement("label", { htmlFor: 'lastName' },
|
|
141
|
-
react_1.default.createElement("input", { ref: lNameInputRef, placeholder: "Last name" })),
|
|
142
|
-
' ',
|
|
143
|
-
react_1.default.createElement("button", { onClick: updateName }, "update customer")),
|
|
144
|
-
react_1.default.createElement("div", { style: { clear: 'both', margin: '10px 0' } },
|
|
145
|
-
react_1.default.createElement("label", null,
|
|
146
|
-
"New Phone: ",
|
|
147
|
-
react_1.default.createElement("input", { maxLength: 10, placeholder: "Empty or 10-digit integer", ref: phoneInputRef, type: "number" })),
|
|
148
|
-
' ',
|
|
149
|
-
react_1.default.createElement("button", { onClick: updatePhone }, "update phone")),
|
|
150
|
-
react_1.default.createElement("hr", { style: { margin: '1.5rem 0' } }),
|
|
151
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
152
|
-
react_1.default.createElement("label", null,
|
|
153
|
-
"New Price: ",
|
|
154
|
-
react_1.default.createElement("input", { ref: priceInputRef })),
|
|
155
|
-
' ',
|
|
156
|
-
react_1.default.createElement("button", { onClick: updatePrice }, "update price")),
|
|
157
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
158
|
-
react_1.default.createElement("label", null,
|
|
159
|
-
"New Color: ",
|
|
160
|
-
react_1.default.createElement("input", { ref: colorInputRef })),
|
|
161
|
-
' ',
|
|
162
|
-
react_1.default.createElement("button", { onClick: updateColor }, "update color")),
|
|
163
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
164
|
-
react_1.default.createElement("label", null,
|
|
165
|
-
"New Type: ",
|
|
166
|
-
react_1.default.createElement("input", { ref: typeInputRef })),
|
|
167
|
-
' ',
|
|
168
|
-
react_1.default.createElement("button", { onClick: updateType }, "update type"))));
|
|
169
|
-
};
|
|
170
|
-
exports.Editor = Editor;
|
|
171
|
-
exports.Editor.displayName = 'Editor';
|
|
172
|
-
const ProductDescription = () => {
|
|
173
|
-
const { data } = (0, exports.useObservableContext)({
|
|
174
|
-
c: 'color', t: 'type'
|
|
175
|
-
});
|
|
176
|
-
(0, react_1.useEffect)(() => console.log('ProductDescription component rendered.....'));
|
|
177
|
-
return (react_1.default.createElement("div", { style: { fontSize: 24 } },
|
|
178
|
-
react_1.default.createElement("strong", null, "Description:"),
|
|
179
|
-
" ",
|
|
180
|
-
data.c,
|
|
181
|
-
" ",
|
|
182
|
-
data.t));
|
|
183
|
-
};
|
|
184
|
-
exports.ProductDescription = ProductDescription;
|
|
185
|
-
exports.ProductDescription.displayName = 'ProductDescription';
|
|
186
|
-
const PriceSticker = () => {
|
|
187
|
-
const { data: { p } } = (0, exports.useObservableContext)({ p: 'price' });
|
|
188
|
-
(0, react_1.useEffect)(() => console.log('PriceSticker component rendered.....'));
|
|
189
|
-
return (react_1.default.createElement("div", { style: { fontSize: 36, fontWeight: 800 } },
|
|
190
|
-
"$",
|
|
191
|
-
p.toFixed(2)));
|
|
192
|
-
};
|
|
193
|
-
exports.PriceSticker = PriceSticker;
|
|
194
|
-
exports.PriceSticker.displayName = 'PriceSticker';
|
|
195
|
-
const Product = ({ prehooks = undefined, type }) => {
|
|
196
|
-
const [state, setState] = (0, react_1.useState)(() => ({
|
|
197
|
-
color: 'Burgundy',
|
|
198
|
-
customer: {
|
|
199
|
-
name: { first: null, last: null },
|
|
200
|
-
phone: null
|
|
201
|
-
},
|
|
202
|
-
price: 22.5,
|
|
203
|
-
type
|
|
204
|
-
}));
|
|
205
|
-
(0, react_1.useEffect)(() => {
|
|
206
|
-
setState({ type }); // use this to update only the changed state
|
|
207
|
-
// setState({ ...state, type }); // this will override the context internal state for these values
|
|
208
|
-
}, [type]);
|
|
209
|
-
const overridePricing = (0, react_1.useCallback)(e => setState({
|
|
210
|
-
price: Number(e.target.value)
|
|
211
|
-
}), []);
|
|
212
|
-
return (react_1.default.createElement("div", null,
|
|
213
|
-
react_1.default.createElement("div", { style: { marginBottom: 10 } },
|
|
214
|
-
react_1.default.createElement("label", null,
|
|
215
|
-
"$ ",
|
|
216
|
-
react_1.default.createElement("input", { onKeyUp: overridePricing, placeholder: "override price here..." }))),
|
|
217
|
-
react_1.default.createElement(exports.ObservableContext.Provider, { prehooks: prehooks, value: state },
|
|
218
|
-
react_1.default.createElement("div", { style: {
|
|
219
|
-
borderBottom: '1px solid #333',
|
|
220
|
-
marginBottom: 10,
|
|
221
|
-
paddingBottom: 5
|
|
222
|
-
} },
|
|
223
|
-
react_1.default.createElement(exports.Editor, null),
|
|
224
|
-
react_1.default.createElement(exports.TallyDisplay, null)),
|
|
225
|
-
react_1.default.createElement(exports.ProductDescription, null),
|
|
226
|
-
react_1.default.createElement(exports.PriceSticker, null))));
|
|
227
|
-
};
|
|
228
|
-
exports.Product = Product;
|
|
229
|
-
exports.Product.displayName = 'Product';
|
|
230
|
-
const App = () => {
|
|
231
|
-
const [productType, setProductType] = (0, react_1.useState)('Calculator');
|
|
232
|
-
const updateType = (0, react_1.useCallback)(e => setProductType(e.target.value), []);
|
|
233
|
-
return (react_1.default.createElement("div", { className: "App" },
|
|
234
|
-
react_1.default.createElement("h1", null, "Demo"),
|
|
235
|
-
react_1.default.createElement("h2", null, "A contrived product app."),
|
|
236
|
-
react_1.default.createElement("div", { style: { marginBottom: 10 } },
|
|
237
|
-
react_1.default.createElement("label", null,
|
|
238
|
-
"Type: ",
|
|
239
|
-
react_1.default.createElement("input", { onKeyUp: updateType, placeholder: "override product type here..." }))),
|
|
240
|
-
react_1.default.createElement(exports.Product, { type: productType })));
|
|
241
|
-
};
|
|
242
|
-
App.displayName = 'App';
|
|
243
|
-
exports.default = App;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { FC, ReactNode } from 'react';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
export declare const ConnectedReset: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
4
|
-
export declare const ConnectedCustomerPhoneDisplay: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
5
|
-
export declare const ConnectedTallyDisplay: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
6
|
-
export declare const ConnectedEditor: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
7
|
-
export declare const ProductDescription: FC<{
|
|
8
|
-
data: {
|
|
9
|
-
c: ReactNode;
|
|
10
|
-
t: ReactNode;
|
|
11
|
-
};
|
|
12
|
-
}>;
|
|
13
|
-
export declare const ConnectedProductDescription: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
14
|
-
export declare const PriceSticker: FC<{
|
|
15
|
-
data: {
|
|
16
|
-
p: number;
|
|
17
|
-
};
|
|
18
|
-
}>;
|
|
19
|
-
export declare const ConnectedPriceSticker: import("../..").ConnectedComponent<import("../..").InjectedProps<import("../..").IProps & Record<any, any>>>;
|
|
20
|
-
export declare const Product: React.FC<{
|
|
21
|
-
prehooks?: import("../..").Prehooks;
|
|
22
|
-
type: string;
|
|
23
|
-
}>;
|
|
24
|
-
declare const App: React.FC;
|
|
25
|
-
export default App;
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.Product = exports.ConnectedPriceSticker = exports.PriceSticker = exports.ConnectedProductDescription = exports.ProductDescription = exports.ConnectedEditor = exports.ConnectedTallyDisplay = exports.ConnectedCustomerPhoneDisplay = exports.ConnectedReset = void 0;
|
|
30
|
-
const react_1 = __importStar(require("react"));
|
|
31
|
-
const lodash_isempty_1 = __importDefault(require("lodash.isempty"));
|
|
32
|
-
const __1 = require("..");
|
|
33
|
-
const normal_1 = require("./normal");
|
|
34
|
-
const Reset = ({ resetState }) => {
|
|
35
|
-
(0, react_1.useEffect)(() => console.log('Reset component rendered.....'));
|
|
36
|
-
const reset = (0, react_1.useCallback)(() => resetState(['@@STATE']), [resetState]);
|
|
37
|
-
return (react_1.default.createElement("button", { onClick: reset }, "reset context"));
|
|
38
|
-
};
|
|
39
|
-
Reset.displayName = 'Reset';
|
|
40
|
-
exports.ConnectedReset = (0, __1.connect)(normal_1.ObservableContext)(Reset);
|
|
41
|
-
const CustomerPhoneDisplay = ({ data }) => {
|
|
42
|
-
(0, react_1.useEffect)(() => console.log('CustomerPhoneDisplay component rendered.....'));
|
|
43
|
-
return `Phone: ${data.phone ?? 'n.a.'}`;
|
|
44
|
-
};
|
|
45
|
-
CustomerPhoneDisplay.displayName = 'CustomerPhoneDisplay';
|
|
46
|
-
exports.ConnectedCustomerPhoneDisplay = (0, __1.connect)(normal_1.ObservableContext, { phone: 'customer.phone' })(CustomerPhoneDisplay);
|
|
47
|
-
const TallyDisplay = ({ data: { color, name, price, type } }) => {
|
|
48
|
-
(0, react_1.useEffect)(() => console.log('TallyDisplay component rendered.....'));
|
|
49
|
-
return (react_1.default.createElement("div", { style: { margin: '20px 0 10px' } },
|
|
50
|
-
react_1.default.createElement("div", { style: { float: 'left', fontSize: '1.75rem' } },
|
|
51
|
-
"Customer:",
|
|
52
|
-
' ',
|
|
53
|
-
(0, lodash_isempty_1.default)(name.first) && (0, lodash_isempty_1.default)(name.last)
|
|
54
|
-
? 'n.a.'
|
|
55
|
-
: (react_1.default.createElement(react_1.default.Fragment, null,
|
|
56
|
-
react_1.default.createElement(normal_1.CapitalizedDisplay, { text: name.first }),
|
|
57
|
-
' ',
|
|
58
|
-
react_1.default.createElement(normal_1.CapitalizedDisplay, { text: name.last })))),
|
|
59
|
-
react_1.default.createElement("div", { style: { clear: 'both', paddingLeft: 3 } },
|
|
60
|
-
react_1.default.createElement(exports.ConnectedCustomerPhoneDisplay, null)),
|
|
61
|
-
react_1.default.createElement("table", null,
|
|
62
|
-
react_1.default.createElement("tbody", null,
|
|
63
|
-
react_1.default.createElement("tr", null,
|
|
64
|
-
react_1.default.createElement("td", null,
|
|
65
|
-
react_1.default.createElement("label", null, "Type:")),
|
|
66
|
-
react_1.default.createElement("td", null,
|
|
67
|
-
react_1.default.createElement(normal_1.CapitalizedDisplay, { text: type }))),
|
|
68
|
-
react_1.default.createElement("tr", null,
|
|
69
|
-
react_1.default.createElement("td", null,
|
|
70
|
-
react_1.default.createElement("label", null, "Color:")),
|
|
71
|
-
react_1.default.createElement("td", null,
|
|
72
|
-
react_1.default.createElement(normal_1.CapitalizedDisplay, { text: color }))),
|
|
73
|
-
react_1.default.createElement("tr", null,
|
|
74
|
-
react_1.default.createElement("td", null,
|
|
75
|
-
react_1.default.createElement("label", null, "Price:")),
|
|
76
|
-
react_1.default.createElement("td", null, price.toFixed(2))))),
|
|
77
|
-
react_1.default.createElement("div", { style: { textAlign: 'right' } },
|
|
78
|
-
react_1.default.createElement(exports.ConnectedReset, null))));
|
|
79
|
-
};
|
|
80
|
-
TallyDisplay.displayName = 'TallyDisplay';
|
|
81
|
-
exports.ConnectedTallyDisplay = (0, __1.connect)(normal_1.ObservableContext, {
|
|
82
|
-
color: 'color',
|
|
83
|
-
name: 'customer.name',
|
|
84
|
-
price: 'price',
|
|
85
|
-
type: 'type'
|
|
86
|
-
})(TallyDisplay);
|
|
87
|
-
const Editor = ({ setState }) => {
|
|
88
|
-
const fNameInputRef = (0, react_1.useRef)();
|
|
89
|
-
const lNameInputRef = (0, react_1.useRef)();
|
|
90
|
-
const phoneInputRef = (0, react_1.useRef)();
|
|
91
|
-
const priceInputRef = (0, react_1.useRef)();
|
|
92
|
-
const colorInputRef = (0, react_1.useRef)();
|
|
93
|
-
const typeInputRef = (0, react_1.useRef)();
|
|
94
|
-
const updateColor = (0, react_1.useCallback)(() => {
|
|
95
|
-
setState({ color: colorInputRef.current.value });
|
|
96
|
-
}, []);
|
|
97
|
-
const updateName = (0, react_1.useCallback)(() => {
|
|
98
|
-
setState({
|
|
99
|
-
customer: {
|
|
100
|
-
name: {
|
|
101
|
-
first: fNameInputRef.current.value,
|
|
102
|
-
last: lNameInputRef.current.value
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}, []);
|
|
107
|
-
const updatePhone = (0, react_1.useCallback)(() => {
|
|
108
|
-
const phone = phoneInputRef.current.value;
|
|
109
|
-
if (phone.length && !/[0-9]{10}/.test(phone)) {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
setState({ customer: { phone } });
|
|
113
|
-
}, []);
|
|
114
|
-
const updatePrice = (0, react_1.useCallback)(() => {
|
|
115
|
-
setState({ price: Number(priceInputRef.current.value) });
|
|
116
|
-
}, []);
|
|
117
|
-
const updateType = (0, react_1.useCallback)(() => {
|
|
118
|
-
setState({ type: typeInputRef.current.value });
|
|
119
|
-
}, []);
|
|
120
|
-
(0, react_1.useEffect)(() => console.log('Editor component rendered.....'));
|
|
121
|
-
return (react_1.default.createElement("fieldset", { style: { margin: '10px 0' } },
|
|
122
|
-
react_1.default.createElement("legend", null, "Editor"),
|
|
123
|
-
react_1.default.createElement("h3", { style: { margin: '0.5rem 0' } }, "Customer:"),
|
|
124
|
-
react_1.default.createElement("div", { style: { float: 'left', margin: '10px 0' } },
|
|
125
|
-
react_1.default.createElement("label", { htmlFor: 'firstName' },
|
|
126
|
-
react_1.default.createElement("input", { ref: fNameInputRef, placeholder: "First name" })),
|
|
127
|
-
' ',
|
|
128
|
-
react_1.default.createElement("label", { htmlFor: 'lastName' },
|
|
129
|
-
react_1.default.createElement("input", { ref: lNameInputRef, placeholder: "Last name" })),
|
|
130
|
-
' ',
|
|
131
|
-
react_1.default.createElement("button", { onClick: updateName }, "update customer")),
|
|
132
|
-
react_1.default.createElement("div", { style: { clear: 'both', margin: '10px 0' } },
|
|
133
|
-
react_1.default.createElement("label", null,
|
|
134
|
-
"New Phone: ",
|
|
135
|
-
react_1.default.createElement("input", { maxLength: 10, placeholder: "Empty or 10-digit integer", ref: phoneInputRef, type: "number" })),
|
|
136
|
-
' ',
|
|
137
|
-
react_1.default.createElement("button", { onClick: updatePhone }, "update phone")),
|
|
138
|
-
react_1.default.createElement("hr", { style: { margin: '1.5rem 0' } }),
|
|
139
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
140
|
-
react_1.default.createElement("label", null,
|
|
141
|
-
"New Price: ",
|
|
142
|
-
react_1.default.createElement("input", { ref: priceInputRef })),
|
|
143
|
-
' ',
|
|
144
|
-
react_1.default.createElement("button", { onClick: updatePrice }, "update price")),
|
|
145
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
146
|
-
react_1.default.createElement("label", null,
|
|
147
|
-
"New Color: ",
|
|
148
|
-
react_1.default.createElement("input", { ref: colorInputRef })),
|
|
149
|
-
' ',
|
|
150
|
-
react_1.default.createElement("button", { onClick: updateColor }, "update color")),
|
|
151
|
-
react_1.default.createElement("div", { style: { margin: '10px 0' } },
|
|
152
|
-
react_1.default.createElement("label", null,
|
|
153
|
-
"New Type: ",
|
|
154
|
-
react_1.default.createElement("input", { ref: typeInputRef })),
|
|
155
|
-
' ',
|
|
156
|
-
react_1.default.createElement("button", { onClick: updateType }, "update type"))));
|
|
157
|
-
};
|
|
158
|
-
Editor.displayName = 'Editor';
|
|
159
|
-
exports.ConnectedEditor = (0, __1.connect)(normal_1.ObservableContext)(Editor);
|
|
160
|
-
const ProductDescription = ({ data }) => {
|
|
161
|
-
(0, react_1.useEffect)(() => console.log('ProductDescription component rendered.....'));
|
|
162
|
-
return (react_1.default.createElement("div", { style: { fontSize: 24 } },
|
|
163
|
-
react_1.default.createElement("strong", null, "Description:"),
|
|
164
|
-
" ",
|
|
165
|
-
data.c,
|
|
166
|
-
" ",
|
|
167
|
-
data.t));
|
|
168
|
-
};
|
|
169
|
-
exports.ProductDescription = ProductDescription;
|
|
170
|
-
exports.ProductDescription.displayName = 'ProductDescription';
|
|
171
|
-
exports.ConnectedProductDescription = (0, __1.connect)(normal_1.ObservableContext, { c: 'color', t: 'type' })(exports.ProductDescription);
|
|
172
|
-
const PriceSticker = ({ data: { p } }) => {
|
|
173
|
-
(0, react_1.useEffect)(() => console.log('PriceSticker component rendered.....'));
|
|
174
|
-
return (react_1.default.createElement("div", { style: { fontSize: 36, fontWeight: 800 } },
|
|
175
|
-
"$",
|
|
176
|
-
p.toFixed(2)));
|
|
177
|
-
};
|
|
178
|
-
exports.PriceSticker = PriceSticker;
|
|
179
|
-
exports.PriceSticker.displayName = 'PriceSticker';
|
|
180
|
-
exports.ConnectedPriceSticker = (0, __1.connect)(normal_1.ObservableContext, { p: 'price' })(exports.PriceSticker);
|
|
181
|
-
const Product = ({ prehooks = undefined, type }) => {
|
|
182
|
-
const [state, setState] = (0, react_1.useState)(() => ({
|
|
183
|
-
color: 'Burgundy',
|
|
184
|
-
customer: {
|
|
185
|
-
name: { first: null, last: null },
|
|
186
|
-
phone: null
|
|
187
|
-
},
|
|
188
|
-
price: 22.5,
|
|
189
|
-
type
|
|
190
|
-
}));
|
|
191
|
-
(0, react_1.useEffect)(() => {
|
|
192
|
-
setState({ type }); // use this to update only the changed state
|
|
193
|
-
// setState({ ...state, type }); // this will override the context internal state for these values
|
|
194
|
-
}, [type]);
|
|
195
|
-
const overridePricing = (0, react_1.useCallback)(e => setState({
|
|
196
|
-
price: Number(e.target.value)
|
|
197
|
-
}), []);
|
|
198
|
-
return (react_1.default.createElement("div", null,
|
|
199
|
-
react_1.default.createElement("div", { style: { marginBottom: 10 } },
|
|
200
|
-
react_1.default.createElement("label", null,
|
|
201
|
-
"$ ",
|
|
202
|
-
react_1.default.createElement("input", { onKeyUp: overridePricing, placeholder: "override price here..." }))),
|
|
203
|
-
react_1.default.createElement(normal_1.ObservableContext.Provider, { prehooks: prehooks, value: state },
|
|
204
|
-
react_1.default.createElement("div", { style: {
|
|
205
|
-
borderBottom: '1px solid #333',
|
|
206
|
-
marginBottom: 10,
|
|
207
|
-
paddingBottom: 5
|
|
208
|
-
} },
|
|
209
|
-
react_1.default.createElement(exports.ConnectedEditor, null),
|
|
210
|
-
react_1.default.createElement(exports.ConnectedTallyDisplay, null)),
|
|
211
|
-
react_1.default.createElement(exports.ConnectedProductDescription, null),
|
|
212
|
-
react_1.default.createElement(exports.ConnectedPriceSticker, null))));
|
|
213
|
-
};
|
|
214
|
-
exports.Product = Product;
|
|
215
|
-
exports.Product.displayName = 'Product';
|
|
216
|
-
const App = () => {
|
|
217
|
-
const [productType, setProductType] = (0, react_1.useState)('Calculator');
|
|
218
|
-
const updateType = (0, react_1.useCallback)(e => setProductType(e.target.value), []);
|
|
219
|
-
return (react_1.default.createElement("div", { className: "App" },
|
|
220
|
-
react_1.default.createElement("h1", null, "Demo"),
|
|
221
|
-
react_1.default.createElement("h2", null, "A contrived product app."),
|
|
222
|
-
react_1.default.createElement("div", { style: { marginBottom: 10 } },
|
|
223
|
-
react_1.default.createElement("label", null,
|
|
224
|
-
"Type: ",
|
|
225
|
-
react_1.default.createElement("input", { onKeyUp: updateType, placeholder: "override product type here..." }))),
|
|
226
|
-
react_1.default.createElement(exports.Product, { type: productType })));
|
|
227
|
-
};
|
|
228
|
-
App.displayName = 'App';
|
|
229
|
-
exports.default = App;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { FC } from 'react';
|
|
2
|
-
import type { Prehooks } from '../..';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
export declare const MemoizedReset: React.NamedExoticComponent<{}>;
|
|
5
|
-
export declare const MemoizedCustomerPhoneDisplay: React.NamedExoticComponent<{}>;
|
|
6
|
-
export declare const MemoizedEditor: React.NamedExoticComponent<{}>;
|
|
7
|
-
export declare const MemoizedProductDescription: React.NamedExoticComponent<{}>;
|
|
8
|
-
export declare const MemoizedPriceSticker: React.NamedExoticComponent<{}>;
|
|
9
|
-
export declare const MemoizedTallyDisplay: React.NamedExoticComponent<{}>;
|
|
10
|
-
export declare const Product: FC<{
|
|
11
|
-
prehooks?: Prehooks;
|
|
12
|
-
type: string;
|
|
13
|
-
}>;
|
|
14
|
-
declare const App: FC;
|
|
15
|
-
export default App;
|