From f530893f2f435fd8fee0687852b4d9c44afa7593 Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Wed, 1 Jul 2026 18:47:40 -0700 Subject: [PATCH 1/2] improvement(knowledge): make KB modals toast-only for errors --- .../create-base-modal/create-base-modal.tsx | 24 +++---------- .../edit-knowledge-base-modal.tsx | 36 +++---------------- apps/sim/hooks/queries/kb/knowledge.ts | 3 ++ 3 files changed, 11 insertions(+), 52 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx index 25b37a670b9..1a1280bccb4 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx @@ -9,7 +9,6 @@ import { ChipInput, ChipModal, ChipModalBody, - ChipModalError, ChipModalField, ChipModalFooter, ChipModalHeader, @@ -119,11 +118,6 @@ const FormSchema = z type FormInputValues = z.input type FormValues = z.output -interface SubmitStatus { - type: 'success' | 'error' - message: string -} - export const CreateBaseModal = memo(function CreateBaseModal({ open, onOpenChange, @@ -134,11 +128,10 @@ export const CreateBaseModal = memo(function CreateBaseModal({ const createKnowledgeBaseMutation = useCreateKnowledgeBase(workspaceId) const deleteKnowledgeBaseMutation = useDeleteKnowledgeBase(workspaceId) - const [submitStatus, setSubmitStatus] = useState(null) const [files, setFiles] = useState([]) const [fileError, setFileError] = useState(null) - const { uploadFiles, isUploading, uploadProgress, uploadError, clearError } = useKnowledgeUpload({ + const { uploadFiles, isUploading, uploadProgress, clearError } = useKnowledgeUpload({ workspaceId, }) @@ -178,7 +171,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ useEffect(() => { if (open) { - setSubmitStatus(null) setFileError(null) setFiles([]) reset({ @@ -241,8 +233,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ } const onSubmit = async (data: FormValues) => { - setSubmitStatus(null) - try { const strategyOptions: StrategyOptions | undefined = data.strategy === 'regex' && data.regexPattern @@ -289,7 +279,8 @@ export const CreateBaseModal = memo(function CreateBaseModal({ } catch (deleteError) { logger.error('Failed to delete orphaned knowledge base:', deleteError) } - throw uploadError + toast.error(getErrorMessage(uploadError, 'Failed to upload files')) + return } } @@ -298,10 +289,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ handleClose(false) } catch (error) { logger.error('Error creating knowledge base:', error) - setSubmitStatus({ - type: 'error', - message: getErrorMessage(error, 'An unknown error occurred'), - }) } } @@ -334,7 +321,7 @@ export const CreateBaseModal = memo(function CreateBaseModal({ /> - + )} - - {uploadError?.message || submitStatus?.message} (null) - const [descriptionError, setDescriptionError] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) - const [error, setError] = useState(null) /** * Seed the fields only on the closed → open transition (render-phase reset), @@ -56,34 +51,16 @@ export const EditKnowledgeBaseModal = memo(function EditKnowledgeBaseModal({ if (open) { setName(initialName) setDescription(initialDescription) - setNameError(null) - setDescriptionError(null) - setError(null) } } const validate = (): string | null => { - let firstError: string | null = null - - if (!name.trim()) { - setNameError('Name is required') - firstError ??= 'Name is required' - } else if (name.trim().length > 100) { - setNameError('Name must be less than 100 characters') - firstError ??= 'Name must be less than 100 characters' - } else { - setNameError(null) - } - + if (!name.trim()) return 'Name is required' + if (name.trim().length > 100) return 'Name must be less than 100 characters' if (description.length > KNOWLEDGE_BASE_DESCRIPTION_MAX_LENGTH) { - const message = `Description must be ${KNOWLEDGE_BASE_DESCRIPTION_MAX_LENGTH} characters or less` - setDescriptionError(message) - firstError ??= message - } else { - setDescriptionError(null) + return `Description must be ${KNOWLEDGE_BASE_DESCRIPTION_MAX_LENGTH} characters or less` } - - return firstError + return null } const handleSubmit = async () => { @@ -94,14 +71,12 @@ export const EditKnowledgeBaseModal = memo(function EditKnowledgeBaseModal({ } setIsSubmitting(true) - setError(null) try { await onSave(knowledgeBaseId, name.trim(), description.trim()) onOpenChange(false) } catch (err) { logger.error('Error updating knowledge base:', err) - setError(getErrorMessage(err, 'Failed to update knowledge base')) } finally { setIsSubmitting(false) } @@ -121,7 +96,6 @@ export const EditKnowledgeBaseModal = memo(function EditKnowledgeBaseModal({ onChange={setName} placeholder='Enter knowledge base name' required - error={nameError ?? undefined} autoComplete='off' /> {chunkingConfig && ( @@ -166,7 +139,6 @@ export const EditKnowledgeBaseModal = memo(function EditKnowledgeBaseModal({ )} - {error} onOpenChange(false)} diff --git a/apps/sim/hooks/queries/kb/knowledge.ts b/apps/sim/hooks/queries/kb/knowledge.ts index 03b5d91afc8..0620d8c1d3f 100644 --- a/apps/sim/hooks/queries/kb/knowledge.ts +++ b/apps/sim/hooks/queries/kb/knowledge.ts @@ -619,6 +619,9 @@ export function useCreateKnowledgeBase(workspaceId?: string) { return useMutation({ mutationFn: createKnowledgeBase, + onError: (error) => { + toast.error(error.message, { duration: 5000 }) + }, onSettled: () => { queryClient.invalidateQueries({ queryKey: knowledgeKeys.lists(), From 815278f82f388fa4a5615631ff8888e6518d1509 Mon Sep 17 00:00:00 2001 From: Theodore Li Date: Wed, 1 Jul 2026 19:12:08 -0700 Subject: [PATCH 2/2] improvement(knowledge): drop field highlighting for uniform toast-only errors --- .../create-base-modal/create-base-modal.tsx | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx index 1a1280bccb4..781a0fbaafc 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-base-modal/create-base-modal.tsx @@ -142,14 +142,11 @@ export const CreateBaseModal = memo(function CreateBaseModal({ onOpenChange(open) } - const { - register, - handleSubmit, - reset, - watch, - setValue, - formState: { errors }, - } = useForm({ + const { register, handleSubmit, reset, watch, setValue } = useForm< + FormInputValues, + unknown, + FormValues + >({ resolver: zodResolver(FormSchema), defaultValues: { name: '', @@ -228,7 +225,7 @@ export const CreateBaseModal = memo(function CreateBaseModal({ (fieldError) => typeof fieldError?.message === 'string' )?.message toast.error( - typeof firstMessage === 'string' ? firstMessage : 'Please fix the highlighted fields' + typeof firstMessage === 'string' ? firstMessage : 'Please fix the errors and try again' ) } @@ -312,7 +309,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ @@ -339,7 +334,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ step={1} placeholder='100' {...register('minChunkSize', { valueAsNumber: true })} - error={Boolean(errors.minChunkSize)} autoComplete='off' data-form-type='other' /> @@ -353,7 +347,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ step={1} placeholder='1024' {...register('maxChunkSize', { valueAsNumber: true })} - error={Boolean(errors.maxChunkSize)} autoComplete='off' data-form-type='other' /> @@ -372,7 +365,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({ step={1} placeholder='200' {...register('overlapSize', { valueAsNumber: true })} - error={Boolean(errors.overlapSize)} autoComplete='off' data-form-type='other' /> @@ -402,7 +394,6 @@ export const CreateBaseModal = memo(function CreateBaseModal({