45
src/editor/shared/useJsonSave.ts
Normal file
45
src/editor/shared/useJsonSave.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import { useState } from 'react';
|
||||
|
||||
import { saveJsonObject } from './jsonClient';
|
||||
|
||||
type UseJsonSaveOptions = {
|
||||
endpoint: string;
|
||||
payload: Record<string, unknown>;
|
||||
validate?: () => string[];
|
||||
successMessage: string;
|
||||
errorMessage: string;
|
||||
};
|
||||
|
||||
export function useJsonSave({
|
||||
endpoint,
|
||||
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 saveJsonObject(endpoint, payload);
|
||||
setSaveMessage(successMessage);
|
||||
} catch (error) {
|
||||
setSaveMessage(error instanceof Error ? error.message : errorMessage);
|
||||
} finally {
|
||||
setIsSaving(false);
|
||||
}
|
||||
};
|
||||
|
||||
return { isSaving, saveMessage, save };
|
||||
}
|
||||
Reference in New Issue
Block a user