diff --git a/apps/server/src/routes/github/index.ts b/apps/server/src/routes/github/index.ts index 798deae5..e8088159 100644 --- a/apps/server/src/routes/github/index.ts +++ b/apps/server/src/routes/github/index.ts @@ -45,7 +45,7 @@ export function createGitHubRoutes(events: EventEmitter): Router { router.post( '/validation-mark-viewed', validatePathParams('projectPath'), - createMarkViewedHandler() + createMarkViewedHandler(events) ); return router; diff --git a/apps/server/src/routes/github/routes/validation-endpoints.ts b/apps/server/src/routes/github/routes/validation-endpoints.ts index 652aa3d2..21859737 100644 --- a/apps/server/src/routes/github/routes/validation-endpoints.ts +++ b/apps/server/src/routes/github/routes/validation-endpoints.ts @@ -3,6 +3,8 @@ */ import type { Request, Response } from 'express'; +import type { EventEmitter } from '../../../lib/events.js'; +import type { IssueValidationEvent } from '@automaker/types'; import { isValidationRunning, getValidationStatus, @@ -193,7 +195,7 @@ export function createDeleteValidationHandler() { /** * POST /validation-mark-viewed - Mark a validation as viewed by the user */ -export function createMarkViewedHandler() { +export function createMarkViewedHandler(events: EventEmitter) { return async (req: Request, res: Response): Promise => { try { const { projectPath, issueNumber } = req.body as { @@ -215,6 +217,16 @@ export function createMarkViewedHandler() { const success = await markValidationViewed(projectPath, issueNumber); + if (success) { + // Emit event so UI can update the unviewed count + const viewedEvent: IssueValidationEvent = { + type: 'issue_validation_viewed', + issueNumber, + projectPath, + }; + events.emit('issue-validation:event', viewedEvent); + } + res.json({ success }); } catch (error) { logError(error, 'Mark validation viewed failed'); diff --git a/apps/ui/src/components/layout/sidebar/hooks/use-unviewed-validations.ts b/apps/ui/src/components/layout/sidebar/hooks/use-unviewed-validations.ts index 44470e3c..102b1fc9 100644 --- a/apps/ui/src/components/layout/sidebar/hooks/use-unviewed-validations.ts +++ b/apps/ui/src/components/layout/sidebar/hooks/use-unviewed-validations.ts @@ -45,7 +45,11 @@ export function useUnviewedValidations(currentProject: Project | null) { const unsubscribe = api.github.onValidationEvent((event) => { if (event.projectPath === currentProject.path) { if (event.type === 'issue_validation_complete') { + // New validation completed - increment count setCount((prev) => prev + 1); + } else if (event.type === 'issue_validation_viewed') { + // Validation was viewed - decrement count + setCount((prev) => Math.max(0, prev - 1)); } } }); diff --git a/libs/types/src/issue-validation.ts b/libs/types/src/issue-validation.ts index 84079907..2c0d2f64 100644 --- a/libs/types/src/issue-validation.ts +++ b/libs/types/src/issue-validation.ts @@ -109,6 +109,11 @@ export type IssueValidationEvent = issueNumber: number; error: string; projectPath: string; + } + | { + type: 'issue_validation_viewed'; + issueNumber: number; + projectPath: string; }; /**