import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/src/components/ui/card"; import { showErrorToast } from "@/src/features/notifications/showErrorToast"; import { z } from "zod/v4"; import { parseCsvClient } from "@/src/features/datasets/lib/csv/helpers"; import { DialogBody } from "@/src/components/ui/dialog"; import { Dropzone, DropzoneEmptyState, } from "@/src/components/ui/shadcn-io/dropzone"; import type { CsvPreviewResult } from "@/src/features/datasets/lib/csv/types"; export const MAX_FILE_SIZE_BYTES = 1024 * 1024 * 1 * 10; // 10MB const ACCEPTED_FILE_TYPES = ["text/csv"] as const; const FileSchema = z.object({ type: z.enum([...ACCEPTED_FILE_TYPES]), size: z.number().min(1), }); export const UploadDatasetCsv = ({ setPreview, setCsvFile, }: { setPreview: (preview: CsvPreviewResult | null) => void; setCsvFile: (file: File | null) => void; }) => { const handleFiles = async (files: File[]) => { const file = files[0]; if (!file) return; const result = FileSchema.safeParse(file); if (!result.success) { showErrorToast("Invalid file type", "Please select a valid CSV file"); return; } if (file.size > MAX_FILE_SIZE_BYTES) { showErrorToast("File too large", "Maximum file size is 10MB"); return; } try { setCsvFile(file); const preview = await parseCsvClient(file, { isPreview: true, collectSamples: true, }); if (!Boolean(preview.columns.length)) { showErrorToast("Invalid CSV", "CSV must have at least 1 column"); return; } setPreview(preview); } catch (error) { showErrorToast( "Failed to parse CSV", error instanceof Error ? error.message : "Unknown error", ); } }; return ( Add items to dataset Add items to dataset by uploading a file, add items manually or via our SDKs/API ); };