49 lines
1.1 KiB
TypeScript
49 lines
1.1 KiB
TypeScript
import { useState } from 'react';
|
|
|
|
import {
|
|
saveEditorJsonResource,
|
|
type EditorJsonResourceId,
|
|
} from './editorApiClient';
|
|
|
|
type UseJsonSaveOptions = {
|
|
resourceId: EditorJsonResourceId;
|
|
payload: Record<string, unknown>;
|
|
validate?: () => string[];
|
|
successMessage: string;
|
|
errorMessage: string;
|
|
};
|
|
|
|
export function useJsonSave({
|
|
resourceId,
|
|
payload,
|
|
validate,
|
|
successMessage,
|
|
errorMessage,
|
|
}: UseJsonSaveOptions) {
|
|
const [isSaving, setIsSaving] = useState(false);
|
|
const [saveMessage, setSaveMessage] = useState<string | null>(null);
|
|
|
|
const save = async () => {
|
|
setIsSaving(true);
|
|
setSaveMessage(null);
|
|
|
|
const validationErrors = validate?.() ?? [];
|
|
if (validationErrors.length > 0) {
|
|
setSaveMessage(validationErrors.slice(0, 3).join(' | '));
|
|
setIsSaving(false);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await saveEditorJsonResource(resourceId, payload, errorMessage);
|
|
setSaveMessage(successMessage);
|
|
} catch (error) {
|
|
setSaveMessage(error instanceof Error ? error.message : errorMessage);
|
|
} finally {
|
|
setIsSaving(false);
|
|
}
|
|
};
|
|
|
|
return { isSaving, saveMessage, save };
|
|
}
|