feat(21-01): wire toast notifications into all mutation flows
- SpawnArchitectDropdown: toast.success on spawn, toast.error on failure - ActionMenu: toast.success on archive, toast.error on failure - CreateInitiativeDialog: toast.success on creation - Inbox: toast.success/error for resumeAgent and respondToMessage mutations - Replace all console.error-only mutation error handling with user-visible toasts
This commit is contained in:
@@ -7,6 +7,7 @@ import {
|
|||||||
DropdownMenuSeparator,
|
DropdownMenuSeparator,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
} from "@/components/ui/dropdown-menu";
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { toast } from "sonner";
|
||||||
import { trpc } from "@/lib/trpc";
|
import { trpc } from "@/lib/trpc";
|
||||||
|
|
||||||
interface ActionMenuProps {
|
interface ActionMenuProps {
|
||||||
@@ -21,9 +22,10 @@ export function ActionMenu({ initiativeId, onDelete }: ActionMenuProps) {
|
|||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
utils.listInitiatives.invalidate();
|
utils.listInitiatives.invalidate();
|
||||||
onDelete?.();
|
onDelete?.();
|
||||||
|
toast.success("Initiative archived");
|
||||||
},
|
},
|
||||||
onError: (err) => {
|
onError: () => {
|
||||||
console.error("Failed to archive initiative:", err.message);
|
toast.error("Failed to archive initiative");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { Button } from "@/components/ui/button";
|
|||||||
import { Input } from "@/components/ui/input";
|
import { Input } from "@/components/ui/input";
|
||||||
import { Label } from "@/components/ui/label";
|
import { Label } from "@/components/ui/label";
|
||||||
import { Textarea } from "@/components/ui/textarea";
|
import { Textarea } from "@/components/ui/textarea";
|
||||||
|
import { toast } from "sonner";
|
||||||
import { trpc } from "@/lib/trpc";
|
import { trpc } from "@/lib/trpc";
|
||||||
|
|
||||||
interface CreateInitiativeDialogProps {
|
interface CreateInitiativeDialogProps {
|
||||||
@@ -32,6 +33,7 @@ export function CreateInitiativeDialog({
|
|||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
utils.listInitiatives.invalidate();
|
utils.listInitiatives.invalidate();
|
||||||
onOpenChange(false);
|
onOpenChange(false);
|
||||||
|
toast.success("Initiative created");
|
||||||
},
|
},
|
||||||
onError: (err) => {
|
onError: (err) => {
|
||||||
setError(err.message);
|
setError(err.message);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import {
|
|||||||
DropdownMenuItem,
|
DropdownMenuItem,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
} from "@/components/ui/dropdown-menu";
|
} from "@/components/ui/dropdown-menu";
|
||||||
|
import { toast } from "sonner";
|
||||||
import { trpc } from "@/lib/trpc";
|
import { trpc } from "@/lib/trpc";
|
||||||
|
|
||||||
interface SpawnArchitectDropdownProps {
|
interface SpawnArchitectDropdownProps {
|
||||||
@@ -26,9 +27,10 @@ export function SpawnArchitectDropdown({
|
|||||||
setOpen(false);
|
setOpen(false);
|
||||||
setSuccessText("Spawned!");
|
setSuccessText("Spawned!");
|
||||||
setTimeout(() => setSuccessText(null), 2000);
|
setTimeout(() => setSuccessText(null), 2000);
|
||||||
|
toast.success("Architect spawned");
|
||||||
},
|
},
|
||||||
onError: (err) => {
|
onError: () => {
|
||||||
console.error("Failed to spawn discuss architect:", err.message);
|
toast.error("Failed to spawn architect");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -37,9 +39,10 @@ export function SpawnArchitectDropdown({
|
|||||||
setOpen(false);
|
setOpen(false);
|
||||||
setSuccessText("Spawned!");
|
setSuccessText("Spawned!");
|
||||||
setTimeout(() => setSuccessText(null), 2000);
|
setTimeout(() => setSuccessText(null), 2000);
|
||||||
|
toast.success("Architect spawned");
|
||||||
},
|
},
|
||||||
onError: (err) => {
|
onError: () => {
|
||||||
console.error("Failed to spawn breakdown architect:", err.message);
|
toast.error("Failed to spawn architect");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { AlertCircle, ChevronLeft } from "lucide-react";
|
|||||||
import { Button } from "@/components/ui/button";
|
import { Button } from "@/components/ui/button";
|
||||||
import { Card } from "@/components/ui/card";
|
import { Card } from "@/components/ui/card";
|
||||||
import { Skeleton } from "@/components/Skeleton";
|
import { Skeleton } from "@/components/Skeleton";
|
||||||
|
import { toast } from "sonner";
|
||||||
import { trpc } from "@/lib/trpc";
|
import { trpc } from "@/lib/trpc";
|
||||||
import { InboxList } from "@/components/InboxList";
|
import { InboxList } from "@/components/InboxList";
|
||||||
import { QuestionForm } from "@/components/QuestionForm";
|
import { QuestionForm } from "@/components/QuestionForm";
|
||||||
@@ -39,6 +40,10 @@ function InboxPage() {
|
|||||||
void utils.listWaitingAgents.invalidate();
|
void utils.listWaitingAgents.invalidate();
|
||||||
void utils.listMessages.invalidate();
|
void utils.listMessages.invalidate();
|
||||||
setSelectedAgentId(null);
|
setSelectedAgentId(null);
|
||||||
|
toast.success("Answer submitted");
|
||||||
|
},
|
||||||
|
onError: () => {
|
||||||
|
toast.error("Failed to submit answer");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -47,6 +52,10 @@ function InboxPage() {
|
|||||||
void utils.listWaitingAgents.invalidate();
|
void utils.listWaitingAgents.invalidate();
|
||||||
void utils.listMessages.invalidate();
|
void utils.listMessages.invalidate();
|
||||||
setSelectedAgentId(null);
|
setSelectedAgentId(null);
|
||||||
|
toast.success("Response sent");
|
||||||
|
},
|
||||||
|
onError: () => {
|
||||||
|
toast.error("Failed to send response");
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user