{"version":3,"file":"index.cjs","names":["noop","usePreservedCallback"],"sources":["../../../src/hooks/useNetwork/index.ts"],"sourcesContent":["import { noop } from '@modern-kit/utils';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { useSyncExternalStore } from 'react';\n\ninterface UseNetworkProps {\n  onlineAction?: (event: Event) => void;\n  offlineAction?: (event: Event) => void;\n}\n\nconst getSnapshot = () => {\n  return navigator.onLine;\n};\n\n/**\n * @see https://react.dev/reference/react/useSyncExternalStore#adding-support-for-server-rendering\n */\nconst getServerSnapshot = () => {\n  return true;\n};\n\nconst subscribe = (\n  onStoreChange: () => void,\n  onlineAction: (event: Event) => void,\n  offlineAction: (event: Event) => void\n) => {\n  const handleOnlineCallback = (event: Event) => {\n    onlineAction(event);\n    return onStoreChange();\n  };\n\n  const handleOfflineCallback = (event: Event) => {\n    offlineAction(event);\n    return onStoreChange();\n  };\n\n  window.addEventListener('online', handleOnlineCallback);\n  window.addEventListener('offline', handleOfflineCallback);\n\n  return () => {\n    window.removeEventListener('online', handleOnlineCallback);\n    window.removeEventListener('offline', handleOfflineCallback);\n  };\n};\n\n/**\n * @description 네트워크 상태 변화를 감지하고, 현재 온라인 상태를 나타내는 `isOnline` 값을 반환합니다.\n * 또한, 네트워크 상태가 온라인 또는 오프라인으로 변경될 때 실행될 콜백 함수를 전달할 수 있습니다.\n *\n * @see https://react.dev/reference/react/useSyncExternalStore#subscribing-to-a-browser-api\n *\n * @param {UseNetworkProps} props - 네트워크 상태 변경 시 호출될 콜백 함수 설정을 위한 객체입니다.\n * @param {(event: Event) => void} [props.onlineAction] - 네트워크가 온라인 상태로 변경될 때 호출되는 콜백 함수입니다.\n * @param {(event: Event) => void} [props.offlineAction] - 네트워크가 오프라인 상태로 변경될 때 호출되는 콜백 함수입니다.\n *\n * @returns {boolean} 현재 네트워크가 온라인 상태인지 여부를 나타냅니다.\n *\n * @example\n * const isOnline = useNetwork({\n *   onlineAction: () => console.log('온라인 상태입니다!'),\n *   offlineAction: () => console.log('오프라인 상태입니다!')\n * });\n */\nexport function useNetwork({\n  onlineAction = noop,\n  offlineAction = noop,\n}: UseNetworkProps = {}): boolean {\n  const preservedSubscribe = usePreservedCallback((onStoreChange: () => void) =>\n    subscribe(onStoreChange, onlineAction, offlineAction)\n  );\n\n  const isOnline = useSyncExternalStore(\n    preservedSubscribe,\n    getSnapshot,\n    getServerSnapshot\n  );\n\n  return isOnline;\n}\n"],"mappings":";;;;;AASA,MAAM,oBAAoB;CACxB,OAAO,UAAU;;;;;AAMnB,MAAM,0BAA0B;CAC9B,OAAO;;AAGT,MAAM,aACJ,eACA,cACA,kBACG;CACH,MAAM,wBAAwB,UAAiB;EAC7C,aAAa,MAAM;EACnB,OAAO,eAAe;;CAGxB,MAAM,yBAAyB,UAAiB;EAC9C,cAAc,MAAM;EACpB,OAAO,eAAe;;CAGxB,OAAO,iBAAiB,UAAU,qBAAqB;CACvD,OAAO,iBAAiB,WAAW,sBAAsB;CAEzD,aAAa;EACX,OAAO,oBAAoB,UAAU,qBAAqB;EAC1D,OAAO,oBAAoB,WAAW,sBAAsB;;;;;;;;;;;;;;;;;;;;;AAsBhE,SAAgB,WAAW,EACzB,eAAeA,kBAAAA,MACf,gBAAgBA,kBAAAA,SACG,EAAE,EAAW;CAWhC,QAAA,GAAA,MAAA,sBAV2BC,cAAAA,sBAAsB,kBAC/C,UAAU,eAAe,cAAc,cAAc,CAInC,EAClB,aACA,kBAGa"}