feat: add toast notification system with success toasts

Adds ToastProvider/ToastViewport for in-app notifications with dedupe,
auto-dismiss, and action links. Wires success toasts to issue create,
issue update, and comment mutations. Adds live event toasts for activity,
agent status, and run status changes via LiveUpdatesProvider.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Forgotten
2026-02-20 13:47:13 -06:00
parent ef700c2391
commit 9ec8c54f41
8 changed files with 412 additions and 21 deletions

View File

@@ -6,6 +6,7 @@ import { activityApi } from "../api/activity";
import { agentsApi } from "../api/agents";
import { projectsApi } from "../api/projects";
import { useCompany } from "../context/CompanyContext";
import { useToast } from "../context/ToastContext";
import { usePanel } from "../context/PanelContext";
import { useBreadcrumbs } from "../context/BreadcrumbContext";
import { queryKeys } from "../lib/queryKeys";
@@ -110,6 +111,7 @@ function ActorIdentity({ evt, agentMap }: { evt: ActivityEvent; agentMap: Map<st
export function IssueDetail() {
const { issueId } = useParams<{ issueId: string }>();
const { selectedCompanyId } = useCompany();
const { pushToast } = useToast();
const { openPanel, closePanel } = usePanel();
const { setBreadcrumbs } = useBreadcrumbs();
const queryClient = useQueryClient();
@@ -253,7 +255,14 @@ export function IssueDetail() {
const updateIssue = useMutation({
mutationFn: (data: Record<string, unknown>) => issuesApi.update(issueId!, data),
onSuccess: invalidateIssue,
onSuccess: (updated) => {
invalidateIssue();
pushToast({
dedupeKey: `issue-updated-${updated.id}`,
title: "Issue updated",
tone: "success",
});
},
});
const addComment = useMutation({
@@ -262,6 +271,11 @@ export function IssueDetail() {
onSuccess: () => {
invalidateIssue();
queryClient.invalidateQueries({ queryKey: queryKeys.issues.comments(issueId!) });
pushToast({
dedupeKey: `issue-comment-${issueId}`,
title: "Comment posted",
tone: "success",
});
},
});