import React from 'react'; import * as NiceModal from '@ebay/nice-modal-react'; import {Alert, Dialog, Flex, TextInput} from '@gravity-ui/uikit'; import {partitionsApi} from '../../../../../store/reducers/partitions/partitions'; import type {CommitOffsetParams} from '../../../../../store/reducers/partitions/types'; import {cn} from '../../../../../utils/cn'; import {BRAND_BUTTON_CLASS} from '../../../../../utils/constants'; import createToast from '../../../../../utils/createToast'; import {prepareCommonErrorMessage} from '../../../../../utils/errors'; import i18n from '../i18n'; const b = cn('ydb-specify-offset-dialog'); const SPECIFY_OFFSET_DIALOG = 'specify-offset-dialog'; type CommitOffsetParamsWithoutOffset = Omit; interface SpecifyOffsetDialogProps extends CommitOffsetParamsWithoutOffset { onClose: () => void; onSuccess: () => void; open: boolean; } function SpecifyOffsetDialog({ database, path, consumer, partitionId, onClose, onSuccess, open, }: SpecifyOffsetDialogProps) { const [offsetValue, setOffsetValue] = React.useState(''); const [validationError, setValidationError] = React.useState(); const [commitOffset, {isLoading, error}] = partitionsApi.useCommitOffsetMutation(); const inputRef = React.useRef(null); const handleOffsetChange = React.useCallback((value: string) => { setOffsetValue(value); setValidationError(undefined); }, []); const handleConfirm = React.useCallback(async () => { const numericOffset = Number(offsetValue.trim()); if (!offsetValue || !Number.isInteger(numericOffset) || numericOffset < 0) { setValidationError(i18n('error_invalid-offset')); return; } try { await commitOffset({ database, path, consumer, partitionId, offset: numericOffset, }).unwrap(); createToast({ name: 'commitOffset', content: i18n('alert_offset-moved'), theme: 'success', title: '', }); onSuccess(); } catch { // error is captured by the mutation hook state } }, [offsetValue, commitOffset, database, path, consumer, partitionId, onSuccess]); return ( {i18n('confirm_specify-offset', { partitionId: String(partitionId), consumer, })} {error ? ( ) : null} ); } type ShowSpecifyOffsetConfirmationParams = CommitOffsetParamsWithoutOffset; const SpecifyOffsetDialogNiceModal = NiceModal.create( (props: ShowSpecifyOffsetConfirmationParams) => { const modal = NiceModal.useModal(); const handleClose = React.useCallback(() => { modal.hide(); modal.remove(); }, [modal]); const handleSuccess = React.useCallback(() => { modal.resolve(true); handleClose(); }, [modal, handleClose]); return ( ); }, ); NiceModal.register(SPECIFY_OFFSET_DIALOG, SpecifyOffsetDialogNiceModal); export function showSpecifyOffsetConfirmation(params: ShowSpecifyOffsetConfirmationParams) { NiceModal.show(SPECIFY_OFFSET_DIALOG, { id: SPECIFY_OFFSET_DIALOG, ...params, }); }