/** * TriggersPanel - OpenFang Triggers Management UI * * Displays available OpenFang Triggers and allows toggling them on/off. */ import { useState, useEffect, useCallback } from 'react'; import { useGatewayStore } from '../store/gatewayStore'; import type { Trigger } from '../store/gatewayStore'; interface TriggerCardProps { trigger: Trigger; onToggle: (id: string, enabled: boolean) => Promise; isToggling: boolean; } function TriggerCard({ trigger, onToggle, isToggling }: TriggerCardProps) { const handleToggle = async () => { await onToggle(trigger.id, !trigger.enabled); }; const statusColor = trigger.enabled ? 'bg-green-500' : 'bg-gray-400'; const typeLabel: Record = { webhook: 'Webhook', schedule: '定时任务', event: '事件触发', manual: '手动触发', file: '文件监听', message: '消息触发', }; return (

{trigger.id}

{typeLabel[trigger.type] || trigger.type} {trigger.enabled ? '已启用' : '已禁用'}
); } export function TriggersPanel() { const { triggers, loadTriggers, isLoading, client } = useGatewayStore(); const [togglingTrigger, setTogglingTrigger] = useState(null); const [refreshing, setRefreshing] = useState(false); useEffect(() => { loadTriggers(); }, [loadTriggers]); const handleToggle = useCallback(async (id: string, enabled: boolean) => { setTogglingTrigger(id); try { // Call the gateway to toggle the trigger await client.request('triggers.toggle', { id, enabled }); // Reload triggers after toggle await loadTriggers(); } catch (error) { console.error('Failed to toggle trigger:', error); } finally { setTogglingTrigger(null); } }, [client, loadTriggers]); const handleRefresh = useCallback(async () => { setRefreshing(true); try { await loadTriggers(); } finally { setRefreshing(false); } }, [loadTriggers]); if (isLoading && triggers.length === 0) { return (
加载中...
); } if (triggers.length === 0) { return (

触发器 (Triggers)

暂无可用的触发器
); } // Count enabled/disabled triggers const enabledCount = triggers.filter(t => t.enabled).length; const totalCount = triggers.length; return (

触发器 (Triggers)

{enabledCount}/{totalCount} 已启用
{triggers.map((trigger) => ( ))}
); } export default TriggersPanel;