{"version":3,"file":"menu.mjs","names":[],"sources":["../../src/main/menu/index.ts"],"sourcesContent":["import { BrowserWindow, Menu, MenuItem } from \"electron\";\nimport type { RpcServer } from \"electron-json-rpc/main\";\nimport type {\n  MenuItemConstructorOptions,\n  MenuItemData,\n  MenuData,\n  PopupOptions,\n} from \"@shared/menu.types.js\";\n\nlet menuInstance: Menu | null = null;\nlet rpcInstance: RpcServer | null = null;\n\nconst RPC_METHOD_PREFIX = \"menu\";\n\nfunction serializeMenuItem(menuItem: MenuItem): MenuItemData {\n  return {\n    id: menuItem.id,\n    label: menuItem.label,\n    sublabel: menuItem.sublabel,\n    toolTip: menuItem.toolTip,\n    accelerator: menuItem.accelerator,\n    type: menuItem.type,\n    role: menuItem.role,\n    enabled: menuItem.enabled,\n    visible: menuItem.visible,\n    checked: menuItem.checked,\n    registerAccelerator: menuItem.registerAccelerator,\n    submenu: menuItem.submenu ? menuItem.submenu.items.map(serializeMenuItem) : undefined,\n    commandId: menuItem.commandId,\n  };\n}\n\nfunction setupMenuEvents(menu: Menu): void {\n  menu.on(\"menu-will-show\", () => {\n    rpcInstance?.publish(\"menu.menu-will-show\");\n  });\n  menu.on(\"menu-will-close\", () => {\n    rpcInstance?.publish(\"menu.menu-will-close\");\n  });\n}\n\nasync function setApplicationMenuHandler(...params: unknown[]): Promise<void> {\n  const [template] = params as [MenuItemConstructorOptions[] | null];\n  if (!template) {\n    Menu.setApplicationMenu(null);\n    return;\n  }\n  const menu = Menu.buildFromTemplate(template as Electron.MenuItemConstructorOptions[]);\n  Menu.setApplicationMenu(menu);\n}\n\nasync function getApplicationMenuHandler(): Promise<MenuData | null> {\n  const menu = Menu.getApplicationMenu();\n  if (!menu) return null;\n  return { items: menu.items.map(serializeMenuItem) };\n}\n\nasync function buildFromTemplateHandler(...params: unknown[]): Promise<MenuData> {\n  const [template] = params as [MenuItemConstructorOptions[]];\n  const menu = Menu.buildFromTemplate(template as Electron.MenuItemConstructorOptions[]);\n  return { items: menu.items.map(serializeMenuItem) };\n}\n\nasync function sendActionToFirstResponderHandler(...params: unknown[]): Promise<void> {\n  const [action] = params as [string];\n  Menu.sendActionToFirstResponder(action);\n}\n\nasync function popupHandler(...params: unknown[]): Promise<void> {\n  const [options] = params as [PopupOptions?];\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  if (!options) {\n    menuInstance.popup();\n    return;\n  }\n  const { windowId, ...rest } = options;\n  const hasWindowId = windowId !== undefined && windowId !== null;\n  const window = hasWindowId ? (BrowserWindow.fromId(windowId) ?? undefined) : undefined;\n  const popupOptions = window ? { ...rest, window } : rest;\n  menuInstance.popup(popupOptions as Electron.PopupOptions);\n}\n\nasync function closePopupHandler(...params: unknown[]): Promise<void> {\n  const [windowId] = params as [number?];\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  if (windowId === undefined || windowId === null) {\n    menuInstance.closePopup();\n    return;\n  }\n  const window = BrowserWindow.fromId(windowId);\n  if (!window) return;\n  menuInstance.closePopup(window);\n}\n\nasync function appendHandler(...params: unknown[]): Promise<void> {\n  const [menuItemOptions] = params as [MenuItemConstructorOptions];\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  const menuItem = new MenuItem(menuItemOptions);\n  menuInstance.append(menuItem);\n}\n\nasync function getMenuItemByIdHandler(...params: unknown[]): Promise<MenuItemData | null> {\n  const [id] = params as [string];\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  const menuItem = menuInstance.getMenuItemById(id);\n  return menuItem ? serializeMenuItem(menuItem) : null;\n}\n\nasync function insertHandler(...params: unknown[]): Promise<void> {\n  const [pos, menuItemOptions] = params as [number, MenuItemConstructorOptions];\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  const menuItem = new MenuItem(menuItemOptions);\n  menuInstance.insert(pos, menuItem);\n}\n\nasync function getItemsHandler(): Promise<MenuItemData[]> {\n  if (!menuInstance) throw new Error(\"Menu instance not provided during registration\");\n  return menuInstance.items.map(serializeMenuItem);\n}\n\nexport function registerMenuModule(rpc: RpcServer, menu: Menu): void {\n  rpcInstance = rpc;\n  menuInstance = menu;\n  setupMenuEvents(menu);\n\n  rpc.register(`${RPC_METHOD_PREFIX}.setApplicationMenu`, setApplicationMenuHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getApplicationMenu`, getApplicationMenuHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.buildFromTemplate`, buildFromTemplateHandler);\n  rpc.register(\n    `${RPC_METHOD_PREFIX}.sendActionToFirstResponder`,\n    sendActionToFirstResponderHandler,\n  );\n  rpc.register(`${RPC_METHOD_PREFIX}.popup`, popupHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.closePopup`, closePopupHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.append`, appendHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getMenuItemById`, getMenuItemByIdHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.insert`, insertHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getItems`, getItemsHandler);\n}\n"],"mappings":"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"}