socket.client.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { io } from 'socket.io-client'
  2. export default defineNuxtPlugin(() => {
  3. const config = useRuntimeConfig()
  4. const { $toast } = useNuxtApp()
  5. // Socket.IO 클라이언트 연결 (개발 환경에서는 선택적)
  6. let socket = null
  7. try {
  8. if (config.public.apiUrl && process.client) {
  9. socket = io(config.public.apiUrl, {
  10. transports: ['websocket', 'polling'],
  11. timeout: 20000,
  12. forceNew: true,
  13. autoConnect: false // 자동 연결 비활성화
  14. })
  15. // 필요시에만 연결 시도
  16. if (process.env.NODE_ENV === 'production') {
  17. socket.connect()
  18. }
  19. }
  20. } catch (error) {
  21. console.warn('Socket.IO 초기화 실패:', error)
  22. }
  23. // 이벤트 리스너 등록 (socket이 존재할 때만)
  24. if (socket) {
  25. // 연결 이벤트
  26. socket.on('connect', () => {
  27. console.log('Socket.IO 연결됨:', socket.id)
  28. })
  29. socket.on('disconnect', () => {
  30. console.log('Socket.IO 연결 해제됨')
  31. })
  32. // 배송 상태 변경 이벤트 처리
  33. socket.on('deliveryStatusChanged', (data) => {
  34. console.log('배송 상태 변경 이벤트 수신:', data)
  35. // Toast 알림 표시
  36. const statusText = {
  37. 'NEW': '신규',
  38. 'PENDING': '대기',
  39. 'COMPLETE': '완료'
  40. }[data.status] || data.status
  41. $toast.info(`${data.itemName}의 배송 상태가 "${statusText}"로 변경되었습니다.`)
  42. // 전역 이벤트 발행하여 UI 업데이트 트리거
  43. const { $eventBus } = useNuxtApp()
  44. $eventBus.emit('DELIVERY_STATUS_CHANGED', data)
  45. })
  46. // 새로운 주문 알림
  47. socket.on('newOrderReceived', (data) => {
  48. console.log('새 주문 알림 수신:', data)
  49. $toast.success(`새로운 주문이 접수되었습니다: ${data.itemName}`)
  50. // 전역 이벤트 발행
  51. const { $eventBus } = useNuxtApp()
  52. $eventBus.emit('NEW_ORDER_RECEIVED', data)
  53. })
  54. // 연결 오류 처리
  55. socket.on('connect_error', (error) => {
  56. console.warn('Socket.IO 연결 오류:', error.message)
  57. })
  58. }
  59. return {
  60. provide: {
  61. socket
  62. }
  63. }
  64. })