{"version":3,"sources":["../../../../src/sensors/useBattery/core.ts"],"sourcesContent":["import { batch, observable } from \"@legendapp/state\";\nimport { createSupported, onMount } from \"@usels/core\";\nimport type { ReadonlyObservable, Supportable } from \"@usels/core\";\nimport { defaultNavigator } from \"@shared/configurable\";\n\ninterface BatteryManager extends EventTarget {\n  charging: boolean;\n  chargingTime: number;\n  dischargingTime: number;\n  level: number;\n}\n\ntype NavigatorWithBattery = Navigator & {\n  getBattery: () => Promise<BatteryManager>;\n};\n\nexport interface UseBatteryReturn extends Supportable {\n  /** Whether the battery is charging */\n  charging$: ReadonlyObservable<boolean>;\n  /** Time in seconds until the battery is fully charged */\n  chargingTime$: ReadonlyObservable<number>;\n  /** Time in seconds until the battery is fully discharged */\n  dischargingTime$: ReadonlyObservable<number>;\n  /** Battery level (0 to 1) */\n  level$: ReadonlyObservable<number>;\n}\n\nconst BATTERY_EVENTS = [\n  \"chargingchange\",\n  \"chargingtimechange\",\n  \"dischargingtimechange\",\n  \"levelchange\",\n] as const;\n\n/**\n * Framework-agnostic reactive battery status.\n *\n * Resolves `navigator.getBattery()` lazily inside `onMount` and syncs\n * `charging` / `chargingTime` / `dischargingTime` / `level` observables\n * with the `BatteryManager` instance. Listeners are torn down on unmount.\n *\n * SSR-safe: falls back to defaults (`charging=false`, `level=1`) when\n * `navigator` or `getBattery` is unavailable.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createBattery(): UseBatteryReturn {\n  const isSupported$ = createSupported(\n    () =>\n      !!defaultNavigator &&\n      \"getBattery\" in defaultNavigator &&\n      typeof (defaultNavigator as NavigatorWithBattery).getBattery === \"function\"\n  );\n\n  const charging$ = observable(false);\n  const chargingTime$ = observable(0);\n  const dischargingTime$ = observable(0);\n  const level$ = observable(1);\n\n  onMount(() => {\n    if (!isSupported$.peek()) return;\n\n    let disposed = false;\n    let battery: BatteryManager | null = null;\n\n    const updateBatteryInfo = () => {\n      if (!battery) return;\n      batch(() => {\n        charging$.set(battery!.charging);\n        chargingTime$.set(battery!.chargingTime || 0);\n        dischargingTime$.set(battery!.dischargingTime || 0);\n        level$.set(battery!.level);\n      });\n    };\n\n    (defaultNavigator as NavigatorWithBattery).getBattery().then((_battery) => {\n      if (disposed) return;\n      battery = _battery;\n      updateBatteryInfo();\n      for (const event of BATTERY_EVENTS) {\n        battery.addEventListener(event, updateBatteryInfo);\n      }\n    });\n\n    return () => {\n      disposed = true;\n      if (battery) {\n        for (const event of BATTERY_EVENTS) {\n          battery.removeEventListener(event, updateBatteryInfo);\n        }\n      }\n    };\n  });\n\n  return {\n    isSupported$,\n    charging$: charging$ as ReadonlyObservable<boolean>,\n    chargingTime$: chargingTime$ as ReadonlyObservable<number>,\n    dischargingTime$: dischargingTime$ as ReadonlyObservable<number>,\n    level$: level$ as ReadonlyObservable<number>,\n  };\n}\n"],"mappings":"AAAA,SAAS,OAAO,kBAAkB;AAClC,SAAS,iBAAiB,eAAe;AAEzC,SAAS,wBAAwB;AAwBjC,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAAA;AAaO,SAAS,gBAAkC;AAChD,QAAM,eAAe;AAAA,IACnB,MACE,CAAC,CAAC,oBACF,gBAAgB,oBAChB,OAAQ,iBAA0C,eAAe;AAAA,EACrE;AAEA,QAAM,YAAY,WAAW,KAAK;AAClC,QAAM,gBAAgB,WAAW,CAAC;AAClC,QAAM,mBAAmB,WAAW,CAAC;AACrC,QAAM,SAAS,WAAW,CAAC;AAE3B,UAAQ,MAAM;AACZ,QAAI,CAAC,aAAa,KAAK,EAAG;AAE1B,QAAI,WAAW;AACf,QAAI,UAAiC;AAErC,UAAM,oBAAoB,MAAM;AAC9B,UAAI,CAAC,QAAS;AACd,YAAM,MAAM;AACV,kBAAU,IAAI,QAAS,QAAQ;AAC/B,sBAAc,IAAI,QAAS,gBAAgB,CAAC;AAC5C,yBAAiB,IAAI,QAAS,mBAAmB,CAAC;AAClD,eAAO,IAAI,QAAS,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH;AAEA,IAAC,iBAA0C,WAAW,EAAE,KAAK,CAAC,aAAa;AACzE,UAAI,SAAU;AACd,gBAAU;AACV,wBAAkB;AAClB,iBAAW,SAAS,gBAAgB;AAClC,gBAAQ,iBAAiB,OAAO,iBAAiB;AAAA,MACnD;AAAA,IACF,CAAC;AAED,WAAO,MAAM;AACX,iBAAW;AACX,UAAI,SAAS;AACX,mBAAW,SAAS,gBAAgB;AAClC,kBAAQ,oBAAoB,OAAO,iBAAiB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}