UNPKG

@amaui/ui-react

Version:
178 lines (177 loc) 7.77 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const jsx_runtime_1 = require("react/jsx-runtime"); const react_1 = __importDefault(require("react")); const utils_1 = require("@amaui/utils"); const subscription_1 = __importDefault(require("@amaui/subscription")); const style_react_1 = require("@amaui/style-react"); const Context_1 = __importDefault(require("./Context")); const utils_2 = require("../utils"); const Keyframes = (props_) => { const theme = (0, style_react_1.useAmauiTheme)(); const props = react_1.default.useMemo(() => { var _a, _b, _c, _d, _e, _f, _g, _h; return (Object.assign(Object.assign(Object.assign({}, (_d = (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _a === void 0 ? void 0 : _a.elements) === null || _b === void 0 ? void 0 : _b.all) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.default), (_h = (_g = (_f = (_e = theme === null || theme === void 0 ? void 0 : theme.ui) === null || _e === void 0 ? void 0 : _e.elements) === null || _f === void 0 ? void 0 : _f.amauiKeyframes) === null || _g === void 0 ? void 0 : _g.props) === null || _h === void 0 ? void 0 : _h.default), props_)); }, [props_]); const { ref, append, update, timeout: timeout_, appendStatusPost, add: add_, runOnEnter, removeOnEnd, keyframes, prefix, onKeyframes, onAppended, onAdd, onAdding, onAdded, onRemoved, className, children, } = props; const [init, setInit] = react_1.default.useState(false); const [status, setStatus] = react_1.default.useState(() => { let statusNew = ''; if (append) statusNew = 'appended'; return statusNew; }); const subs = react_1.default.useRef({ status: new subscription_1.default() }); const refs = { root: react_1.default.useRef(undefined), status: react_1.default.useRef(status) }; react_1.default.useEffect(() => { initMethod(); }, []); // Anytime update updates // keyframes are ran // meaning you can update // keyframes between reruns // and have any version of // animation based on those points // ie. Switch ui on and off animation react_1.default.useEffect(() => { if (init) run(); }, [update]); const initMethod = async () => { // Appended if (status === 'appended') updateStatus(appendStatusPost); // Add if (add_ || status === 'add') await add(); // Run the method // to run the keyframes if (runOnEnter) await run(); // Init setInit(true); }; const run = async () => { // Run all keyframes if ((0, utils_1.is)('array', keyframes)) for (const keyframe of keyframes) await runKeyframe(keyframe); if (removeOnEnd) { // So exited status has // enough time to apply some value setStatus('removed'); // Subscriptions subs.current.status.emit('removed'); } }; const runKeyframe = async (value_) => { if (value_) { const { name, timeout: timeout__ } = value_; updateStatus(name); await (0, utils_1.wait)(timeout__ || 0); } }; const timeout = async (status_) => { let duration = timeout_; if ((0, utils_1.is)('string', timeout_) && theme.transitions.duration[timeout_] !== undefined) duration = theme.transitions.duration[timeout_]; if ((0, utils_1.is)('object', timeout_)) duration = timeout_[status_] !== undefined ? timeout_[status_] : timeout_.default; if (!(0, utils_1.is)('number', duration)) duration = theme.transitions.duration.rg; await (0, utils_1.wait)(duration); }; const add = async () => { updateStatus('add'); // Reflow (0, utils_2.reflow)(refs.root.current); // Add adding class for animation setTimeout(() => updateStatus('adding')); await timeout('add'); updateStatus('added'); await (0, utils_1.wait)(0); }; const updateStatus = (status_ = status) => { // Update setStatus(status_); // Subscriptions subs.current.status.emit(status_); switch (status_) { case 'appended': if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); if ((0, utils_1.is)('function', onAppended)) onAppended(refs.root.current); break; case 'add': if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); if ((0, utils_1.is)('function', onAdd)) onAdd(refs.root.current); break; case 'adding': if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); if ((0, utils_1.is)('function', onAdding)) onAdding(refs.root.current); break; case 'added': if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); if ((0, utils_1.is)('function', onAdded)) onAdded(refs.root.current); break; case 'removed': if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); if ((0, utils_1.is)('function', onRemoved)) onRemoved(refs.root.current); break; default: if ((0, utils_1.is)('function', onKeyframes)) onKeyframes(refs.root.current, status_); break; } // Add className if (className && (0, utils_1.is)('element', refs.root.current)) { let className_ = (0, style_react_1.classNames)([refs.root.current.className.split(' ')]); // Remove all previous state classes className_ = className_.replace(new RegExp(`${prefix || ''}(add)(ed|ing)?`, 'g'), ''); // Remove all previous keyframes classes if ((0, utils_1.is)('array', keyframes)) { const regex = new RegExp(`${keyframes.reduce((result, item, index) => result += `${index !== 0 ? '|' : ''}${item}`, '')}`, 'g'); className_ = className_.replace(regex, ''); } // Add className_ += ` ${prefix || ''}${status_}`; className_ = className_.replace(/ +/g, ' ').trim(); refs.root.current.className = className_; } }; if (status === 'removed') return null; const value = { status }; return ((0, jsx_runtime_1.jsx)(Context_1.default.Provider, Object.assign({ value: value }, { children: (0, utils_1.is)('function', children) ? children(status, refs.root) : react_1.default.cloneElement(children, { ref: (item) => { if (ref) { if ((0, utils_1.is)('function', ref)) ref(item); else ref.current = item; } refs.root.current = item; } }) }))); }; Keyframes.displayName = 'amaui-Keyframes'; exports.default = Keyframes;