Skip to content

Commit 3fd6721

Browse files
committed
implement meeting end timer
1 parent 1f0409c commit 3fd6721

File tree

3 files changed

+110
-1
lines changed

3 files changed

+110
-1
lines changed

src/DailyParticipants.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ export const localIdState = atom<string>({
4747
default: '',
4848
});
4949

50+
export const localJoinDateState = atom<Date | null>({
51+
key: RECOIL_PREFIX + 'local-joined-date',
52+
default: null,
53+
});
54+
5055
export const participantIdsState = atom<string[]>({
5156
key: RECOIL_PREFIX + 'participant-ids',
5257
default: [],
@@ -167,7 +172,17 @@ export const DailyParticipants: React.FC<React.PropsWithChildren<{}>> = ({
167172
}, [daily, initParticipants]);
168173
useDailyEvent('started-camera', handleInitEvent);
169174
useDailyEvent('access-state-updated', handleInitEvent);
170-
useDailyEvent('joining-meeting', handleInitEvent);
175+
useDailyEvent(
176+
'joining-meeting',
177+
useRecoilCallback(
178+
({ set }) =>
179+
() => {
180+
set(localJoinDateState, new Date());
181+
handleInitEvent();
182+
},
183+
[handleInitEvent]
184+
)
185+
);
171186
useDailyEvent(
172187
'joined-meeting',
173188
useCallback(

src/hooks/useRoomExp.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import { useEffect, useState } from 'react';
2+
import { useRecoilValue } from 'recoil';
3+
4+
import { localJoinDateState } from '../DailyParticipants';
5+
import { useRoom } from './useRoom';
6+
7+
interface Countdown {
8+
hours: number;
9+
minutes: number;
10+
seconds: number;
11+
}
12+
13+
interface Props {
14+
onCountdown?(countdown: Countdown): void;
15+
}
16+
17+
export const useRoomExp = ({ onCountdown }: Props = {}) => {
18+
const localJoinDate = useRecoilValue(localJoinDateState);
19+
const room = useRoom();
20+
21+
const [ejectDate, setEjectDate] = useState<Date | null>(null);
22+
23+
useEffect(() => {
24+
const ejectAfterElapsed =
25+
room?.tokenConfig?.eject_after_elapsed ??
26+
room?.config?.eject_after_elapsed ??
27+
0;
28+
const expUTCTimeStamp = room?.tokenConfig?.exp ?? room?.config?.exp ?? 0;
29+
const ejectAtExp =
30+
room?.tokenConfig?.eject_at_token_exp ??
31+
room?.config?.eject_at_room_exp ??
32+
false;
33+
34+
let newEjectDate: Date = new Date(0);
35+
36+
if (ejectAfterElapsed && localJoinDate) {
37+
newEjectDate = new Date(
38+
localJoinDate.getTime() + 1000 * ejectAfterElapsed
39+
);
40+
}
41+
42+
if (ejectAtExp && expUTCTimeStamp) {
43+
const expDate = new Date(expUTCTimeStamp * 1000);
44+
if (
45+
(newEjectDate.getTime() > 0 && expDate < newEjectDate) ||
46+
!newEjectDate.getTime()
47+
)
48+
newEjectDate = expDate;
49+
}
50+
51+
if (newEjectDate.getTime() === 0) return;
52+
53+
setEjectDate((oldEjectDate) =>
54+
oldEjectDate?.getTime() !== newEjectDate.getTime()
55+
? newEjectDate
56+
: oldEjectDate
57+
);
58+
}, [
59+
localJoinDate,
60+
room?.config?.eject_after_elapsed,
61+
room?.config?.eject_at_room_exp,
62+
room?.config?.exp,
63+
room?.tokenConfig?.eject_after_elapsed,
64+
room?.tokenConfig?.eject_at_token_exp,
65+
room?.tokenConfig?.exp,
66+
]);
67+
68+
useEffect(() => {
69+
if (!ejectDate || ejectDate.getTime() === 0) return;
70+
71+
const interval = setInterval(() => {
72+
const eject = (ejectDate?.getTime() ?? 0) / 1000;
73+
const now = Date.now() / 1000;
74+
const diff = eject - now;
75+
if (diff < 0) return;
76+
const hours = Math.max(0, Math.floor(diff / 3600));
77+
const minutes = Math.max(0, Math.floor((diff % 3600) / 60));
78+
const seconds = Math.max(0, Math.floor(diff % 60));
79+
onCountdown?.({
80+
hours,
81+
minutes,
82+
seconds,
83+
});
84+
}, 1000);
85+
return () => {
86+
clearInterval(interval);
87+
};
88+
}, [ejectDate, onCountdown]);
89+
90+
return {
91+
ejectDate,
92+
};
93+
};

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export { usePermissions } from './hooks/usePermissions';
2828
export { useReceiveSettings } from './hooks/useReceiveSettings';
2929
export { useRecording } from './hooks/useRecording';
3030
export { useRoom } from './hooks/useRoom';
31+
export { useRoomExp } from './hooks/useRoomExp';
3132
export { useScreenAudioTrack } from './hooks/useScreenAudioTrack';
3233
export { ScreenShare, useScreenShare } from './hooks/useScreenShare';
3334
export { useScreenVideoTrack } from './hooks/useScreenVideoTrack';

0 commit comments

Comments
 (0)