menu.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { Menu, MenuItem, PredefinedMenuItem, Submenu } from "@tauri-apps/api/menu"
  2. import { type as ostype } from "@tauri-apps/plugin-os"
  3. import { invoke } from "@tauri-apps/api/core"
  4. import { relaunch } from "@tauri-apps/plugin-process"
  5. import { runUpdater, UPDATER_ENABLED } from "./updater"
  6. import { installCli } from "./cli"
  7. export async function createMenu() {
  8. if (ostype() !== "macos") return
  9. const menu = await Menu.new({
  10. items: [
  11. await Submenu.new({
  12. text: "OpenCode",
  13. items: [
  14. await PredefinedMenuItem.new({
  15. item: { About: null },
  16. }),
  17. await MenuItem.new({
  18. enabled: UPDATER_ENABLED,
  19. action: () => runUpdater({ alertOnFail: true }),
  20. text: "Check For Updates...",
  21. }),
  22. await MenuItem.new({
  23. action: () => installCli(),
  24. text: "Install CLI...",
  25. }),
  26. await MenuItem.new({
  27. action: async () => window.location.reload(),
  28. text: "Reload Webview",
  29. }),
  30. await MenuItem.new({
  31. action: async () => {
  32. await invoke("kill_sidecar").catch(() => undefined)
  33. await relaunch().catch(() => undefined)
  34. },
  35. text: "Restart",
  36. }),
  37. await PredefinedMenuItem.new({
  38. item: "Separator",
  39. }),
  40. await PredefinedMenuItem.new({
  41. item: "Hide",
  42. }),
  43. await PredefinedMenuItem.new({
  44. item: "HideOthers",
  45. }),
  46. await PredefinedMenuItem.new({
  47. item: "ShowAll",
  48. }),
  49. await PredefinedMenuItem.new({
  50. item: "Separator",
  51. }),
  52. await PredefinedMenuItem.new({
  53. item: "Quit",
  54. }),
  55. ].filter(Boolean),
  56. }),
  57. // await Submenu.new({
  58. // text: "File",
  59. // items: [
  60. // await MenuItem.new({
  61. // enabled: false,
  62. // text: "Open Project...",
  63. // }),
  64. // await PredefinedMenuItem.new({
  65. // item: "Separator"
  66. // }),
  67. // await MenuItem.new({
  68. // enabled: false,
  69. // text: "New Session",
  70. // }),
  71. // await PredefinedMenuItem.new({
  72. // item: "Separator"
  73. // }),
  74. // await MenuItem.new({
  75. // enabled: false,
  76. // text: "Close Project",
  77. // })
  78. // ]
  79. // }),
  80. await Submenu.new({
  81. text: "Edit",
  82. items: [
  83. await PredefinedMenuItem.new({
  84. item: "Undo",
  85. }),
  86. await PredefinedMenuItem.new({
  87. item: "Redo",
  88. }),
  89. await PredefinedMenuItem.new({
  90. item: "Separator",
  91. }),
  92. await PredefinedMenuItem.new({
  93. item: "Cut",
  94. }),
  95. await PredefinedMenuItem.new({
  96. item: "Copy",
  97. }),
  98. await PredefinedMenuItem.new({
  99. item: "Paste",
  100. }),
  101. await PredefinedMenuItem.new({
  102. item: "SelectAll",
  103. }),
  104. ],
  105. }),
  106. ],
  107. })
  108. menu.setAsAppMenu()
  109. }