refactor: migrate global toast notifications to Sonner and update admin UI navigation, layouts, and submission workflows

This commit is contained in:
2026-05-28 20:18:45 +07:00 Unverified
parent 9693bef355
commit bc78873ff8
7 changed files with 113 additions and 70 deletions
+3 -3
View File
@@ -37,7 +37,7 @@ export function AdminSidebar() {
<SidebarMenuButton asChild isActive={pathname === "/form/admin"}>
<Link href="/form/admin">
<LayoutDashboard className="w-4 h-4" />
<span>Admin Dashboard</span>
<span>Dashboard</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
@@ -46,7 +46,7 @@ export function AdminSidebar() {
<SidebarMenuButton asChild isActive={pathname.startsWith("/form/admin/result")}>
<Link href="/form/admin/result">
<ClipboardList className="w-4 h-4" />
<span>Result Page</span>
<span>Response</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
@@ -70,7 +70,7 @@ export function AdminSidebar() {
<SidebarMenuButton asChild>
<Link href="/form">
<ArrowLeft className="w-4 h-4" />
<span>Exit Admin</span>
<span>Go public</span>
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
+40 -31
View File
@@ -37,17 +37,20 @@ export function DeleteFormButton({ formId }: DeleteFormButtonProps) {
const [open, setOpen] = useState(false);
const [deleting, setDeleting] = useState(false);
const handleDelete = async () => {
const handleDelete = () => {
setDeleting(true);
try {
await deleteForm(formId);
toast.success("Form deleted successfully!");
setOpen(false);
} catch (err: any) {
toast.error(err.message || "Failed to delete form.");
} finally {
setDeleting(false);
}
toast.promise(deleteForm(formId), {
loading: "Deleting form...",
success: () => {
setOpen(false);
setDeleting(false);
return "Form deleted successfully!";
},
error: (err: any) => {
setDeleting(false);
return err.message || "Failed to delete form.";
},
});
};
return (
@@ -88,19 +91,22 @@ export function DeleteSubmissionButton({ id, redirectUrl }: { id: string, redire
const [loading, setLoading] = useState(false);
const router = useRouter();
const handleDelete = async () => {
const handleDelete = () => {
setLoading(true);
try {
await deleteSubmission(id);
toast.success("Submission deleted");
if (redirectUrl) {
router.push(redirectUrl);
}
} catch (err: any) {
toast.error(err.message || "Failed to delete submission");
} finally {
setLoading(false);
}
toast.promise(deleteSubmission(id), {
loading: "Deleting submission...",
success: () => {
if (redirectUrl) {
router.push(redirectUrl);
}
setLoading(false);
return "Submission deleted";
},
error: (err: any) => {
setLoading(false);
return err.message || "Failed to delete submission";
},
});
};
return (
@@ -132,16 +138,19 @@ export function DeleteSubmissionButton({ id, redirectUrl }: { id: string, redire
export function DeleteAllSubmissionsButton() {
const [loading, setLoading] = useState(false);
const handleDeleteAll = async () => {
const handleDeleteAll = () => {
setLoading(true);
try {
await deleteAllSubmissions();
toast.success("All submissions deleted");
} catch (err: any) {
toast.error(err.message || "Failed to delete submissions");
} finally {
setLoading(false);
}
toast.promise(deleteAllSubmissions(), {
loading: "Deleting all submissions...",
success: () => {
setLoading(false);
return "All submissions deleted";
},
error: (err: any) => {
setLoading(false);
return err.message || "Failed to delete submissions";
},
});
};
return (