mirror of
https://github.com/infinilabs/coco-app.git
synced 2025-12-16 19:47:43 +01:00
89 lines
2.2 KiB
TypeScript
89 lines
2.2 KiB
TypeScript
import { useTranslation } from "react-i18next";
|
|
import { TrayIcon, type TrayIconOptions } from "@tauri-apps/api/tray";
|
|
import { Menu, MenuItem, PredefinedMenuItem } from "@tauri-apps/api/menu";
|
|
import { isMac } from "@/utils/platform";
|
|
import { resolveResource } from "@tauri-apps/api/path";
|
|
import { useUpdateEffect } from "ahooks";
|
|
import { exit } from "@tauri-apps/plugin-process";
|
|
import { invoke } from "@tauri-apps/api/core";
|
|
import { useAppStore } from "@/stores/appStore";
|
|
|
|
const TRAY_ID = "COCO_TRAY";
|
|
|
|
export const useTray = () => {
|
|
const { t, i18n } = useTranslation();
|
|
const showCocoShortcuts = useAppStore((state) => state.showCocoShortcuts);
|
|
|
|
useUpdateEffect(() => {
|
|
if (showCocoShortcuts.length === 0) return;
|
|
|
|
updateTrayMenu();
|
|
}, [i18n.language, showCocoShortcuts]);
|
|
|
|
const getTrayById = () => {
|
|
return TrayIcon.getById(TRAY_ID);
|
|
};
|
|
|
|
const createTrayIcon = async () => {
|
|
const tray = await getTrayById();
|
|
|
|
if (tray) return;
|
|
|
|
const menu = await getTrayMenu();
|
|
|
|
const iconPath = isMac ? "assets/tray-mac.ico" : "assets/tray.ico";
|
|
const icon = await resolveResource(iconPath);
|
|
|
|
const options: TrayIconOptions = {
|
|
menu,
|
|
icon,
|
|
id: TRAY_ID,
|
|
iconAsTemplate: true,
|
|
};
|
|
|
|
return TrayIcon.new(options);
|
|
};
|
|
|
|
const getTrayMenu = async () => {
|
|
const items = await Promise.all([
|
|
MenuItem.new({
|
|
text: t("tray.showCoco"),
|
|
accelerator: showCocoShortcuts.join("+"),
|
|
action: () => {
|
|
invoke("show_coco");
|
|
},
|
|
}),
|
|
PredefinedMenuItem.new({ item: "Separator" }),
|
|
MenuItem.new({
|
|
text: t("tray.settings"),
|
|
// accelerator: "CommandOrControl+,",
|
|
action: () => {
|
|
invoke("show_settings");
|
|
},
|
|
}),
|
|
PredefinedMenuItem.new({ item: "Separator" }),
|
|
MenuItem.new({
|
|
text: t("tray.quitCoco"),
|
|
accelerator: "CommandOrControl+Q",
|
|
action: () => {
|
|
exit(0);
|
|
},
|
|
}),
|
|
]);
|
|
|
|
return Menu.new({ items });
|
|
};
|
|
|
|
const updateTrayMenu = async () => {
|
|
const tray = await getTrayById();
|
|
|
|
if (!tray) {
|
|
return createTrayIcon();
|
|
}
|
|
|
|
const menu = await getTrayMenu();
|
|
|
|
tray.setMenu(menu);
|
|
};
|
|
};
|