From 329b150902e265c9ed16f1cf3d278eed07c79aca Mon Sep 17 00:00:00 2001 From: Duc Nguyen Date: Wed, 8 Apr 2026 15:26:33 +0700 Subject: [PATCH] fix(desktop): add defaultValues to form dialogs to prevent crash (#737) useForm() without defaultValues causes watch() to return undefined on first render, crashing with undefined.trim(). Adds defaultValues to all 5 affected dialogs: Agent, Channel, MCP, Provider, TeamSettings. Closes #732, closes #735 --- ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx | 1 + .../frontend/src/components/channels/ChannelFormDialog.tsx | 1 + ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx | 1 + .../frontend/src/components/providers/ProviderFormDialog.tsx | 1 + ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx | 1 + 5 files changed, 5 insertions(+) diff --git a/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx b/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx index 223b4d8d..f4760c72 100644 --- a/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx +++ b/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx @@ -25,6 +25,7 @@ export function AgentFormDialog({ open, onOpenChange, agent, onSubmit }: AgentFo const { register, handleSubmit, watch, setValue, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(agentFormSchema), mode: 'onChange', + defaultValues: { displayName: '', emoji: '🦊', agentKey: '', providerName: '', model: '', description: '', isDefault: false }, }) // UI-only state (not form data) diff --git a/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx b/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx index 03c65e1f..26da967e 100644 --- a/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx +++ b/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx @@ -25,6 +25,7 @@ export function ChannelFormDialog({ open, onOpenChange, agents, telegramExists, const { handleSubmit, watch, setValue, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(channelFormSchema), mode: 'onChange', + defaultValues: { displayName: '', channelType: '', agentId: '', enabled: true, credentials: {} }, }) const channelType = watch('channelType') diff --git a/ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx b/ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx index eb3b5253..3f35ea73 100644 --- a/ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx +++ b/ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx @@ -26,6 +26,7 @@ export function McpFormDialog({ open, onOpenChange, server, onSubmit, onTest }: const { register, handleSubmit, watch, setValue, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(mcpFormSchema), mode: 'onChange', + defaultValues: { name: '', displayName: '', transport: 'stdio', command: '', args: '', url: '', headers: {}, env: {}, toolPrefix: '', timeoutSec: 30, enabled: true }, }) // Test connection state (UI-only, not form data) diff --git a/ui/desktop/frontend/src/components/providers/ProviderFormDialog.tsx b/ui/desktop/frontend/src/components/providers/ProviderFormDialog.tsx index 04b389fd..f8043b63 100644 --- a/ui/desktop/frontend/src/components/providers/ProviderFormDialog.tsx +++ b/ui/desktop/frontend/src/components/providers/ProviderFormDialog.tsx @@ -23,6 +23,7 @@ export function ProviderFormDialog({ open, onOpenChange, provider, onSubmit }: P const { register, handleSubmit, watch, setValue, reset, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(providerFormSchema), mode: 'onChange', + defaultValues: { providerType: '', displayName: '', apiBase: '', apiKey: '', enabled: true }, }) // Reset form when dialog opens diff --git a/ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx b/ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx index 048f14ca..6d3bd0e4 100644 --- a/ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx +++ b/ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx @@ -35,6 +35,7 @@ export function TeamSettingsModal({ teamId, onClose, onSaved }: TeamSettingsModa const { watch, setValue, reset, handleSubmit, formState: { isSubmitting } } = useForm({ resolver: zodResolver(teamSettingsSchema), mode: 'onChange', + defaultValues: { name: '', description: '', notify: { dispatched: true, progress: true, failed: true, completed: true, new_task: true }, notifyMode: 'direct' }, }) useEffect(() => {