From 1d94821459761aaba4a20c02acf972802c1746a6 Mon Sep 17 00:00:00 2001 From: Duc Nguyen Date: Tue, 7 Apr 2026 16:28:05 +0700 Subject: [PATCH 1/2] fix(desktop): add defaultValues to useForm to prevent crash on dialog open MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit McpFormDialog, AgentFormDialog, and TeamSettingsModal used useForm() without defaultValues, relying on reset() in useEffect. On first render when dialog opens, watch() returns undefined — calling .trim() on it crashes with "undefined is not an object". Closes #732, closes #735 --- ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx | 1 + ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx | 1 + ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx | 1 + 3 files changed, 3 insertions(+) diff --git a/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx b/ui/desktop/frontend/src/components/agents/AgentFormDialog.tsx index 223b4d8db..f4760c725 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/mcp/McpFormDialog.tsx b/ui/desktop/frontend/src/components/mcp/McpFormDialog.tsx index eb3b52533..3f35ea73f 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/teams/TeamSettingsModal.tsx b/ui/desktop/frontend/src/components/teams/TeamSettingsModal.tsx index 048f14ca1..6d3bd0e4d 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(() => { From c76b034444c2316e44e8b6d08fa9c281d613d51c Mon Sep 17 00:00:00 2001 From: Duc Nguyen Date: Tue, 7 Apr 2026 16:32:52 +0700 Subject: [PATCH 2/2] fix(desktop): add defaultValues to ChannelFormDialog and ProviderFormDialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same root cause as the previous commit — useForm() without defaultValues causes watch() to return undefined on first render. --- .../frontend/src/components/channels/ChannelFormDialog.tsx | 1 + .../frontend/src/components/providers/ProviderFormDialog.tsx | 1 + 2 files changed, 2 insertions(+) diff --git a/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx b/ui/desktop/frontend/src/components/channels/ChannelFormDialog.tsx index 03c65e1f8..26da967e8 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/providers/ProviderFormDialog.tsx b/ui/desktop/frontend/src/components/providers/ProviderFormDialog.tsx index 04b389fd7..f8043b630 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