diff --git a/frontend/src/app/pages/Dashboard/canvas/DashboardOverlays.tsx b/frontend/src/app/pages/Dashboard/canvas/DashboardOverlays.tsx index fcd863d9..4302182c 100644 --- a/frontend/src/app/pages/Dashboard/canvas/DashboardOverlays.tsx +++ b/frontend/src/app/pages/Dashboard/canvas/DashboardOverlays.tsx @@ -6,6 +6,7 @@ import HelpPill from '../desktop/HelpPill'; import CardSearchPalette from '../controls/CardSearchPalette'; import DirectionHints from '../controls/DirectionHints'; import WorkflowRunningToast from '@/app/pages/Workflows/WorkflowRunningToast'; +import WorkflowNoticeToast from '@/app/pages/Workflows/WorkflowNoticeToast'; import MissedRunsToast from '@/app/pages/Workflows/MissedRunsToast'; import ProviderHealthToast from '@/app/components/overlays/ProviderHealthToast'; import ScheduleOfferToast from '@/app/components/nudges/ScheduleOfferToast'; @@ -172,6 +173,7 @@ const DashboardOverlays: React.FC = ({ {/* Scheduled-run nudge: "your {workflow} is running now" + jump-to-canvas */} + {/* Launch nudge when scheduled runs elapsed while the app was closed */} diff --git a/frontend/src/app/pages/Workflows/WorkflowNoticeToast.tsx b/frontend/src/app/pages/Workflows/WorkflowNoticeToast.tsx new file mode 100644 index 00000000..7c4ab5d1 --- /dev/null +++ b/frontend/src/app/pages/Workflows/WorkflowNoticeToast.tsx @@ -0,0 +1,38 @@ +// The server's own words when it refuses something the user asked for. Today that is a delete the +// cloud would not let go of; without it the card simply stays put and the click looks broken. + +import React from 'react'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { dismissNoticeToast } from '@/shared/state/workflowsSlice'; + +export default function WorkflowNoticeToast() { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const notice = useAppSelector((s) => s.workflows.noticeToast); + + return ( + { if (reason !== 'clickaway') dispatch(dismissNoticeToast()); }} + anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }} + > + dispatch(dismissNoticeToast())} + sx={{ + bgcolor: c.bg.surface, + color: c.text.primary, + border: `1px solid ${c.border.medium}`, + maxWidth: 420, + }} + > + {notice} + + + ); +}