| import { useStore } from '@nanostores/react'; | |
| import { toast } from 'features/toast/toast'; | |
| import { useCallback } from 'react'; | |
| import { useTranslation } from 'react-i18next'; | |
| import { useCancelByBatchIdsMutation, useGetBatchStatusQuery } from 'services/api/endpoints/queue'; | |
| import { $isConnected } from 'services/events/stores'; | |
| export const useCancelBatch = (batch_id: string) => { | |
| const isConnected = useStore($isConnected); | |
| const { isCanceled } = useGetBatchStatusQuery( | |
| { batch_id }, | |
| { | |
| selectFromResult: ({ data }) => { | |
| if (!data) { | |
| return { isCanceled: true }; | |
| } | |
| return { | |
| isCanceled: data?.in_progress === 0 && data?.pending === 0, | |
| }; | |
| }, | |
| } | |
| ); | |
| const [trigger, { isLoading }] = useCancelByBatchIdsMutation({ | |
| fixedCacheKey: 'cancelByBatchIds', | |
| }); | |
| const { t } = useTranslation(); | |
| const cancelBatch = useCallback(async () => { | |
| if (isCanceled) { | |
| return; | |
| } | |
| try { | |
| await trigger({ batch_ids: [batch_id] }).unwrap(); | |
| toast({ | |
| id: 'CANCEL_BATCH_SUCCEEDED', | |
| title: t('queue.cancelBatchSucceeded'), | |
| status: 'success', | |
| }); | |
| } catch { | |
| toast({ | |
| id: 'CANCEL_BATCH_FAILED', | |
| title: t('queue.cancelBatchFailed'), | |
| status: 'error', | |
| }); | |
| } | |
| }, [batch_id, isCanceled, t, trigger]); | |
| return { cancelBatch, isLoading, isCanceled, isDisabled: !isConnected }; | |
| }; | |