import { Field, Fieldset, Label, Legend } from "@catalyst/fieldset"; import { Radio, RadioField, RadioGroup } from "@catalyst/radio"; import React, { useRef, useState } from "react"; import { Input } from "@catalyst/input"; import { Button } from "@catalyst/button"; import { enqueueSnackbar } from "notistack"; import { useNavigate } from "@tanstack/react-router"; import { CloudArrowUpIcon, DocumentCheckIcon } from "@heroicons/react/24/solid"; import { XMarkIcon } from "@heroicons/react/24/outline"; import { useCreateConnection, useCreateFileConnection } from "@/hooks"; import { DatabaseFileType } from "@components/Library/types"; function classNames(...classes: string[]) { return classes.filter(Boolean).join(" "); } const FileDragAndDrop = ({ currentFile, setFile, fileTypeLabel, }: { currentFile: File | undefined; setFile: (file: File | undefined) => void; fileTypeLabel: string; }) => { const [dragActive, setDragActive] = useState(false); const fileInputRef = useRef(null); const handleFileClick = () => { if (fileInputRef.current) { fileInputRef.current.click(); } }; const handleFileChange = (event: React.ChangeEvent) => { const files = event.target.files; if (files && files.length > 0) { setFile(files[0]); } }; const handleDrop = (event: React.DragEvent) => { event.preventDefault(); event.stopPropagation(); setDragActive(false); if (event.dataTransfer.files && event.dataTransfer.files[0]) { setFile(event.dataTransfer.files[0]); } }; function handleDragLeave(event: React.DragEvent) { event.preventDefault(); event.stopPropagation(); setDragActive(false); } function handleDragOver(event: React.DragEvent) { event.preventDefault(); event.stopPropagation(); setDragActive(true); } function handleDragEnter(event: React.DragEvent) { event.preventDefault(); event.stopPropagation(); setDragActive(true); } return (

{currentFile && currentFile.name}

); }; type RadioValue = DatabaseFileType | "database" | null; const fileTypeLabelMap: { [K in DatabaseFileType]: string } = { sqlite: "SQLite data file", csv: "CSV file", sas7bdat: "sas7bdat file", excel: "Excel file", }; const ConnectionCreator = ({ name = null }: { name: string | null }) => { const [selectedRadio, setSelectedRadio] = useState(null); const [dsn, setDsn] = useState(null); const [file, setFile] = useState(); const { mutate: createConnection, isPending } = useCreateConnection(); const { mutate: createFileConnection, isPending: isFilePending } = useCreateFileConnection(); const navigate = useNavigate(); const handleCustomCreate = async () => { // Call api with name and dsn if (!name || !dsn) { enqueueSnackbar({ variant: "info", message: "Please enter a name and dsn for this connection", }); return; } createConnection( { dsn, name, isSample: false }, { onSuccess: () => { enqueueSnackbar({ variant: "success", message: "Connection created", }); navigate({ to: "/" }); }, } ); }; const handleFileCreate = async (type: DatabaseFileType) => { if (!file) { enqueueSnackbar({ variant: "info", message: "Please add a file", }); return; } if (!name) { enqueueSnackbar({ variant: "info", message: "Please add a name", }); return; } // Limit file size to 500MB if (file.size > 1024 * 1024 * 500) { enqueueSnackbar({ variant: "info", message: "File size exceeds 500MB limit", }); return; } createFileConnection( { file, name, type }, { onSuccess: () => { enqueueSnackbar({ variant: "success", message: "Connection created", }); navigate({ to: "/" }); }, } ); }; return ( <>
Create a custom connection setSelectedRadio(selection as RadioValue) } >
{selectedRadio === "database" ? (
setDsn(e.target.value)} />
) : ( selectedRadio && (
) )}
); }; export default ConnectionCreator;