Files
delivery-tracker/frontend/src/hooks/useWebSocket.ts
T
Egor Pozharov 4e0899d3ce chore: restructure project into backend and frontend folders
- Move all frontend code to frontend/ directory
- Add backend/ with Go project structure (cmd, internal, pkg)
- Add docker-compose.yml for orchestration
2026-04-14 13:14:28 +06:00

84 lines
2.1 KiB
TypeScript

import { useEffect, useCallback } from 'react';
import { useDeliveryStore } from '../stores/deliveryStore';
import type { Delivery } from '../types';
type WebSocketEvent =
| { type: 'delivery.created'; payload: Delivery }
| { type: 'delivery.updated'; payload: Delivery }
| { type: 'delivery.deleted'; payload: { id: string } };
type EventHandler = (event: WebSocketEvent) => void;
class MockWebSocket {
private handlers: EventHandler[] = [];
private isConnected = false;
connect() {
this.isConnected = true;
console.log('WebSocket connected (mock)');
}
disconnect() {
this.isConnected = false;
console.log('WebSocket disconnected (mock)');
}
subscribe(handler: EventHandler) {
this.handlers.push(handler);
return () => {
this.handlers = this.handlers.filter((h) => h !== handler);
};
}
emit(event: WebSocketEvent) {
if (!this.isConnected) return;
this.handlers.forEach((handler) => handler(event));
}
simulateIncomingEvent(event: WebSocketEvent) {
this.emit(event);
}
}
const mockWebSocket = new MockWebSocket();
export const useWebSocket = () => {
const { addDelivery, updateDelivery, deleteDelivery } = useDeliveryStore();
useEffect(() => {
mockWebSocket.connect();
const unsubscribe = mockWebSocket.subscribe((event) => {
switch (event.type) {
case 'delivery.created':
addDelivery(event.payload);
break;
case 'delivery.updated':
updateDelivery(event.payload.id, event.payload);
break;
case 'delivery.deleted':
deleteDelivery(event.payload.id);
break;
}
});
return () => {
unsubscribe();
mockWebSocket.disconnect();
};
}, [addDelivery, updateDelivery, deleteDelivery]);
const sendEvent = useCallback((event: WebSocketEvent) => {
mockWebSocket.emit(event);
}, []);
return { sendEvent, isConnected: true };
};
export const simulateIncomingDelivery = (delivery: Delivery) => {
mockWebSocket.simulateIncomingEvent({
type: 'delivery.created',
payload: delivery,
});
};