{"file":"useSidebar-BQvNr3RZ.js","mappings":"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","names":[],"sources":["../../../../composables/useDevice.js","../../../../composables/useSocket.js","../../../../composables/useSidebar.js"],"sourcesContent":["import { ref, onMounted, onBeforeUnmount } from \"vue\";\nimport { throttle } from \"./utils/throttle\";\n\n// 전역 resize 이벤트 리스너 관리\nlet globalResizeHandler = null;\nlet resizeListeners = new Set();\n\n// 전역 resize 이벤트 초기화\nconst initGlobalResize = () => {\n  if (typeof window === \"undefined\" || globalResizeHandler) return;\n\n  globalResizeHandler = throttle(() => {\n    resizeListeners.forEach((listener) => listener());\n  }, 150);\n\n  window.addEventListener(\"resize\", globalResizeHandler);\n};\n\n// 전역 resize 이벤트 정리\nconst cleanupGlobalResize = () => {\n  if (resizeListeners.size === 0 && globalResizeHandler) {\n    if (typeof window !== \"undefined\") {\n      window.removeEventListener(\"resize\", globalResizeHandler);\n    }\n    globalResizeHandler = null;\n  }\n};\n\nexport const useDevice = () => {\n  const isMobile = ref(false);\n\n  const update = () => {\n    if (typeof window !== \"undefined\") {\n      isMobile.value = window.innerWidth <= 992;\n    }\n  };\n\n  onMounted(() => {\n    update();\n\n    // 전역 resize 이벤트에 등록\n    if (typeof window !== \"undefined\") {\n      resizeListeners.add(update);\n      initGlobalResize();\n    }\n  });\n\n  onBeforeUnmount(() => {\n    if (typeof window !== \"undefined\") {\n      resizeListeners.delete(update);\n      cleanupGlobalResize();\n    }\n  });\n\n  return { isMobile };\n};\n\n//전역 resize 이벤트에 callback을 등록 함수\nexport const useResizeListener = (callback) => {\n  onMounted(() => {\n    if (typeof window !== \"undefined\") {\n      resizeListeners.add(callback);\n      initGlobalResize();\n    }\n  });\n\n  onBeforeUnmount(() => {\n    if (typeof window !== \"undefined\") {\n      resizeListeners.delete(callback);\n      cleanupGlobalResize();\n    }\n  });\n};\n","import { ref, onMounted, onUnmounted } from 'vue';\nimport { io } from 'socket.io-client';\n\nlet socket = null;\nconst isConnected = ref(false);\nconst currentPrice = ref(null);\nconst roundInfo = ref(null);\n\n// 이벤트 리스너 큐 (socket 연결 전 등록된 리스너들)\nconst pendingListeners = [];\n\nexport const useSocket = () => {\n  const connect = (userId, nickname, avatar) => {\n    if (socket?.connected) {\n      // console.log('[Socket] Already connected');\n      return socket;\n    }\n\n    // Socket.io 서버 연결 (Apache 프록시 통해)\n    socket = io({\n      path: '/socket.io/',\n      transports: ['websocket', 'polling'],\n      reconnection: true,\n      reconnectionDelay: 1000,\n      reconnectionAttempts: 5\n    });\n\n    socket.on('connect', () => {\n      isConnected.value = true;\n\n      // 대기 중이던 이벤트 리스너 등록\n      if (pendingListeners.length > 0) {\n        pendingListeners.forEach(({ event, callback }) => {\n          socket.on(event, callback);\n        });\n        pendingListeners.length = 0; // 큐 비우기\n      }\n\n      // 사용자 정보 전송 (로그인한 경우)\n      if (userId) {\n        socket.emit('chat:join', {\n          userId,\n          nickname,\n          avatar\n        });\n      }\n    });\n\n    socket.on('disconnect', (reason) => {\n      isConnected.value = false;\n    });\n\n    socket.on('connect_error', (error) => {\n      isConnected.value = false;\n    });\n\n    return socket;\n  };\n\n  const disconnect = () => {\n    if (socket) {\n      socket.disconnect();\n      socket = null;\n      isConnected.value = false;\n    }\n  };\n\n  const emit = (event, data) => {\n    if (socket && isConnected.value) {\n      socket.emit(event, data);\n    }\n  };\n\n  const on = (event, callback) => {\n    if (socket && socket.connected) {\n      socket.on(event, callback);\n    } else {\n      pendingListeners.push({ event, callback });\n    }\n  };\n\n  const off = (event, callback) => {\n    if (socket) {\n      socket.off(event, callback);\n    }\n  };\n\n  const updateUser = (userId, nickname, avatar) => {\n    if (socket && isConnected.value && userId) {\n      socket.emit('chat:join', {\n        userId,\n        nickname,\n        avatar\n      });\n    }\n  };\n\n  return {\n    socket,\n    isConnected,\n    currentPrice,\n    roundInfo,\n    connect,\n    disconnect,\n    emit,\n    on,\n    off,\n    updateUser\n  };\n};\n","import { ref } from \"vue\";\n\n// 전역 채팅 상태\nconst isChatOpen = ref(false);\nconst unreadMessageCount = ref(0);\n\n// 전역 알림 상태\nconst isNotificationOpen = ref(false);\n\n// 읽지 않은 알림 개수 (isNew가 true인 것만 카운트)\nconst unreadNotificationCount = ref(0);\n\nexport const useChat = () => {\n  const toggleChat = () => {\n    if (isChatOpen.value) {\n      // 이미 열려있으면 닫기\n      isChatOpen.value = false;\n    } else {\n      // 닫혀있으면 열기 (알림이 열려있으면 먼저 닫기)\n      if (isNotificationOpen.value) {\n        isNotificationOpen.value = false;\n      }\n      isChatOpen.value = true;\n    }\n  };\n\n  const openChat = () => {\n    // 알림이 열려있으면 먼저 닫기\n    if (isNotificationOpen.value) {\n      isNotificationOpen.value = false;\n    }\n    isChatOpen.value = true;\n  };\n\n  const closeChat = () => {\n    isChatOpen.value = false;\n  };\n\n  const toggleNotification = () => {\n    if (isNotificationOpen.value) {\n      // 이미 열려있으면 닫기\n      isNotificationOpen.value = false;\n    } else {\n      // 닫혀있으면 열기 (채팅이 열려있으면 먼저 닫기)\n      if (isChatOpen.value) {\n        isChatOpen.value = false;\n      }\n      isNotificationOpen.value = true;\n    }\n  };\n\n  const openNotification = () => {\n    // 채팅이 열려있으면 먼저 닫기\n    if (isChatOpen.value) {\n      isChatOpen.value = false;\n    }\n    isNotificationOpen.value = true;\n  };\n\n  const closeNotification = () => {\n    isNotificationOpen.value = false;\n  };\n\n  return {\n    isChatOpen,\n    unreadMessageCount,\n    toggleChat,\n    openChat,\n    closeChat,\n    isNotificationOpen,\n    toggleNotification,\n    openNotification,\n    closeNotification,\n    unreadNotificationCount,\n  };\n};\n\n"],"version":3}