import React, { useCallback, useEffect, useState } from 'react'; import { Dialog, DialogContent } from '@/components/dialog/dialog'; import { DatabaseType } from '@/lib/domain/database-type'; import { useStorage } from '@/hooks/use-storage'; import type { Diagram } from '@/lib/domain/diagram'; import { loadFromDatabaseMetadata } from '@/lib/domain/diagram'; import { useNavigate } from 'react-router-dom'; import { useConfig } from '@/hooks/use-config'; import type { DatabaseMetadata } from '@/lib/data/import-metadata/metadata-types/database-metadata'; import { loadDatabaseMetadata } from '@/lib/data/import-metadata/metadata-types/database-metadata'; import { generateDiagramId } from '@/lib/utils'; import { useChartDB } from '@/hooks/use-chartdb'; import { useDialog } from '@/hooks/use-dialog'; import type { DatabaseEdition } from '@/lib/domain/database-edition'; import { SelectDatabase } from './select-database/select-database'; import { CreateDiagramDialogStep } from './create-diagram-dialog-step'; import { ImportDatabase } from '../common/import-database/import-database'; import { useTranslation } from 'react-i18next'; import type { BaseDialogProps } from '../common/base-dialog-props'; export interface CreateDiagramDialogProps extends BaseDialogProps {} export const CreateDiagramDialog: React.FC = ({ dialog, }) => { const { diagramId } = useChartDB(); const { t } = useTranslation(); const [databaseType, setDatabaseType] = useState( DatabaseType.GENERIC ); const { closeCreateDiagramDialog } = useDialog(); const { updateConfig } = useConfig(); const [scriptResult, setScriptResult] = useState(''); const [databaseEdition, setDatabaseEdition] = useState< DatabaseEdition | undefined >(); const [step, setStep] = useState( CreateDiagramDialogStep.SELECT_DATABASE ); const { listDiagrams, addDiagram } = useStorage(); const [diagramNumber, setDiagramNumber] = useState(1); const navigate = useNavigate(); useEffect(() => { const fetchDiagrams = async () => { const diagrams = await listDiagrams(); setDiagramNumber(diagrams.length + 1); }; fetchDiagrams(); }, [listDiagrams, setDiagramNumber, dialog.open]); useEffect(() => { setStep(CreateDiagramDialogStep.SELECT_DATABASE); setDatabaseType(DatabaseType.GENERIC); setDatabaseEdition(undefined); setScriptResult(''); }, [dialog.open]); const hasExistingDiagram = (diagramId ?? '').trim().length !== 0; const importNewDiagram = useCallback(async () => { const databaseMetadata: DatabaseMetadata = loadDatabaseMetadata(scriptResult); const diagram = await loadFromDatabaseMetadata({ databaseType, databaseMetadata, diagramNumber, databaseEdition: databaseEdition?.trim().length === 0 ? undefined : databaseEdition, }); await addDiagram({ diagram }); await updateConfig({ defaultDiagramId: diagram.id }); closeCreateDiagramDialog(); navigate(`/diagrams/${diagram.id}`); }, [ databaseType, addDiagram, databaseEdition, closeCreateDiagramDialog, navigate, updateConfig, scriptResult, diagramNumber, ]); const createEmptyDiagram = useCallback(async () => { const diagram: Diagram = { id: generateDiagramId(), name: `Diagram ${diagramNumber}`, databaseType: databaseType ?? DatabaseType.GENERIC, databaseEdition: databaseEdition?.trim().length === 0 ? undefined : databaseEdition, createdAt: new Date(), updatedAt: new Date(), }; await addDiagram({ diagram }); await updateConfig({ defaultDiagramId: diagram.id }); closeCreateDiagramDialog(); navigate(`/diagrams/${diagram.id}`); }, [ databaseType, addDiagram, databaseEdition, closeCreateDiagramDialog, navigate, updateConfig, diagramNumber, ]); return ( { if (!hasExistingDiagram) { return; } if (!open) { closeCreateDiagramDialog(); } }} > {step === CreateDiagramDialogStep.SELECT_DATABASE ? ( setStep(CreateDiagramDialogStep.IMPORT_DATABASE) } /> ) : ( setStep(CreateDiagramDialogStep.SELECT_DATABASE) } setScriptResult={setScriptResult} title={t('new_diagram_dialog.import_database.title')} /> )} ); };