export const useOrderStream = () => { const eventSource = ref(null) const isConnected = ref(false) const lastOrderId = ref(0) const clientId = ref(`client_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`) const startStream = ( onNewOrders: (orders: any[]) => void, filters: { orgId?: string documentNo?: string externalOrderId?: string openOnly?: boolean } = {} ) => { if (isConnected.value && eventSource.value) { console.warn('Stream is already active') return } // Build query parameters const params = new URLSearchParams({ clientId: clientId.value, lastOrderId: lastOrderId.value.toString() }) if (filters.orgId) params.append('orgId', filters.orgId) if (filters.documentNo) params.append('documentNo', filters.documentNo) if (filters.externalOrderId) params.append('externalOrderId', filters.externalOrderId) if (filters.openOnly) params.append('openOnly', 'true') // Create EventSource connection const url = `/api/orders/sales/stream?${params.toString()}` eventSource.value = new EventSource(url) // Handle connection open eventSource.value.onopen = () => { console.log('Order stream connected') isConnected.value = true } // Handle messages eventSource.value.onmessage = (event) => { try { const data = JSON.parse(event.data) switch (data.type) { case 'connected': console.log('Stream connection established:', data.message) lastOrderId.value = data.lastOrderId break case 'newOrders': console.log(`Received ${data.count} new orders from stream`) lastOrderId.value = data.lastOrderId onNewOrders(data.orders) break case 'heartbeat': // Keep-alive ping from server console.debug('Stream heartbeat received') break case 'error': console.error('Stream error:', data.message) break default: console.log('Unknown message type:', data.type) } } catch (error) { console.error('Error parsing stream message:', error) } } // Handle errors eventSource.value.onerror = (error) => { console.error('EventSource error:', error) isConnected.value = false // Auto-reconnect after 5 seconds setTimeout(() => { if (!isConnected.value) { console.log('Attempting to reconnect...') stopStream() startStream(onNewOrders, filters) } }, 5000) } } const stopStream = () => { if (eventSource.value) { eventSource.value.close() eventSource.value = null isConnected.value = false console.log('Order stream disconnected') } } const setLastOrderId = (id: number) => { lastOrderId.value = id } const updateFilters = ( onNewOrders: (orders: any[]) => void, filters: { orgId?: string documentNo?: string externalOrderId?: string openOnly?: boolean } = {} ) => { // Restart stream with new filters stopStream() startStream(onNewOrders, filters) } // Clean up on unmount onUnmounted(() => { stopStream() }) return { startStream, stopStream, updateFilters, setLastOrderId, isConnected: readonly(isConnected), lastOrderId: readonly(lastOrderId) } }