UNPKG

@emmveqz/react-components

Version:
117 lines (116 loc) 5.54 kB
"use strict"; // var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __exportStar = (this && this.__exportStar) || function(m, exports) { for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.AppProvider = void 0; exports.useAppContext = useAppContext; /* eslint-disable no-console */ /* eslint-disable @typescript-eslint/no-unused-expressions */ const react_1 = __importStar(require("react")); __exportStar(require("./example"), exports); const whoIsMyDaddy = () => { var _a, _b; try { throw new Error(); } catch (e) { const allMatches = (_a = e === null || e === void 0 ? void 0 : e.stack) === null || _a === void 0 ? void 0 : _a.match(/(\w+)@|at (\w+) \(/g); const parentMatches = (_b = allMatches === null || allMatches === void 0 ? void 0 : allMatches[1]) === null || _b === void 0 ? void 0 : _b.match(/(\w+)@|at (\w+) \(/); return (parentMatches === null || parentMatches === void 0 ? void 0 : parentMatches[1]) || (parentMatches === null || parentMatches === void 0 ? void 0 : parentMatches[2]); } }; // const AppContext = (0, react_1.createContext)(undefined); // const AppProvider = ({ children, debug, props, }) => { console.log('AppProvider', Date.now()); const states = (0, react_1.useRef)(Object.keys(props) .reduce((result, key) => (Object.assign(Object.assign({}, result), { [key]: { dispatchers: [], lastVal: props[key], } })), {})); const providerValue = (0, react_1.useMemo)(() => Object.keys(props) .reduce((result, key) => (Object.assign(Object.assign({}, result), { [key]: () => { // eslint-disable-next-line react-hooks/rules-of-hooks const [state, setState] = (0, react_1.useState)(states.current[key].lastVal); const caller = debug && whoIsMyDaddy(); // eslint-disable-next-line react-hooks/rules-of-hooks const setState2 = (0, react_1.useCallback)((newState) => { if (states.current[key].lastVal === newState) { return; } let newValueReturned = false; const isNewStateCallback = typeof newState === typeof (() => { }); states.current[key].dispatchers.forEach((dispatcher) => { if (isNewStateCallback) { dispatcher((prevVal) => { if (newValueReturned) { return states.current[key].lastVal; } newValueReturned = true; const newVal = newState(prevVal); states.current[key].lastVal = newVal; return newVal; }); } else { states.current[key].lastVal = newState; dispatcher(newState); } }); }, []); // eslint-disable-next-line react-hooks/rules-of-hooks (0, react_1.useEffect)(() => { debug && console.log(`<${caller} />`, 'used stateKey:', key); states.current[key].dispatchers.push(setState); debug && console.log('stateKey:', key, 'dispatchers.length:', states.current[key].dispatchers.length); return () => { debug && console.log(`<${caller} />`, 'unused stateKey:', key); const idx = states.current[key].dispatchers .findIndex((dispatcher) => dispatcher === setState); if (idx > -1) { states.current[key].dispatchers.splice(idx, 1); } debug && console.log('stateKey:', key, 'dispatchers.length:', states.current[key].dispatchers.length); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return [state, setState2]; } })), {}), [ props, ]); return (react_1.default.createElement(AppContext.Provider, { value: providerValue }, children)); }; exports.AppProvider = AppProvider; function useAppContext() { const context = (0, react_1.useContext)(AppContext); if (!context) { throw new Error('useAppContext() was used without an <AppProvider />'); } return context; }