Skip to content

Commit

Permalink
feat(web): add online atom (#940)
Browse files Browse the repository at this point in the history
* feat(web): add online atom

* chore(web): fix atoms names

---------

Co-authored-by: Arutiunian Artem <[email protected]>
  • Loading branch information
kasperskei and artalar authored Oct 14, 2024
1 parent 042a77c commit 6413696
Show file tree
Hide file tree
Showing 5 changed files with 45 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'
36 changes: 36 additions & 0 deletions packages/web/src/online.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
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, 'onLine.offlineAtAtom'),
onlineAtAtom: atom<number | undefined>(undefined, 'onLine.onlineAtAtom'),
})))

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 6413696

Please sign in to comment.