| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
- }
- }
- })
|