import { onCustomEvent, notifyCustomEvent } from '@/common/utils'; import { uuidv4 as v4 } from '@jolibox/common'; // global event listener manager interface PendingRequest { resolve: (value: { isSubUser: boolean; userId?: string }) => void; reject: (error: Error) => void; timeoutId: NodeJS.Timeout; } const pendingRequests = new Map(); let isListenerInitialized = false; // initialize global event listener const initializeEventListener = () => { if (isListenerInitialized) return; onCustomEvent('ON_JOLIBOX_GET_USER_SUB_STATUS', (data) => { const pendingRequest = pendingRequests.get(data.sequenceId); if (pendingRequest) { clearTimeout(pendingRequest.timeoutId); const { isSubUser, userId } = data; pendingRequest.resolve({ isSubUser, userId }); pendingRequests.delete(data.sequenceId); } }); isListenerInitialized = true; }; // Reset function for testing export const resetSubState = () => { isListenerInitialized = false; pendingRequests.clear(); }; export async function getUserSubStatus(): Promise<{ isSubUser: boolean; userId?: string }> { initializeEventListener(); return new Promise((resolve, reject) => { const sequenceId = v4(); const timeoutId = setTimeout(() => { pendingRequests.delete(sequenceId); reject(new Error('Timeout waiting for user sub status response')); }, 3000); // 3 second timeout pendingRequests.set(sequenceId, { resolve, reject, timeoutId }); notifyCustomEvent('JOLIBOX_GET_USER_SUB_STATUS', { sequenceId }); }); }