import { useNavigate } from "react-router"; import { useSupervisorQuestions } from "../contexts/SupervisorQuestionsContext"; import { PhaseConfirmationModal, type PhaseConfirmationData } from "./contracts/PhaseConfirmationModal"; import type { PendingQuestion } from "../lib/api"; /** * Notification component for phase confirmation requests. * Shows a modal when there are pending phase_confirmation type questions. * Uses the same question infrastructure as supervisor questions. */ export function PhaseConfirmationNotification() { const { notificationQuestions, submitAnswer, dismissNotification } = useSupervisorQuestions(); // Filter for phase_confirmation type questions const phaseConfirmationQuestions = notificationQuestions.filter( (q) => q.questionType === "phase_confirmation" ); if (phaseConfirmationQuestions.length === 0) { return null; } // Show the first phase confirmation question as a modal const question = phaseConfirmationQuestions[0]; // Build phase confirmation data from the question const data: PhaseConfirmationData = { questionId: question.questionId, contractId: question.contractId, contractName: question.phaseConfirmation?.contractName, currentPhase: question.phaseConfirmation?.currentPhase || "research", nextPhase: question.phaseConfirmation?.nextPhase || "specify", summary: question.phaseConfirmation?.summary, deliverables: question.phaseConfirmation?.deliverables, }; const handleApprove = async (questionId: string) => { const success = await submitAnswer(questionId, "APPROVE"); if (success) { dismissNotification(questionId); } }; const handleRequestChanges = async (questionId: string, feedback: string) => { const success = await submitAnswer( questionId, `CHANGES_REQUESTED: ${feedback}` ); if (success) { dismissNotification(questionId); } }; const handleDismiss = () => { // Dismiss to notification (user can still respond via task output) dismissNotification(question.questionId); }; return ( ); } /** * Alternative: Notification toast-style for phase confirmations * Shows as a small notification in the corner (like regular supervisor questions) */ export function PhaseConfirmationToast() { const navigate = useNavigate(); const { notificationQuestions, dismissNotification } = useSupervisorQuestions(); // Filter for phase_confirmation type questions const phaseConfirmationQuestions = notificationQuestions.filter( (q) => q.questionType === "phase_confirmation" ); if (phaseConfirmationQuestions.length === 0) { return null; } const handleGoToTask = (question: PendingQuestion) => { dismissNotification(question.questionId); navigate(`/mesh/${question.taskId}`); }; return (
{phaseConfirmationQuestions.map((question) => (
{/* Header */}
? Phase Transition
{/* Content preview */}
{question.phaseConfirmation && (
{question.phaseConfirmation.currentPhase} {question.phaseConfirmation.nextPhase}
)}

{question.question}

{question.phaseConfirmation?.contractName && (

Contract: {question.phaseConfirmation.contractName}

)}
))}
); }