5.9 KiB
5.9 KiB
Task 3: Create Event Handlers
Task ID: TASK-003 Story: STORY-001 Sprint: Sprint 1 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)
- ProjectCreated - New project added
- ProjectUpdated - Project details changed
- ProjectDeleted - Project removed
Epic Events (3)
- EpicCreated - New epic added
- EpicUpdated - Epic details changed
- EpicDeleted - Epic removed
Story Events (3)
- StoryCreated - New story added
- StoryUpdated - Story details changed
- StoryDeleted - Story removed
Task Events (4)
- TaskCreated - New task added
- TaskUpdated - Task details changed
- TaskStatusChanged - Task status updated
- TaskDeleted - Task removed
Implementation
File: src/services/signalr/EventHandlers.ts
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<string, Function[]> = 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:
import { SignalREventHandlers } from './EventHandlers';
export class SignalRService {
private eventHandlers: SignalREventHandlers | null = null;
async connect(accessToken: string, tenantId: string): Promise<void> {
// ... 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
// 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 <div>Project List</div>;
}
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
- EventHandlers.ts with all 13 handlers
- Integration with SignalRService
- Unit tests (13+ tests)
- 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):
- ProjectCreated
- ProjectUpdated
- ProjectDeleted
- ProjectArchived
- EpicCreated
- EpicUpdated
- EpicDeleted
- EpicMovedToProject
- StoryCreated
- StoryUpdated
- StoryDeleted
- StoryMovedToEpic
- TaskCreated
- TaskUpdated
- TaskDeleted
- TaskMovedToStory
- TaskStatusChanged
- TaskAssigned
- 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