@emmveqz/react-components
Version:
Diverse Components for React
117 lines (116 loc) • 5.54 kB
JavaScript
;
//
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;
}