import React, { useCallback, useEffect } from 'react'; import { Button } from '@/components/button/button'; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/dialog/dialog'; import { DialogProps } from '@radix-ui/react-dialog'; import { ToggleGroup, ToggleGroupItem } from '@/components/toggle/toggle-group'; import { DatabaseType } from '@/lib/domain/database-type'; import { getDatabaseLogo } from '@/lib/databases'; import { CodeSnippet } from '@/components/code-snippet/code-snippet'; import { Textarea } from '@/components/textarea/textarea'; import { useStorage } from '@/hooks/use-storage'; import { loadFromDatabaseMetadata } from '@/lib/domain/diagram'; import { useCreateDiagramDialog } from '@/hooks/use-create-diagram-dialog'; import { useNavigate } from 'react-router-dom'; import { useConfig } from '@/hooks/use-config'; import { DatabaseMetadata, loadDatabaseMetadata, } from '@/lib/data/import-metadata/metadata-types/database-metadata'; enum CreateDiagramDialogStep { SELECT_DATABASE = 'SELECT_DATABASE', IMPORT_DATABASE = 'IMPORT_DATABASE', } export interface CreateDiagramDialogProps { dialog: DialogProps; } export const CreateDiagramDialog: React.FC = ({ dialog, }) => { const [databaseType, setDatabaseType] = React.useState( DatabaseType.GENERIC ); const { closeCreateDiagramDialog } = useCreateDiagramDialog(); const { updateConfig } = useConfig(); const [scriptResult, setScriptResult] = React.useState(''); const [step, setStep] = React.useState( CreateDiagramDialogStep.SELECT_DATABASE ); const { listDiagrams, addDiagram } = useStorage(); const [diagramNumber, setDiagramNumber] = React.useState(1); const navigate = useNavigate(); useEffect(() => { const fetchDiagrams = async () => { const diagrams = await listDiagrams(); setDiagramNumber(diagrams.length + 1); }; fetchDiagrams(); }, [listDiagrams, setDiagramNumber]); const createNewDiagram = useCallback(async () => { const databaseMetadata: DatabaseMetadata = loadDatabaseMetadata(scriptResult); const diagram = loadFromDatabaseMetadata({ databaseType, databaseMetadata, diagramNumber, }); await addDiagram({ diagram }); await updateConfig({ defaultDiagramId: diagram.id }); closeCreateDiagramDialog(); navigate(`/diagrams/${diagram.id}`); }, [ databaseType, addDiagram, closeCreateDiagramDialog, navigate, updateConfig, scriptResult, diagramNumber, ]); const renderDatabaseOption = useCallback((type: DatabaseType) => { const logo = getDatabaseLogo(type); return ( PostgreSQL ); }, []); const renderHeader = useCallback(() => { switch (step) { case CreateDiagramDialogStep.SELECT_DATABASE: return ( What is your Database? Each database has its own unique features and capabilities. ); case CreateDiagramDialogStep.IMPORT_DATABASE: return ( Import your Database ); default: return null; } }, [step]); const renderContent = useCallback(() => { switch (step) { case CreateDiagramDialogStep.SELECT_DATABASE: return (
{ if (!value) { setDatabaseType(DatabaseType.GENERIC); } else { setDatabaseType(value); setStep( CreateDiagramDialogStep.IMPORT_DATABASE ); } }} type="single" className="grid grid-cols-3 grid-flow-row gap-6 xl:grid-cols-5" > {renderDatabaseOption(DatabaseType.MYSQL)} {renderDatabaseOption(DatabaseType.POSTGRESQL)} {renderDatabaseOption(DatabaseType.MARIADB)} {renderDatabaseOption(DatabaseType.SQLITE)} {renderDatabaseOption(DatabaseType.SQL_SERVER)}
); case CreateDiagramDialogStep.IMPORT_DATABASE: return (

1. Run this script in your database:

2. Paste the script result here: