import { useState } from 'react'; // Общая машина сохранения заявки для ВСЕХ форм портала. // Отвечает ТОЛЬКО за транзиентное состояние операции (идёт сохранение / ошибка / // что сохранили). Блокировка формы (readOnly) считается из СТАТУСА заявки на // стороне формы через isEditableStatus — не здесь: так одинаково блокируются // и «после отправки», и «открыли уже отправленную». export type SubmitKind = 'draft' | 'submit'; export interface IRequestSubmit { saving: boolean; // идёт сохранение kind: SubmitKind | undefined; // текущее/последнее действие (для подписи кнопки) savedKind: SubmitKind | undefined; // последнее УСПЕШНОЕ сохранение (для плашки) error: string | undefined; /** * Запустить сохранение. validate (опц.) возвращает текст ошибки или undefined. * Повторный вызов во время сохранения игнорируется (защита от дабл-клика). */ run: ( kind: SubmitKind, save: () => Promise, validate?: () => string | undefined ) => Promise; setError: (message: string | undefined) => void; } export function useRequestSubmit(): IRequestSubmit { const [saving, setSaving] = useState(false); const [kind, setKind] = useState(undefined); const [savedKind, setSavedKind] = useState(undefined); const [error, setError] = useState(undefined); const run = async ( k: SubmitKind, save: () => Promise, validate?: () => string | undefined ): Promise => { if (saving) { return; } setKind(k); const validationError = validate ? validate() : undefined; if (validationError) { setError(validationError); return; } setError(undefined); setSaving(true); try { await save(); setSavedKind(k); } catch (e) { setError(`Ошибка сохранения: ${(e as Error).message}`); } finally { setSaving(false); } }; return { saving, kind, savedKind, error, run, setError }; }