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
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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,
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user