import { io } from 'socket.io-client' export default defineNuxtPlugin(() => { const config = useRuntimeConfig() const { $toast } = useNuxtApp() // Socket.IO 클라이언트 연결 (개발 환경에서는 선택적) let socket = null try { if (config.public.apiUrl && process.client) { socket = io(config.public.apiUrl, { transports: ['websocket', 'polling'], timeout: 20000, forceNew: true, autoConnect: false // 자동 연결 비활성화 }) // 필요시에만 연결 시도 if (process.env.NODE_ENV === 'production') { socket.connect() } } } catch (error) { console.warn('Socket.IO 초기화 실패:', error) } // 이벤트 리스너 등록 (socket이 존재할 때만) if (socket) { // 연결 이벤트 socket.on('connect', () => { console.log('Socket.IO 연결됨:', socket.id) }) socket.on('disconnect', () => { console.log('Socket.IO 연결 해제됨') }) // 배송 상태 변경 이벤트 처리 socket.on('deliveryStatusChanged', (data) => { console.log('배송 상태 변경 이벤트 수신:', data) // Toast 알림 표시 const statusText = { 'NEW': '신규', 'PENDING': '대기', 'COMPLETE': '완료' }[data.status] || data.status $toast.info(`${data.itemName}의 배송 상태가 "${statusText}"로 변경되었습니다.`) // 전역 이벤트 발행하여 UI 업데이트 트리거 const { $eventBus } = useNuxtApp() $eventBus.emit('DELIVERY_STATUS_CHANGED', data) }) // 새로운 주문 알림 socket.on('newOrderReceived', (data) => { console.log('새 주문 알림 수신:', data) $toast.success(`새로운 주문이 접수되었습니다: ${data.itemName}`) // 전역 이벤트 발행 const { $eventBus } = useNuxtApp() $eventBus.emit('NEW_ORDER_RECEIVED', data) }) // 연결 오류 처리 socket.on('connect_error', (error) => { console.warn('Socket.IO 연결 오류:', error.message) }) } return { provide: { socket } } })