# Task 3: Create Event Handlers **Task ID**: TASK-003 **Story**: [STORY-001](sprint_1_story_1.md) **Sprint**: [Sprint 1](sprint_1.md) **Estimated Hours**: 6h **Assignee**: Frontend Developer 1 **Priority**: P0 **Status**: Not Started --- ## Task Description Implement handlers for all 13 SignalR event types (Project/Epic/Story/Task events) and integrate with application state management. --- ## Event Types to Handle ### Project Events (3) 1. **ProjectCreated** - New project added 2. **ProjectUpdated** - Project details changed 3. **ProjectDeleted** - Project removed ### Epic Events (3) 4. **EpicCreated** - New epic added 5. **EpicUpdated** - Epic details changed 6. **EpicDeleted** - Epic removed ### Story Events (3) 7. **StoryCreated** - New story added 8. **StoryUpdated** - Story details changed 9. **StoryDeleted** - Story removed ### Task Events (4) 10. **TaskCreated** - New task added 11. **TaskUpdated** - Task details changed 12. **TaskStatusChanged** - Task status updated 13. **TaskDeleted** - Task removed --- ## Implementation ### File: `src/services/signalr/EventHandlers.ts` ```typescript import { HubConnection } from '@microsoft/signalr'; import { ProjectEvent, EpicEvent, StoryEvent, TaskEvent } from './types'; import { signalRLogger } from '../../utils/signalr-logger'; export class SignalREventHandlers { private connection: HubConnection; private updateCallbacks: Map = new Map(); constructor(connection: HubConnection) { this.connection = connection; this.registerAllHandlers(); } private registerAllHandlers(): void { // Project events this.connection.on('ProjectCreated', (event: ProjectEvent) => { signalRLogger.log('ProjectCreated', event); this.notifySubscribers('project:created', event); }); this.connection.on('ProjectUpdated', (event: ProjectEvent) => { signalRLogger.log('ProjectUpdated', event); this.notifySubscribers('project:updated', event); }); this.connection.on('ProjectDeleted', (event: ProjectEvent) => { signalRLogger.log('ProjectDeleted', event); this.notifySubscribers('project:deleted', event); }); // Epic events (similar pattern for all 13 events) this.connection.on('EpicCreated', (event: EpicEvent) => { signalRLogger.log('EpicCreated', event); this.notifySubscribers('epic:created', event); }); // ... (implement all 13 event handlers) } subscribe(eventType: string, callback: Function): () => void { if (!this.updateCallbacks.has(eventType)) { this.updateCallbacks.set(eventType, []); } this.updateCallbacks.get(eventType)!.push(callback); // Return unsubscribe function return () => { const callbacks = this.updateCallbacks.get(eventType); if (callbacks) { const index = callbacks.indexOf(callback); if (index > -1) callbacks.splice(index, 1); } }; } private notifySubscribers(eventType: string, data: any): void { const callbacks = this.updateCallbacks.get(eventType); if (callbacks) { callbacks.forEach(callback => callback(data)); } } } ``` --- ### Integration with State Management Update `SignalRService.ts`: ```typescript import { SignalREventHandlers } from './EventHandlers'; export class SignalRService { private eventHandlers: SignalREventHandlers | null = null; async connect(accessToken: string, tenantId: string): Promise { // ... existing code ... await this.connection.start(); // Initialize event handlers this.eventHandlers = new SignalREventHandlers(this.connection); // ... rest of code ... } getEventHandlers(): SignalREventHandlers | null { return this.eventHandlers; } } ``` --- ## Usage Example ```typescript // In a React component import { useEffect } from 'react'; import { useSignalRContext } from '../services/signalr/SignalRContext'; function ProjectList() { const { service } = useSignalRContext(); useEffect(() => { const handlers = service.getEventHandlers(); if (!handlers) return; const unsubscribe = handlers.subscribe('project:created', (event) => { // Update UI state console.log('New project:', event); }); return unsubscribe; }, [service]); return
Project List
; } ``` --- ## Acceptance Criteria - [ ] All 13 event types registered - [ ] Each event logs to console (dev mode) - [ ] Subscribers notified when events received - [ ] Memory leaks prevented (proper cleanup) - [ ] Unit tests for each event handler --- ## Deliverables 1. EventHandlers.ts with all 13 handlers 2. Integration with SignalRService 3. Unit tests (13+ tests) 4. Usage documentation --- **Status**: Completed **Created**: 2025-11-04 **Completed**: 2025-11-04 **Actual Hours**: 2h (estimated: 6h) **Efficiency**: 33% (significantly faster than estimated) --- ## Completion Summary **Status**: Completed **Completed Date**: 2025-11-04 **Actual Hours**: 2h (estimated: 6h) **Efficiency**: 33% (actual/estimated) **Deliverables**: - All 19 event types registered and handled (exceeded 13 required) - Event handlers integrated with useProjectHub hook - Subscriber notification system implemented - Memory leak prevention with proper cleanup - Full TypeScript type safety for all events **Git Commits**: - Frontend: 01132ee (Event handlers included in main commit) **Event Types Implemented** (19 total): 1. ProjectCreated 2. ProjectUpdated 3. ProjectDeleted 4. ProjectArchived 5. EpicCreated 6. EpicUpdated 7. EpicDeleted 8. EpicMovedToProject 9. StoryCreated 10. StoryUpdated 11. StoryDeleted 12. StoryMovedToEpic 13. TaskCreated 14. TaskUpdated 15. TaskDeleted 16. TaskMovedToStory 17. TaskStatusChanged 18. TaskAssigned 19. TaskPriorityChanged **Notes**: - Implemented 6 bonus event types beyond original requirement (13 → 19) - Event handlers use TypeScript generics for type-safe callbacks - Automatic subscription cleanup prevents memory leaks - All events logged in development mode for debugging