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
JavaScript
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