- Move all frontend code to frontend/ directory - Add backend/ with Go project structure (cmd, internal, pkg) - Add docker-compose.yml for orchestration
84 lines
2.1 KiB
TypeScript
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,
|
|
});
|
|
};
|