import React, { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useAutomationSettings, useUpdateAutomationSettings, useMiniApps, useCreateMiniApp, useDeleteMiniApp, } from '@/api/automation'; import { Button } from '@/components/ui/Button'; import { Card } from '@/components/ui/Card'; import { Select } from '@/components/ui/Select'; import { Skeleton } from '@/components/ui/Skeleton'; import { useToast } from '@/components/ui/Toast'; import { Modal } from '@/components/ui/Modal'; import type { AutomationSettings as AutomationSettingsType, MiniAppDef } from '@/types/automation'; import { Save, AlertCircle, Plus, Trash2, AppWindow } from 'lucide-react'; const logLevelOptions = [ { value: 'debug', label: 'Debug' }, { value: 'info', label: 'Info' }, { value: 'warning', label: 'Warning' }, { value: 'error', label: 'Error' }, ]; export function AutomationSettingsPage() { const { t } = useTranslation(); const toast = useToast(); const { data: settings, isLoading, isError, refetch } = useAutomationSettings(); const updateMutation = useUpdateAutomationSettings(); const [form, setForm] = useState({ default_llm_model: '', heartbeat_default_interval: 0, max_concurrent_agents: 0, log_level: 'info', }); useEffect(() => { if (settings) { setForm({ default_llm_model: settings.default_llm_model || '', heartbeat_default_interval: settings.heartbeat_default_interval || 0, max_concurrent_agents: settings.max_concurrent_agents || 0, log_level: settings.log_level || 'info', }); } }, [settings]); const updateField = (key: K, value: AutomationSettingsType[K]) => { setForm((prev) => ({ ...prev, [key]: value })); }; const handleSave = async () => { try { await updateMutation.mutateAsync(form); toast.success(t('automation.settingsSaved')); } catch (err: any) { toast.error(err.message || t('common.error')); } }; const { data: miniapps, isLoading: miniappsLoading, refetch: refetchMiniapps } = useMiniApps(); const createMiniAppMutation = useCreateMiniApp(); const deleteMiniAppMutation = useDeleteMiniApp(); const [showMiniAppForm, setShowMiniAppForm] = useState(false); const [miniAppForm, setMiniAppForm] = useState({ app_id: '', name: '', icon: 'AppWindow', description: '', render_schema: '{}', }); const handleCreateMiniApp = async () => { try { let render_schema = {}; try { render_schema = JSON.parse(miniAppForm.render_schema); } catch { toast.error(t('common.invalidJson')); return; } await createMiniAppMutation.mutateAsync({ app_id: miniAppForm.app_id, name: miniAppForm.name, icon: miniAppForm.icon, description: miniAppForm.description, render_schema, }); toast.success(t('automation.miniAppCreated')); setShowMiniAppForm(false); setMiniAppForm({ app_id: '', name: '', icon: 'AppWindow', description: '', render_schema: '{}' }); refetchMiniapps(); } catch (err: any) { toast.error(err.message || t('common.error')); } }; const handleDeleteMiniApp = async (appId: string) => { try { await deleteMiniAppMutation.mutateAsync(appId); toast.success(t('automation.miniAppDeleted')); refetchMiniapps(); } catch (err: any) { toast.error(err.message || t('common.error')); } }; return (

{t('automation.settingsTitle')}

{t('automation.settingsSubtitle')}

{isLoading && (
{[1, 2, 3, 4].map((i) => ( ))}
)} {isError && (
{t('common.errorLoading')}
)} {!isLoading && !isError && (
{/* Default LLM Model */}
updateField('default_llm_model', e.target.value)} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500" placeholder="gpt-4" />

{t('automation.defaultLlmModelHint')}

{/* Heartbeat Default Interval */}
updateField('heartbeat_default_interval', parseInt(e.target.value) || 0)} min={0} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500" />

{t('automation.heartbeatDefaultIntervalHint')}

{/* Max Concurrent Agents */}
updateField('max_concurrent_agents', parseInt(e.target.value) || 0)} min={0} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-primary-500" />

{t('automation.maxConcurrentAgentsHint')}

{/* Log Level */}
setMiniAppForm({ ...miniAppForm, app_id: e.target.value })} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm" placeholder="my_custom_app" />
setMiniAppForm({ ...miniAppForm, name: e.target.value })} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm" placeholder="My Custom App" />
setMiniAppForm({ ...miniAppForm, icon: e.target.value })} className="w-full rounded-lg border border-secondary-300 px-3 py-2 text-sm" placeholder="AppWindow" />