import React, { useState, useEffect, useRef } from 'react'; import { invoke } from '@tauri-apps/api/tauri'; import { ChevronDown } from 'lucide-react'; interface Config { prefix: string; split: string; command: string; ignore_prefix: boolean; on_copy_mode: OnCopyMode; skip_url: boolean; use_tsf_reconvert: boolean; } enum OnCopyMode { ReturnToClipboard = 'ReturnToClipboard', ReturnToChatbox = 'ReturnToChatbox', SendDirectly = 'SendDirectly' } const SettingsComponent = () => { const [settings, setSettings] = useState({ prefix: ';', split: '/', command: ';', ignore_prefix: false, on_copy_mode: OnCopyMode.ReturnToChatbox, skip_url: true, use_tsf_reconvert: false }); const [isOpen, setIsOpen] = useState(false); const dropdownRef = useRef(null); useEffect(() => { loadSettings(); document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); const loadSettings = async () => { try { const loadedSettings: Config = await invoke('load_settings'); setSettings(loadedSettings); } catch (error) { console.error('Failed to load settings:', error); } }; const saveSettings = async () => { try { await invoke('save_settings', { config: settings }); alert('設定が正常に保存されました。'); } catch (error) { console.error('Failed to save settings:', error); alert('設定の保存に失敗しました。もう一度お試しください。'); } }; const handleChange = (e: React.ChangeEvent) => { const { name, value, type, checked } = e.target; setSettings(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); }; const handleSelectChange = (value: OnCopyMode) => { setSettings(prev => ({ ...prev, on_copy_mode: value })); setIsOpen(false); }; const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false); } }; const getOnCopyModeLabel = (mode: OnCopyMode) => { switch (mode) { case OnCopyMode.ReturnToClipboard: return 'クリップボードへ送信'; case OnCopyMode.ReturnToChatbox: return 'チャットボックスへ送信'; case OnCopyMode.SendDirectly: return '直接チャットへ送信'; } }; return (

設定

setIsOpen(!isOpen)} > {getOnCopyModeLabel(settings.on_copy_mode)}
{isOpen && (
{Object.values(OnCopyMode).map((mode) => (
handleSelectChange(mode)} > {getOnCopyModeLabel(mode)}
))}
)}
); }; export default SettingsComponent;