UNPKG

reactdesk-core

Version:

A powerful React-based desktop environment library for creating Windows 11-like desktop interfaces with window management, taskbar, themes, and more

129 lines (128 loc) 5.13 kB
import { useCallback, useMemo } from "react"; import { _ as useContext, $ as useContext$1, at as useWindowsRef, an as PREVENT_SCROLL, ap as useContext$2, au as MENU_SEPERATOR } from "./index-CGa3ZYCK.js"; const CLOSE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAAAMElEQVR4AWMgEoyC2TCAwsYPFqMCouzZCQPEOmzvnj0QRJTqo6iAgOoLMIDCHsYAACjTO7/gCQlBAAAAAElFTkSuQmCC"; const MAXIMIZE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAR0lEQVR42u3IoRHAMAzFUO+/gllKG5IgD2DujX4vC8ikMO9ORHb9xN1FWWc8Q5R15jt1gs/22jrBZxGhE3yWmaKsU1Wi7EIfHneIsXEKuhAAAAAASUVORK5CYII="; const MAXIMIZE_DISABLED = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAHklEQVR42mOgEhgFnp6e//Fh+hmALj5UDBj4QBwFANQKUXn4YyGJAAAAAElFTkSuQmCC"; const MINIMIZE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAIUlEQVR42mMYPGAUjIIDBw78x4cJGnDu3Ln/+DB+3aMAAPFzNUFuAVJEAAAAAElFTkSuQmCC"; const MINIMIZE_DISABLED = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGElEQVR42mMYPGAUjAJPT8//+DCNDRgFAPTaHaFVv24VAAAAAElFTkSuQmCC"; const RESTORE = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAAAOklEQVR4AWMYVmA2BiBN/6JFi3DKrcUAEEGcGnZiAIggTg1HwQCNDSSpp+H8hQtoiECAXMcADMMbAABMtF75qvi0qwAAAABJRU5ErkJggg=="; const RESTORE_DISABLED = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAJElEQVR42mNABaPA09PzPzZMsaFk20x/A2D8gTIAE9Mp+kYBAJPzT5+OMe9rAAAAAElFTkSuQmCC"; const useNextFocusable = (id) => { const { stackOrder = [] } = useContext(); const { windows } = useContext$1(); const nextFocusableId = stackOrder.find( (stackId) => { var _a; return stackId !== id && !((_a = windows == null ? void 0 : windows[stackId]) == null ? void 0 : _a.minimized); } ); return nextFocusableId || ""; }; const useWindowActions = (id) => { const nextFocusableId = useNextFocusable(id); const { setForegroundId, removeFromStack } = useContext(); const { closeWithTransition, maximize, minimize, setSnap } = useContext$1(); const windowsRef = useWindowsRef(); const onMinimize = useCallback( (keepForegroundId) => { minimize(id); setSnap(id, false); if (!keepForegroundId) setForegroundId(nextFocusableId); }, [id, minimize, setSnap, nextFocusableId, setForegroundId] ); const onMaximize = useCallback(() => { var _a, _b; const triggerMaximize = () => { var _a2, _b2; maximize(id); setForegroundId(id); (_b2 = (_a2 = windowsRef.current[id]) == null ? void 0 : _a2.componentWindow) == null ? void 0 : _b2.focus(PREVENT_SCROLL); setSnap(id, false); }; const [currentAnimation] = ((_b = (_a = windowsRef.current[id]) == null ? void 0 : _a.componentWindow) == null ? void 0 : _b.getAnimations()) || []; if (currentAnimation == null ? void 0 : currentAnimation.finished) { currentAnimation.finished.then(triggerMaximize); } else { triggerMaximize(); } }, [id, setSnap, maximize, windowsRef, setForegroundId]); const onClose = useCallback(() => { removeFromStack(id); closeWithTransition(id); setForegroundId(nextFocusableId); }, [ closeWithTransition, id, nextFocusableId, removeFromStack, setForegroundId ]); return { onClose, onMaximize, onMinimize }; }; const useTitlebarContextMenu = (id) => { const { contextMenu } = useContext$2(); const { onClose, onMaximize, onMinimize } = useWindowActions(id); const { windows: { [id]: currentWindow } } = useContext$1(); const { allowResizing = true, hideMaximizeButton, hideMinimizeButton, maximized, minimized } = currentWindow || {}; return useMemo( () => contextMenu == null ? void 0 : contextMenu(() => { const isMaxOrMin = maximized || minimized; const showMaxOrMin = !hideMaximizeButton || !hideMinimizeButton; return [ showMaxOrMin && { action: () => { if (minimized) onMinimize(); else onMaximize(); }, disabled: !isMaxOrMin, icon: isMaxOrMin ? RESTORE : RESTORE_DISABLED, label: "Restore" }, !hideMinimizeButton && { action: onMinimize, disabled: minimized, icon: minimized ? MINIMIZE_DISABLED : MINIMIZE, label: "Minimize" }, !hideMaximizeButton && { action: onMaximize, disabled: isMaxOrMin || !allowResizing, icon: isMaxOrMin ? MAXIMIZE_DISABLED : MAXIMIZE, label: "Maximize" }, showMaxOrMin && MENU_SEPERATOR, { action: onClose, icon: CLOSE, label: "Close" } ].filter(Boolean); }), [ allowResizing, contextMenu, hideMaximizeButton, hideMinimizeButton, maximized, minimized, onClose, onMaximize, onMinimize ] ); }; export { useTitlebarContextMenu as a, useWindowActions as b, useNextFocusable as u }; //# sourceMappingURL=useTitlebarContextMenu-DjUJ9T4Z.js.map