import React from 'react'; import {ArrowsOppositeToDots} from '@gravity-ui/icons'; import {Icon} from '@gravity-ui/uikit'; import type {ButtonProps} from '@gravity-ui/uikit'; import {isNil} from 'lodash'; import { useDiskPagesAvailable, useTabletDevUiSecurePath, } from '../../store/reducers/capabilities/hooks'; import type {ModifyDiskResponse} from '../../types/api/modifyDisk'; import type {TVDiskID} from '../../types/api/vdisk'; import {BRAND_BUTTON_CLASS} from '../../utils/constants'; import {useIsUserAllowedToMakeChanges} from '../../utils/hooks/useIsUserAllowedToMakeChanges'; import {ButtonWithConfirmDialog} from '../ButtonWithConfirmDialog/ButtonWithConfirmDialog'; import {evictVDiskButtonKeyset} from './i18n'; interface EvictVDiskButtonProps { vDiskId: Required; donorMode?: boolean; fullWidth?: boolean; view?: ButtonProps['view']; onSuccess?: (isDialogOpen: boolean) => void; onDialogOpen?: () => VoidFunction; } export function isAllVdiskParamsDefined(vDiskId?: TVDiskID): vDiskId is Required { return ( !isNil(vDiskId?.GroupID) && !isNil(vDiskId?.GroupGeneration) && !isNil(vDiskId?.Ring) && !isNil(vDiskId?.Domain) && !isNil(vDiskId?.VDisk) ); } export const EvictVDiskButton = ({ vDiskId, donorMode, fullWidth, view = 'normal', onSuccess, onDialogOpen, }: EvictVDiskButtonProps) => { const isUserAllowedToMakeChanges = useIsUserAllowedToMakeChanges(); const newDiskApiAvailable = useDiskPagesAvailable(); const useSecurePath = useTabletDevUiSecurePath(); const handleEvictVDisk = React.useCallback( async (isRetry?: boolean) => { const requestParams = { groupId: vDiskId.GroupID, groupGeneration: vDiskId.GroupGeneration, failRealmIdx: vDiskId.Ring, failDomainIdx: vDiskId.Domain, vDiskIdx: vDiskId.VDisk, force: isRetry, }; let response: ModifyDiskResponse; if (newDiskApiAvailable) { response = await window.api.vdisk.evictVDisk(requestParams); } else { response = await window.api.tablets.evictVDiskOld({ ...requestParams, useSecurePath, }); } if (response?.result === false) { const err = { statusText: response.error, retryPossible: response.forceRetryPossible, }; throw err; } }, [vDiskId, newDiskApiAvailable, useSecurePath], ); return ( {evictVDiskButtonKeyset('action_evict')} ); };