96 lines
2.7 KiB
TypeScript
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: ReturnType<typeof setInterval> | 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();
|