Skip to content

Commit

Permalink
feat(web): add online atom
Browse files Browse the repository at this point in the history
  • Loading branch information
kasperskei committed Oct 11, 2024
1 parent ec71d33 commit 7113bd3
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 2 deletions.
4 changes: 3 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,9 @@
"test:watch": "tsx watch src/index.test.ts"
},
"dependencies": {
"@reatom/core": ">=3.5.0"
"@reatom/core": ">=3.5.0",
"@reatom/hooks": "^3.2.0",
"@reatom/primitives": "^3.5.0"
},
"author": "artalar",
"maintainers": [
Expand Down
2 changes: 2 additions & 0 deletions packages/web/src/event.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,14 @@ export const onEvent: {
target: Target,
type: Type,
cb: (value: EventOfTarget<Target, Type>) => any,
options?: AddEventListenerOptions
): Unsubscribe
<Event>(
ctx: Ctx,
target: EventTarget,
type: string,
cb: (value: Event) => any,
options?: AddEventListenerOptions
): Unsubscribe
} = (ctx: Ctx, target: EventTarget, type: string, listener: Fn) => {
let un
Expand Down
1 change: 1 addition & 0 deletions packages/web/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './event'
export * from './online'
45 changes: 45 additions & 0 deletions packages/web/src/online.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import {
atom,
type Atom,
} from '@reatom/core'
import {
onConnect,
} from '@reatom/hooks'
import {
withAssign,
} from '@reatom/primitives'
import {
onEvent,
} from './event'

type OnlineAtom = Atom<boolean> & {
/** Time stamp of transition to online mode. */
offlineAtAtom: Atom<number | undefined>
/** Time stamp of transition to offline mode. */
onlineAtAtom: Atom<number | undefined>
}

/**
* @note https://issues.chromium.org/issues/338514113
*/
export const createOnlineAtom = (): OnlineAtom => {
const onlineAtom = atom(navigator.onLine, 'onLine')
.pipe(withAssign(() => ({
offlineAtAtom: atom<number | undefined>(undefined),
onlineAtAtom: atom<number | undefined>(undefined),
})))

onConnect(onlineAtom, (ctx) => {
onlineAtom(ctx, navigator.onLine)
onEvent(ctx, window, 'online', () => {
onlineAtom(ctx, true)
onlineAtom.onlineAtAtom(ctx, Date.now())
})
onEvent(ctx, window, 'offline', () => {
onlineAtom(ctx, false)
onlineAtom.offlineAtAtom(ctx, Date.now())
})
})

return onlineAtom
}

0 comments on commit 7113bd3

Please sign in to comment.