sg-delivery-partner/app/services/mockSocketService.ts
2026-07-02 14:34:19 +05:30

96 lines
2.7 KiB
TypeScript

import { SocketEvents } from '@utils/constants';
import { JobOffer, Coordinates } from '@app-types/index';
import { mockJobOffer } from '@store/mockData/mockJobs';
type Callback = (data: any) => void;
class MockSocketService {
private isConnected = false;
private listeners: Record<string, Callback[]> = {};
private mockJobInterval: NodeJS.Timeout | null = null;
private token: string | null = null;
connect(token: string) {
this.token = token;
this.isConnected = true;
console.log('[MockSocket] Connected with token:', token);
}
disconnect() {
this.goOffline();
this.isConnected = false;
this.token = null;
this.listeners = {};
console.log('[MockSocket] Disconnected');
}
goOnline() {
if (!this.isConnected) {
console.warn('[MockSocket] Cannot go online: socket not connected');
return;
}
console.log('[MockSocket] Partner went online. Starting job offer stream...');
// Simulate incoming job offers every 25 seconds if active
if (this.mockJobInterval) clearInterval(this.mockJobInterval);
this.mockJobInterval = setInterval(() => {
// Send a fake new job offer
const newOffer: JobOffer = {
...mockJobOffer,
jobId: `job_${Date.now()}`,
amount: Math.floor(Math.random() * 80) + 50, // random amount ₹50 - ₹130
distance: parseFloat((Math.random() * 4 + 0.5).toFixed(1)), // random distance 0.5km - 4.5km
itemCount: Math.floor(Math.random() * 4) + 1,
};
this.trigger(SocketEvents.NewJob, newOffer);
}, 20000); // 20 seconds
}
goOffline() {
if (this.mockJobInterval) {
clearInterval(this.mockJobInterval);
this.mockJobInterval = null;
}
console.log('[MockSocket] Partner went offline. Stopped job offer stream.');
}
updateLocation(coords: Coordinates) {
console.log('[MockSocket] Location updated:', coords);
// Send to server (mocked)
}
// Event listener pattern
on(event: string, callback: Callback) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
}
off(event: string, callback?: Callback) {
if (!this.listeners[event]) return;
if (callback) {
this.listeners[event] = this.listeners[event].filter(cb => cb !== callback);
} else {
delete this.listeners[event];
}
}
private trigger(event: string, data: any) {
const list = this.listeners[event];
if (list) {
list.forEach(callback => {
try {
callback(data);
} catch (e) {
console.error(`[MockSocket] Error in listener for event ${event}:`, e);
}
});
}
}
}
export const mockSocketService = new MockSocketService();