UNPKG

@launchmenu/core

Version:

An environment for visual keyboard controlled applets

187 lines 16.1 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.StackView = void 0; const react_1 = __importStar(require("react")); const Transition_1 = require("./transitions/Transition"); const getViewStackItemElement_1 = require("./getViewStackItemElement"); const uuid_1 = require("uuid"); const findStackChanges_1 = require("../../../context/findStackChanges"); const model_react_1 = require("model-react"); /** * Retrieves the view for a given stack item * @param item The item to get the view for * @returns THe view */ function getView(item) { if ("close" in item.value) return; let view; if ("view" in item.value) view = item.value.view; else view = item.value; return view; } /** * Updates the children array, replacing, adding or removing children * @param items The new items array * @param prevItems The old items array * @param children The children list to modify * @param defaultTransitions The default transitions to be used * @param skipOpening Whether to skip opening animation for the new items */ function updateChildren(items, prevItems, children, defaultTransitions, skipOpening) { const { added, removed, updated } = findStackChanges_1.findStackChanges(prevItems, items); const childMap = {}; children.forEach(item => { if (item.element) childMap[item.id] = item; }); updated.forEach(({ index, oldItem, newItem }) => { const child = childMap[oldItem.ID]; const view = getView(newItem); if (child && view) child.element = view; }); removed.forEach(({ item }) => { const child = childMap[item.ID]; if (child) child.element = undefined; }); added.forEach(({ index, item }) => { if ("close" in item.value) return; // Find the index to add the item at let childIndex; if (index > 0) { const itemBefore = items[index - 1]; childIndex = children.findIndex(({ id }) => id == itemBefore.ID) + 1; } else { childIndex = 0; } const view = getView(item); const { transparent, transitions } = "transparent" in item.value || "transitions" in item.value ? item.value : { transparent: false, transitions: {} }; // Add the child or replace a previous child const currentChild = children[childIndex]; if (currentChild && currentChild.element == undefined && !currentChild.closing) { currentChild.element = view; currentChild.id = item.ID; currentChild.wasTransparent = currentChild.wasTransparent || currentChild.transparent; currentChild.transparent = transparent !== null && transparent !== void 0 ? transparent : false; currentChild.transitions = { ...defaultTransitions, ...transitions }; } else { children.splice(childIndex, 0, { key: uuid_1.v4(), id: item.ID, element: view, closing: false, opening: skipOpening ? false : true, wasTransparent: false, transparent: transparent !== null && transparent !== void 0 ? transparent : false, transitions: { ...defaultTransitions, ...transitions }, skipOpening, }); } }); removed.forEach(({ item }) => { const child = children.find(({ id, closing, element }) => id == item.ID && !closing && !element); if (child) child.closing = true; }); } /** * Visualizes a stack of views */ exports.StackView = react_1.memo(({ stackGetter, smartHide = true, ChangeTransitionComp, CloseTransitionComp, OpenTransitionComp, }) => { var _a; // Retrieve the items const [h] = model_react_1.useDataHook(); const items = stackGetter(h); const prevItems = react_1.useRef(); // Keep track of the children to render const childrenRef = react_1.useRef([]); // Update the elements to render when the items array changes if (prevItems.current != items) { updateChildren(items, (_a = prevItems.current) !== null && _a !== void 0 ? _a : [], childrenRef.current, { Open: OpenTransitionComp !== null && OpenTransitionComp !== void 0 ? OpenTransitionComp : Transition_1.defaultTransitions.Open, Change: ChangeTransitionComp !== null && ChangeTransitionComp !== void 0 ? ChangeTransitionComp : Transition_1.defaultTransitions.Change, Close: CloseTransitionComp !== null && CloseTransitionComp !== void 0 ? CloseTransitionComp : Transition_1.defaultTransitions.Close, }, prevItems.current == undefined); prevItems.current = items; } // Handle transition changes const [_, _forceUpdate] = react_1.useState(false); const forceUpdate = () => _forceUpdate(a => !a); const onClose = (key) => { const children = childrenRef.current; const index = children.findIndex(({ key: k }) => k == key); if (index != -1) { children.splice(index, 1); forceUpdate(); } }; const onOpen = (key) => { const children = childrenRef.current; const child = children.find(({ key: k }) => k == key); if (child) { child.opening = false; forceUpdate(); } }; const onChange = (key) => { const children = childrenRef.current; const child = children.find(({ key: k }) => k == key); if (child) { child.wasTransparent = false; forceUpdate(); } }; // Find the first index that needs to be rendered const children = childrenRef.current; let firstOpaqueIndex = smartHide ? children.length : 0; let childTransparent = true; while (childTransparent && --firstOpaqueIndex >= 0) { const child = children[firstOpaqueIndex]; childTransparent = child.opening || child.closing || child.transparent || child.wasTransparent; } // Render the children return (react_1.default.createElement(react_1.default.Fragment, null, childrenRef.current.map(({ key, id, element, transitions, skipOpening }, index) => { const props = { key: id, onTop: index == childrenRef.current.length, stack: items, index, }; const el = element && getViewStackItemElement_1.getViewStackItemElement(element, props); return (react_1.default.createElement(Transition_1.Transition, { key: key, hidden: index < firstOpaqueIndex, onClose: () => onClose(key), onChange: () => onChange(key), onOpen: () => onOpen(key), skipMountAnimation: skipOpening, ChangeTransitionComp: transitions.Change, CloseTransitionComp: transitions.Close, OpenTransitionComp: transitions.Open }, el)); }))); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RhY2tWaWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvY29udGV4dC9zdGFja3MvU3RhY2tWaWV3LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsK0NBQW9EO0FBR3BELHlEQUF3RTtBQUN4RSx1RUFBa0U7QUFHbEUsK0JBQWdDO0FBTWhDLHdFQUFtRTtBQUNuRSw2Q0FBd0M7QUF1QnhDOzs7O0dBSUc7QUFDSCxTQUFTLE9BQU8sQ0FBQyxJQUFxQztJQUNsRCxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU87SUFFbEMsSUFBSSxJQUF3QixDQUFDO0lBQzdCLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLO1FBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDOztRQUM1QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsY0FBYyxDQUNuQixLQUFpRCxFQUNqRCxTQUFxRCxFQUNyRCxRQUEyQixFQUMzQixrQkFBOEMsRUFDOUMsV0FBcUI7SUFFckIsTUFBTSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFDLEdBQUcsbUNBQWdCLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFvQyxFQUFFLENBQUM7SUFDckQsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FB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