import React from 'react'; import NiceModal from '@ebay/nice-modal-react'; import {Button, Dialog, TextInput} from '@gravity-ui/uikit'; import type {SavedQuery} from '../../../../types/store/query'; import {cn} from '../../../../utils/cn'; import {BRAND_BUTTON_CLASS} from '../../../../utils/constants'; import {getQueryNameValidationError} from '../utils/QueryNameValidation'; import {hasSavedQueryNameCollision} from '../utils/savedQueries'; import i18n from './i18n'; import './SaveChangesDialog.scss'; const b = cn('ydb-save-changes-dialog'); export const SAVE_CHANGES_DIALOG = 'save-changes-dialog'; export interface SaveChangesDialogOptions { defaultQueryName: string; existingQueryName?: string; queryBody: string; savedQueries: SavedQuery[]; onSaveQuery: (name: string, body: string) => boolean; } interface SaveChangesDialogProps extends SaveChangesDialogOptions { open: boolean; onDontSave: () => void; onCancel: () => void; onSave: (queryName: string) => void; } function SaveChangesDialog({ open, onDontSave, onCancel, onSave, defaultQueryName, existingQueryName, savedQueries, }: SaveChangesDialogProps) { const [queryName, setQueryName] = React.useState(defaultQueryName); const [validationError, setValidationError] = React.useState(); const controlRef = React.useRef(null); const validateQueryName = React.useCallback( (value: string) => { const queryNameValidationError = getQueryNameValidationError(value); if (queryNameValidationError) { return i18n('error.name-not-empty'); } if (hasSavedQueryNameCollision(savedQueries, existingQueryName ?? '', value)) { return i18n('error.name-exists'); } return undefined; }, [existingQueryName, savedQueries], ); const handleQueryNameChange = React.useCallback((value: string) => { setQueryName(value); setValidationError(undefined); }, []); const handleSubmit = React.useCallback(() => { const error = validateQueryName(queryName); setValidationError(error); if (!error) { onSave(queryName.trim()); } }, [queryName, validateQueryName, onSave]); return (
{ e.preventDefault(); handleSubmit(); }} >
{i18n('description')}
); } export const SaveChangesDialogNiceModal = NiceModal.create((props: SaveChangesDialogOptions) => { const modal = NiceModal.useModal(); const handleClose = React.useCallback(() => { modal.hide(); modal.remove(); }, [modal]); const handleDontSave = React.useCallback(() => { modal.resolve(true); handleClose(); }, [modal, handleClose]); const handleCancel = React.useCallback(() => { modal.resolve(false); handleClose(); }, [modal, handleClose]); const handleSave = React.useCallback( (queryName: string) => { if (!props.onSaveQuery(queryName, props.queryBody)) { return; } modal.resolve(true); handleClose(); }, [handleClose, modal, props], ); return ( ); }); NiceModal.register(SAVE_CHANGES_DIALOG, SaveChangesDialogNiceModal); export async function getSaveChangesConfirmation( options: SaveChangesDialogOptions, ): Promise { return await NiceModal.show(SAVE_CHANGES_DIALOG, { id: SAVE_CHANGES_DIALOG, ...options, }); }