import { For, Show, createEffect, createMemo, createSignal, onMount, type JSX } from "solid-js"; import { Portal } from "solid-js/web"; import { ChevronRight, Plus } from "../../../lib/icons"; import { getProjectContextMenuEyebrow, getProjectContextMenuSections, type ProjectContextMenuAction, type ProjectMenuTarget, type WorkspaceContextMenuShortcut, } from "../data/shell.data"; import styles from "../WorkspaceContextMenu/WorkspaceContextMenu.module.scss"; type ShortcutPlatform = "mac" | "windows"; type NavigatorWithUserAgentData = Navigator & { userAgentData?: { platform?: string; }; }; type ProjectContextMenuPosition = { x: number; y: number; }; type ProjectContextMenuProps = { target: ProjectMenuTarget | null; position: ProjectContextMenuPosition | null; onClose: VoidFunction; onSelect: (action: ProjectContextMenuAction, target: ProjectMenuTarget) => void; menuRef: (element: HTMLDivElement) => void; }; const getShortcutPlatform = (): ShortcutPlatform => { if (typeof navigator === "undefined") { return "mac"; } const navigatorWithUserAgentData = navigator as NavigatorWithUserAgentData; const platform = typeof navigatorWithUserAgentData.userAgentData?.platform === "string" ? navigatorWithUserAgentData.userAgentData.platform : navigator.platform; return /mac|iphone|ipad|ipod/i.test(platform) ? "mac" : "windows"; }; const formatShortcut = (shortcut: WorkspaceContextMenuShortcut, platform: ShortcutPlatform): string => { const keyLabel = (() => { switch (shortcut.key) { case "enter": return platform === "mac" ? "↩" : "Enter"; case "delete": return platform === "mac" ? "⌫" : "Del"; default: return shortcut.key.toUpperCase(); } })(); const modifierLabels = shortcut.modifiers?.map((modifier) => { switch (modifier) { case "meta": return platform === "mac" ? "⌘" : "Ctrl"; case "alt": return platform === "mac" ? "⌥" : "Alt"; case "shift": return platform === "mac" ? "⇧" : "Shift"; } }) ?? []; return platform === "mac" ? `${modifierLabels.join("")}${keyLabel}` : [...modifierLabels, keyLabel].join("+"); }; export const ProjectContextMenu = (props: ProjectContextMenuProps): JSX.Element => { const [activeSubmenuActionId, setActiveSubmenuActionId] = createSignal(null); const [shortcutPlatform, setShortcutPlatform] = createSignal("mac"); const sections = createMemo(() => (props.target ? getProjectContextMenuSections(props.target) : [])); const isCreateAction = (action: ProjectContextMenuAction): boolean => action.id.startsWith("new-"); const menuState = createMemo<{ target: ProjectMenuTarget; position: ProjectContextMenuPosition; } | null>(() => (props.target && props.position ? { target: props.target, position: props.position } : null)); onMount(() => { setShortcutPlatform(getShortcutPlatform()); }); createEffect(() => { void props.target; setActiveSubmenuActionId(null); }); return ( {(resolvedMenuState): JSX.Element => { const target = resolvedMenuState().target; const position = resolvedMenuState().position; return ( ); }} ); };