diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-documents-modal/add-documents-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-documents-modal/add-documents-modal.tsx
index f70b4f8c7ba..179b245afa4 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-documents-modal/add-documents-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-documents-modal/add-documents-modal.tsx
@@ -2,16 +2,13 @@
import { useCallback, useEffect, useState } from 'react'
import {
- Button,
ChipModal,
ChipModalBody,
ChipModalError,
ChipModalField,
ChipModalFooter,
ChipModalHeader,
- cn,
} from '@sim/emcn'
-import { Loader, RefreshCw, X } from '@sim/emcn/icons'
import { createLogger } from '@sim/logger'
import { useParams } from 'next/navigation'
import {
@@ -20,6 +17,7 @@ import {
} from '@/lib/uploads/client/admission'
import { formatFileSize, validateKnowledgeBaseFile } from '@/lib/uploads/utils/file-utils'
import { ACCEPT_ATTRIBUTE } from '@/lib/uploads/utils/validation'
+import { KnowledgeUploadRow } from '@/app/workspace/[workspaceId]/knowledge/components/knowledge-upload-row'
import { useKnowledgeUpload } from '@/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload'
const logger = createLogger('AddDocumentsModal')
@@ -177,56 +175,16 @@ export function AddDocumentsModal({
const isProcessing = fileStatus?.status === 'uploading' || isRetrying
return (
-
-
- {file.name}
-
-
- {formatFileSize(file.size)}
-
-
- {isProcessing ? (
-
- ) : (
- <>
- {isFailed && (
-
- )}
-
- >
- )}
-
-
+ name={file.name}
+ size={formatFileSize(file.size)}
+ error={isFailed && !isRetrying}
+ processing={isProcessing}
+ disabled={isUploading}
+ onRemove={() => removeFile(index)}
+ onRetry={isFailed ? () => handleRetryFile(index) : undefined}
+ />
)
})}
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 8e44fa13a90..3055844bae5 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
@@ -3,7 +3,6 @@
import { memo, useEffect, useState } from 'react'
import { zodResolver } from '@hookform/resolvers/zod'
import {
- Button,
Checkbox,
ChipCombobox,
ChipInput,
@@ -15,10 +14,8 @@ import {
ChipModalHeader,
ChipTextarea,
type ComboboxOption,
- cn,
toast,
} from '@sim/emcn'
-import { Loader, X } from '@sim/emcn/icons'
import { createLogger } from '@sim/logger'
import { getErrorMessage } from '@sim/utils/errors'
import { useParams } from 'next/navigation'
@@ -33,6 +30,7 @@ import {
} from '@/lib/uploads/client/admission'
import { formatFileSize, validateKnowledgeBaseFile } from '@/lib/uploads/utils/file-utils'
import { ACCEPT_ATTRIBUTE } from '@/lib/uploads/utils/validation'
+import { KnowledgeUploadRow } from '@/app/workspace/[workspaceId]/knowledge/components/knowledge-upload-row'
import { useKnowledgeUpload } from '@/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload'
import { useCreateKnowledgeBase, useDeleteKnowledgeBase } from '@/hooks/queries/kb/knowledge'
@@ -526,42 +524,15 @@ export const CreateBaseModal = memo(function CreateBaseModal({
const isProcessing = fileStatus?.status === 'uploading'
return (
-
-
- {file.name}
-
-
- {formatFileSize(file.size)}
-
-
- {isProcessing ? (
-
- ) : (
-
- )}
-
-
+ name={file.name}
+ size={formatFileSize(file.size)}
+ error={isFailed}
+ processing={isProcessing}
+ disabled={isUploading}
+ onRemove={() => removeFile(index)}
+ />
)
})}
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-upload-row.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-upload-row.tsx
new file mode 100644
index 00000000000..b338881fe75
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-upload-row.tsx
@@ -0,0 +1,70 @@
+import { Button, cn } from '@sim/emcn'
+import { Loader, RefreshCw, X } from '@sim/emcn/icons'
+
+interface KnowledgeUploadRowProps {
+ name: string
+ size: string
+ error: boolean
+ processing: boolean
+ disabled: boolean
+ onRemove: () => void
+ onRetry?: () => void
+}
+
+/** Selected-file presentation shared by knowledge creation and document uploads. */
+export function KnowledgeUploadRow({
+ name,
+ size,
+ error,
+ processing,
+ disabled,
+ onRemove,
+ onRetry,
+}: KnowledgeUploadRowProps) {
+ return (
+
+
+ {name}
+
+
{size}
+
+ {processing ? (
+
+ ) : (
+ <>
+ {onRetry && (
+
+ )}
+
+ >
+ )}
+
+
+ )
+}