Files
tnsu-approval-route/frontend/src/webparts/approvalAdmin/hooks/useAsyncSubmit.ts
T
2026-07-29 17:08:52 +05:00

31 lines
1.1 KiB
TypeScript

import * as React from 'react';
import { ApiClientError } from '../services/httpClient';
export interface AsyncSubmit {
isBusy: boolean;
error?: string;
/** Показать ошибку без запроса — например, результат валидации формы. */
fail: (message: string) => void;
run: (action: () => Promise<void>) => void;
}
/**
* Состояние вокруг одного пишущего запроса: «выполняется» + текст ошибки.
* Используется формами и подтверждением удаления, чтобы не дублировать
* setBusy/setError/finally в каждом экране.
*/
export function useAsyncSubmit(): AsyncSubmit {
const [isBusy, setIsBusy] = React.useState(false);
const [error, setError] = React.useState<string | undefined>();
const run = (action: () => Promise<void>): void => {
setIsBusy(true);
setError(undefined);
action()
.catch((e: ApiClientError) => setError(e.message))
.finally(() => setIsBusy(false));
};
return { isBusy, error, fail: setError, run };
}