import { appWindow } from "@tauri-apps/api/window"; import { register, unregisterAll, isRegistered } from "@tauri-apps/api/globalShortcut"; import { useEffect } from "react"; import { store } from "@store"; import { useHotkeys } from "@logics_configs"; import { useMainFunction } from "@logics_main"; // 修飾キーのパースを行う関数 const parseHotkey = (hotkeyString) => { const keyMap = { Ctrl: "Control", Alt: "Alt", Shift: "Shift", Meta: "Super", }; // 入力文字列を分解して対応するキーを再結合 return hotkeyString .map((key) => keyMap[key] || key) // 修飾キーをマップし、その他はそのまま .join("+"); }; export const GlobalHotKeyController = () => { const { currentHotkeys } = useHotkeys(); const { toggleTranslation, toggleTranscriptionSend, toggleTranscriptionReceive, } = useMainFunction(); useEffect(() => { const registerShortcuts = async () => { try { // 既存のショートカットをすべて解除 await unregisterAll(); const hotkeyEntries = Object.entries(currentHotkeys.data); for (const [actionKey, hotkeyRaw] of hotkeyEntries) { if (!hotkeyRaw) continue; const shortcut = parseHotkey(hotkeyRaw); const isAlreadyRegistered = await isRegistered(shortcut); if (!isAlreadyRegistered) { await register(shortcut, async () => { console.log(`Shortcut for "${actionKey}" triggered.`); switch (actionKey) { case "toggle_vrct_visibility": { const minimized = await appWindow.isMinimized(); if (minimized) { appWindow.unminimize(); await appWindow.setFocus(); store.text_area_ref.current?.focus(); } else { appWindow.minimize(); } break; } case "toggle_translation": { toggleTranslation(); break; } case "toggle_transcription_send": { toggleTranscriptionSend(); break; } case "toggle_transcription_receive": { toggleTranscriptionReceive(); break; } default: { console.warn(`No handler defined for action: ${actionKey}`); break; } } }); console.log(`Registered global shortcut: ${shortcut} for action: ${actionKey}`); } } } catch (error) { console.error("Failed to register global shortcuts:", error); } }; registerShortcuts(); // クリーンアップ関数でショートカットを解除 return () => { unregisterAll().catch((error) => { console.error("Failed to unregister shortcuts:", error); }); }; }, [currentHotkeys.data]); // 監視対象を全体に変更 return null; };