feat: toast popup for save status — 'Сохранено' or error, no layout jump
This commit is contained in:
@@ -51,6 +51,7 @@ export function SectionEditor<T>({
|
||||
} catch {
|
||||
setStatus("error");
|
||||
setError("Ошибка сохранения");
|
||||
setTimeout(() => setStatus((s) => (s === "error" ? "idle" : s)), 4000);
|
||||
}
|
||||
}, [sectionKey]);
|
||||
|
||||
|
||||
@@ -416,6 +416,7 @@ export default function OpenDayAdminPage() {
|
||||
const [classes, setClasses] = useState<OpenDayClass[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [saving, setSaving] = useState(false);
|
||||
const [saveStatus, setSaveStatus] = useState<"idle" | "saved" | "error">("idle");
|
||||
const [trainers, setTrainers] = useState<string[]>([]);
|
||||
const [styles, setStyles] = useState<string[]>([]);
|
||||
const [halls, setHalls] = useState<string[]>([]);
|
||||
@@ -455,12 +456,18 @@ export default function OpenDayAdminPage() {
|
||||
if (saveTimerRef.current) clearTimeout(saveTimerRef.current);
|
||||
saveTimerRef.current = setTimeout(async () => {
|
||||
setSaving(true);
|
||||
await adminFetch("/api/admin/open-day", {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(updated),
|
||||
});
|
||||
try {
|
||||
const res = await adminFetch("/api/admin/open-day", {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify(updated),
|
||||
});
|
||||
setSaveStatus(res.ok ? "saved" : "error");
|
||||
} catch {
|
||||
setSaveStatus("error");
|
||||
}
|
||||
setSaving(false);
|
||||
setTimeout(() => setSaveStatus("idle"), 2000);
|
||||
}, 800);
|
||||
},
|
||||
[]
|
||||
@@ -528,6 +535,13 @@ export default function OpenDayAdminPage() {
|
||||
|
||||
return (
|
||||
<div className="space-y-6">
|
||||
{saveStatus !== "idle" && (
|
||||
<div className={`fixed bottom-4 right-4 z-50 flex items-center gap-2 rounded-lg border px-3 py-2 text-sm shadow-lg animate-in slide-in-from-right ${
|
||||
saveStatus === "saved" ? "bg-emerald-950/90 border-emerald-500/30 text-emerald-200" : "bg-red-950/90 border-red-500/30 text-red-200"
|
||||
}`}>
|
||||
{saveStatus === "saved" ? "Сохранено" : "Ошибка сохранения"}
|
||||
</div>
|
||||
)}
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<h1 className="text-2xl font-bold">День открытых дверей</h1>
|
||||
|
||||
Reference in New Issue
Block a user