Skip to content

Commit 9d26b72

Browse files
⚡ Expose IIdleTimer on callback methods. #339
1 parent e4a7a05 commit 9d26b72

6 files changed

Lines changed: 131 additions & 52 deletions

File tree

src/types/IEventHandler.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
import { EventType } from './EventType'
1+
import type { EventType } from './EventType'
2+
import type { IIdleTimer } from './IIdleTimer'
3+
24
export interface IEventHandler {
3-
(event?: EventType): void
5+
(event?: EventType, idleTimer?: IIdleTimer): void
46
cancel?: () => void
57
}

src/types/IIdleTimerProps.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export interface IIdleTimerProps {
6464
*
6565
* @default () => {}
6666
*/
67-
onPresenceChange?: (presence: PresenceType) => void
67+
onPresenceChange?: (presence: PresenceType, idleTimer?: IIdleTimer) => void
6868

6969
/**
7070
* When promptTimeout is set, this function is called after the user becomes
@@ -73,36 +73,36 @@ export interface IIdleTimerProps {
7373
*
7474
* @default () => {}
7575
*/
76-
onPrompt?: () => void
76+
onPrompt?: (event?: Event, idleTimer?: IIdleTimer) => void
7777

7878
/**
7979
* Function to call when user is idle.
8080
*
8181
* @default () => {}
8282
*/
83-
onIdle?: () => void
83+
onIdle?: (event?: Event, idleTimer?: IIdleTimer) => void
8484

8585
/**
8686
* Function to call when user becomes active.
8787
*
8888
* @default () => {}
8989
*/
90-
onActive?: (event?: Event) => void
90+
onActive?: (event?: Event, idleTimer?: IIdleTimer) => void
9191

9292
/**
9393
* Function to call on user activity. Can be throttled or debounced using the
9494
* `throttle` and `debounce` props.
9595
*
9696
* @default () => {}
9797
*/
98-
onAction?: (event?: Event) => void
98+
onAction?: (event?: Event, idleTimer?: IIdleTimer) => void
9999

100100
/**
101101
* Function to call when message is has been emitted.
102102
*
103103
* @default () => {}
104104
*/
105-
onMessage?: (data: any) => void
105+
onMessage?: (data: any, idleTimer?: IIdleTimer) => void
106106

107107
/**
108108
* Debounce the onAction function by setting delay in milliseconds.

src/types/IMessageHandler.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type { IIdleTimer } from './IIdleTimer'
2+
3+
export interface IMessageHandler {
4+
(data: any, idleTimer: IIdleTimer): void
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import type { PresenceType } from './PresenceType'
2+
import type { IIdleTimer } from './IIdleTimer'
3+
4+
export interface IPresenceChangeHandler {
5+
(presence: PresenceType, idleTimer: IIdleTimer): void
6+
}

src/useIdleTimer.tsx

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import { throttleFn } from './utils/throttle'
99
import { setTimers, timers as timer } from './utils/timers'
1010
import { now } from './utils/now'
1111

12-
import { EventType } from './types/EventType'
13-
import { IEventHandler } from './types/IEventHandler'
14-
import { IIdleTimer } from './types/IIdleTimer'
15-
import { IIdleTimerProps } from './types/IIdleTimerProps'
16-
import { EventsType } from './types/EventsType'
17-
import { MessageType } from './types/MessageType'
18-
import { PresenceType } from './types/PresenceType'
12+
import type { EventType } from './types/EventType'
13+
import type { IEventHandler } from './types/IEventHandler'
14+
import type { IIdleTimer } from './types/IIdleTimer'
15+
import type { IIdleTimerProps } from './types/IIdleTimerProps'
16+
import type { IPresenceChangeHandler } from './types/IPresenceChangeHandler'
17+
import type { IMessageHandler } from './types/IMessageHandler'
18+
import type { EventsType } from './types/EventsType'
19+
import type { MessageType } from './types/MessageType'
1920

2021
const MAX_TIMEOUT = 2147483647
2122

@@ -106,7 +107,7 @@ export function useIdleTimer ({
106107
if (!firstLoad.current) {
107108
if (startManually) return
108109
if (idle.current) {
109-
emitOnActive.current()
110+
emitOnActive.current(null, idleTimer)
110111
if (manager.current) {
111112
manager.current.active()
112113
}
@@ -128,7 +129,7 @@ export function useIdleTimer ({
128129
)
129130

130131
// On Presence Change Emitter
131-
const emitOnPresenceChange = useRef<(presence: PresenceType) => void>(onPresenceChange)
132+
const emitOnPresenceChange = useRef<IPresenceChangeHandler>(onPresenceChange)
132133
useEffect(() => {
133134
emitOnPresenceChange.current = onPresenceChange
134135
}, [onPresenceChange])
@@ -158,13 +159,13 @@ export function useIdleTimer ({
158159
}, [onAction])
159160

160161
// On Message Emitter
161-
const emitOnMessage = useRef<(data: string | number | object) => void>(onMessage)
162+
const emitOnMessage = useRef<IMessageHandler>(onMessage)
162163
useEffect(() => {
163164
emitOnMessage.current = onMessage
164165
}, [onMessage])
165166

166167
const callOnAction = useMemo<IEventHandler>(() => {
167-
const call: IEventHandler = (event: EventType) => emitOnAction.current(event)
168+
const call: IEventHandler = (event: EventType, idleTimer: IIdleTimer) => emitOnAction.current(event, idleTimer)
168169

169170
// Create debounced action if applicable
170171
if (debounce > 0) {
@@ -217,8 +218,8 @@ export function useIdleTimer ({
217218
*/
218219
const togglePrompted = (event?: EventType): void => {
219220
if (!prompted.current && !idle.current) {
220-
emitOnPrompt.current(event)
221-
emitOnPresenceChange.current({ type: 'active', prompted: true })
221+
emitOnPrompt.current(event, idleTimer)
222+
emitOnPresenceChange.current({ type: 'active', prompted: true }, idleTimer)
222223
}
223224
remaining.current = 0
224225
promptTime.current = now()
@@ -233,8 +234,8 @@ export function useIdleTimer ({
233234
const toggleIdle = () => {
234235
destroyTimeout()
235236
if (!idle.current) {
236-
emitOnIdle.current()
237-
emitOnPresenceChange.current({ type: 'idle' })
237+
emitOnIdle.current(null, idleTimer)
238+
emitOnPresenceChange.current({ type: 'idle' }, idleTimer)
238239
}
239240

240241
// Flip idle
@@ -258,8 +259,8 @@ export function useIdleTimer ({
258259
const toggleActive = (event?: EventType) => {
259260
destroyTimeout()
260261
if (idle.current || prompted.current) {
261-
emitOnActive.current(event)
262-
emitOnPresenceChange.current({ type: 'active', prompted: false })
262+
emitOnActive.current(event, idleTimer)
263+
emitOnPresenceChange.current({ type: 'active', prompted: false }, idleTimer)
263264
}
264265
prompted.current = false
265266
promptTime.current = 0
@@ -324,11 +325,11 @@ export function useIdleTimer ({
324325
const eventHandler = (event: EventType): void => {
325326
if (!startOnMount && !lastActive.current) {
326327
lastActive.current = now()
327-
emitOnActive.current()
328+
emitOnActive.current(null, idleTimer)
328329
}
329330

330331
// Fire onAction event
331-
callOnAction(event)
332+
callOnAction(event, idleTimer)
332333

333334
// If the prompt is open, only emit onAction
334335
if (prompted.current) return
@@ -585,10 +586,10 @@ export function useIdleTimer ({
585586
*/
586587
const message = useCallback<(data: MessageType, emitOnSelf?: boolean) => void>((data: MessageType, emitOnSelf?: boolean): void => {
587588
if (manager.current) {
588-
if (emitOnSelf) emitOnMessage.current(data)
589+
if (emitOnSelf) emitOnMessage.current(data, idleTimer)
589590
manager.current.message(data)
590591
} else if (emitOnSelf) {
591-
emitOnMessage.current(data)
592+
emitOnMessage.current(data, idleTimer)
592593
}
593594
}, [onMessage])
594595

@@ -795,8 +796,8 @@ export function useIdleTimer ({
795796
onActive: () => {
796797
toggleActive()
797798
},
798-
onMessage: (...args) => {
799-
emitOnMessage.current(...args)
799+
onMessage: (data: any) => {
800+
emitOnMessage.current(data, idleTimer)
800801
},
801802
start,
802803
reset,
@@ -866,7 +867,7 @@ export function useIdleTimer ({
866867
}, [firstLoad])
867868

868869
// Return API
869-
return {
870+
const idleTimer = {
870871
message,
871872
start,
872873
reset,
@@ -888,7 +889,7 @@ export function useIdleTimer ({
888889
getActiveTime,
889890
getTotalActiveTime,
890891
// @ts-ignore
891-
setOnPresenceChange: (fn: (presence: PresenceType) => void) => {
892+
setOnPresenceChange: (fn: IPresenceChangeHandler) => {
892893
onPresenceChange = fn
893894
emitOnPresenceChange.current = fn
894895
},
@@ -913,4 +914,6 @@ export function useIdleTimer ({
913914
emitOnMessage.current = fn
914915
}
915916
}
917+
918+
return idleTimer
916919
}

0 commit comments

Comments
 (0)