{"version":3,"sources":["../../../../src/sensors/useIdle/core.ts"],"sourcesContent":["import { observable, type Observable, ObservableHint, type OpaqueObject } from \"@legendapp/state\";\nimport { onMount, type DeepMaybeObservable, type ReadonlyObservable } from \"@usels/core\";\nimport { createTimeoutFn } from \"@usels/core/timer/useTimeoutFn/core\";\nimport { resolveWindowSource, type ConfigurableWindow } from \"@shared/configurable\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\n\nconst DEFAULT_EVENTS = [\n  \"mousemove\",\n  \"mousedown\",\n  \"resize\",\n  \"keydown\",\n  \"touchstart\",\n  \"wheel\",\n] as const;\nconst ONE_MINUTE = 60_000;\n\nexport interface UseIdleOptions extends ConfigurableWindow {\n  /** Timeout in ms before idle state (default: 60000) */\n  timeout?: number;\n  /** Events to listen for activity (default: mousemove, mousedown, resize, keydown, touchstart, wheel) */\n  events?: string[];\n  /** Also listen to visibilitychange (default: true) */\n  listenForVisibilityChange?: boolean;\n  /** Initial idle state (default: false) */\n  initialState?: boolean;\n}\n\nexport interface UseIdleReturn {\n  /** Whether the user is currently idle */\n  idle$: ReadonlyObservable<boolean>;\n  /** Timestamp of last user activity */\n  lastActive$: ReadonlyObservable<number>;\n  /** Reset the idle timer */\n  reset: () => void;\n}\n\n/**\n * Framework-agnostic idle tracker.\n *\n * Monitors user interaction events (mouse, keyboard, touch, resize) and\n * sets `idle$` to `true` after a configurable timeout with no activity.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createIdle(options?: DeepMaybeObservable<UseIdleOptions>): UseIdleReturn {\n  const opts$ = observable(options);\n  const win$ = resolveWindowSource(opts$.window as unknown as Observable<unknown>);\n  const doc$ = observable<OpaqueObject<Document> | null>(() => {\n    const doc = win$.get()?.document;\n    return doc ? ObservableHint.opaque(doc) : null;\n  });\n\n  // Mount-time reads\n  const events =\n    (opts$.peek()?.events as string[] | undefined) ?? (DEFAULT_EVENTS as unknown as string[]);\n  const initialState = opts$.peek()?.initialState ?? false;\n  const listenForVisibilityChange = opts$.peek()?.listenForVisibilityChange ?? true;\n\n  const idle$ = observable(initialState);\n  const lastActive$ = observable(Date.now());\n\n  const timeout$ = observable(() => opts$.timeout.get() ?? ONE_MINUTE);\n  const { start } = createTimeoutFn(() => idle$.set(true), timeout$, { immediate: false });\n\n  const reset = () => {\n    idle$.set(false);\n    start();\n  };\n\n  const onActivity = () => {\n    lastActive$.set(Date.now());\n    reset();\n  };\n\n  const onVisibilityChange = () => {\n    if (!win$.peek()?.document.hidden) {\n      onActivity();\n    }\n  };\n\n  createEventListener(win$, events, onActivity, { passive: true });\n  createEventListener(\n    listenForVisibilityChange ? doc$ : null,\n    \"visibilitychange\",\n    onVisibilityChange,\n    { passive: true }\n  );\n\n  onMount(() => {\n    if (!initialState) reset();\n  });\n\n  return {\n    idle$,\n    lastActive$,\n    reset,\n  };\n}\n"],"mappings":"AAAA,SAAS,YAA6B,sBAAyC;AAC/E,SAAS,eAAkE;AAC3E,SAAS,uBAAuB;AAChC,SAAS,2BAAoD;AAC7D,SAAS,2BAA2B;AAEpC,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,MAAM,aAAa;AAAA;AA6BZ,SAAS,WAAW,SAA8D;AACvF,QAAM,QAAQ,WAAW,OAAO;AAChC,QAAM,OAAO,oBAAoB,MAAM,MAAwC;AAC/E,QAAM,OAAO,WAA0C,MAAM;AAC3D,UAAM,MAAM,KAAK,IAAI,GAAG;AACxB,WAAO,MAAM,eAAe,OAAO,GAAG,IAAI;AAAA,EAC5C,CAAC;AAGD,QAAM,SACH,MAAM,KAAK,GAAG,UAAoC;AACrD,QAAM,eAAe,MAAM,KAAK,GAAG,gBAAgB;AACnD,QAAM,4BAA4B,MAAM,KAAK,GAAG,6BAA6B;AAE7E,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,cAAc,WAAW,KAAK,IAAI,CAAC;AAEzC,QAAM,WAAW,WAAW,MAAM,MAAM,QAAQ,IAAI,KAAK,UAAU;AACnE,QAAM,EAAE,MAAM,IAAI,gBAAgB,MAAM,MAAM,IAAI,IAAI,GAAG,UAAU,EAAE,WAAW,MAAM,CAAC;AAEvF,QAAM,QAAQ,MAAM;AAClB,UAAM,IAAI,KAAK;AACf,UAAM;AAAA,EACR;AAEA,QAAM,aAAa,MAAM;AACvB,gBAAY,IAAI,KAAK,IAAI,CAAC;AAC1B,UAAM;AAAA,EACR;AAEA,QAAM,qBAAqB,MAAM;AAC/B,QAAI,CAAC,KAAK,KAAK,GAAG,SAAS,QAAQ;AACjC,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,sBAAoB,MAAM,QAAQ,YAAY,EAAE,SAAS,KAAK,CAAC;AAC/D;AAAA,IACE,4BAA4B,OAAO;AAAA,IACnC;AAAA,IACA;AAAA,IACA,EAAE,SAAS,KAAK;AAAA,EAClB;AAEA,UAAQ,MAAM;AACZ,QAAI,CAAC,aAAc,OAAM;AAAA,EAC3B,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}