From 2e22d4d417a4eec6073c4d70064f53fe21f37469 Mon Sep 17 00:00:00 2001 From: Christian Stuff Date: Fri, 8 Jul 2022 11:05:12 +0200 Subject: [PATCH 1/3] add useLocalSessionId --- src/hooks/useLocalSessionId.ts | 11 ++++++ src/index.ts | 1 + test/hooks/useLocalSessionId.test.tsx | 50 +++++++++++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 src/hooks/useLocalSessionId.ts create mode 100644 test/hooks/useLocalSessionId.test.tsx diff --git a/src/hooks/useLocalSessionId.ts b/src/hooks/useLocalSessionId.ts new file mode 100644 index 0000000..fd21ed8 --- /dev/null +++ b/src/hooks/useLocalSessionId.ts @@ -0,0 +1,11 @@ +import { useRecoilValue } from 'recoil'; + +import { localIdState } from '../DailyParticipants'; + +/** + * Returns the local participant's session_id or null, + * if the local participant doesn't exist. + */ +export const useLocalSessionId = () => { + return useRecoilValue(localIdState) || null; +}; diff --git a/src/index.ts b/src/index.ts index bd9e2bc..589fb4b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ export { StatefulDevice, useDevices } from './hooks/useDevices'; export { useInputSettings } from './hooks/useInputSettings'; export { useLiveStreaming } from './hooks/useLiveStreaming'; export { useLocalParticipant } from './hooks/useLocalParticipant'; +export { useLocalSessionId } from './hooks/useLocalSessionId'; export { useMediaTrack } from './hooks/useMediaTrack'; export { useNetwork } from './hooks/useNetwork'; export { useParticipant } from './hooks/useParticipant'; diff --git a/test/hooks/useLocalSessionId.test.tsx b/test/hooks/useLocalSessionId.test.tsx new file mode 100644 index 0000000..4d2660a --- /dev/null +++ b/test/hooks/useLocalSessionId.test.tsx @@ -0,0 +1,50 @@ +/// + +import DailyIframe, { DailyCall } from '@daily-co/daily-js'; +import { renderHook } from '@testing-library/react-hooks'; +import React from 'react'; + +import { DailyProvider } from '../../src/DailyProvider'; +import { useLocalSessionId } from '../../src/hooks/useLocalSessionId'; + +/** + * Mock DailyRoom. + * It's not required for useLocalSessionId and causes unwanted state updates. + */ +jest.mock('../../src/DailyRoom', () => ({ + DailyRoom: (({ children }) => <>{children}) as React.FC, +})); + +const createWrapper = + (callObject: DailyCall = DailyIframe.createCallObject()): React.FC => + ({ children }) => + {children}; + +describe('useLocalSessionId', () => { + it('returns null, if daily.participants() does not contain local user yet', async () => { + const daily = DailyIframe.createCallObject(); + (daily.participants as jest.Mock).mockImplementation(() => ({})); + const { result, waitFor } = renderHook(() => useLocalSessionId(), { + wrapper: createWrapper(daily), + }); + await waitFor(() => { + expect(result.current).toBeNull(); + }); + }); + it('returns local user session_id', async () => { + const daily = DailyIframe.createCallObject(); + (daily.participants as jest.Mock).mockImplementation(() => ({ + local: { + local: true, + session_id: 'local', + user_name: '', + }, + })); + const { result, waitFor } = renderHook(() => useLocalSessionId(), { + wrapper: createWrapper(daily), + }); + await waitFor(() => { + expect(result.current).toEqual('local'); + }); + }); +}); From a26d4a84bc10beae6e8bf6a77a0335d55b73ed62 Mon Sep 17 00:00:00 2001 From: Christian Stuff Date: Fri, 8 Jul 2022 11:06:41 +0200 Subject: [PATCH 2/3] replace useLocalParticipant with useLocalSessionId This does not replace all occurrences of useLocalParticipant, because in some places we access other properties of the local participant. This commit only replaces occurrences where we only accessed the local participant's session_id. --- src/hooks/useRecording.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hooks/useRecording.ts b/src/hooks/useRecording.ts index 0d0c40c..f99563b 100644 --- a/src/hooks/useRecording.ts +++ b/src/hooks/useRecording.ts @@ -15,7 +15,7 @@ import { import { useDaily } from './useDaily'; import { useDailyEvent } from './useDailyEvent'; -import { useLocalParticipant } from './useLocalParticipant'; +import { useLocalSessionId } from './useLocalSessionId'; import { useParticipantIds } from './useParticipantIds'; interface UseRecordingArgs { @@ -85,7 +85,7 @@ export const useRecording = ({ const state = useRecoilValue(recordingState); const setState = useSetRecoilState(recordingState); - const localParticipant = useLocalParticipant(); + const localSessionId = useLocalSessionId(); const recordingParticipantIds = useParticipantIds({ filter: 'record', @@ -96,7 +96,7 @@ export const useRecording = ({ useEffect(() => { const hasRecordingParticipants = recordingParticipantIds.length > 0; const isLocalParticipantRecording = recordingParticipantIds.includes( - localParticipant?.session_id ?? 'local' + localSessionId ?? 'local' ); setState((s) => ({ ...s, @@ -119,7 +119,7 @@ export const useRecording = ({ */ type: hasRecordingParticipants ? 'local' : s?.type, })); - }, [localParticipant?.session_id, recordingParticipantIds, setState]); + }, [localSessionId, recordingParticipantIds, setState]); useDailyEvent( 'recording-started', @@ -131,9 +131,9 @@ export const useRecording = ({ case 'cloud-beta': case 'cloud': { if ( - localParticipant && + localSessionId && ev.layout?.preset === 'single-participant' && - ev.layout.session_id !== localParticipant?.session_id + ev.layout.session_id !== localSessionId ) { isLocalParticipantRecorded = false; } @@ -153,7 +153,7 @@ export const useRecording = ({ }); setTimeout(() => onRecordingStarted?.(ev), 0); }, - [localParticipant, onRecordingStarted] + [localSessionId, onRecordingStarted] ) ); useDailyEvent( From cc916452e004f947a07c2301b919a3a6b8fe887a Mon Sep 17 00:00:00 2001 From: Christian Stuff Date: Fri, 8 Jul 2022 11:12:41 +0200 Subject: [PATCH 3/3] update useRecording test mock --- test/hooks/useRecording.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/hooks/useRecording.test.tsx b/test/hooks/useRecording.test.tsx index 49091b0..55c0d70 100644 --- a/test/hooks/useRecording.test.tsx +++ b/test/hooks/useRecording.test.tsx @@ -24,8 +24,8 @@ jest.mock('../../src/DailyRoom', () => ({ const localId = faker.datatype.uuid(); -jest.mock('../../src/hooks/useLocalParticipant', () => ({ - useLocalParticipant: () => ({ session_id: localId }), +jest.mock('../../src/hooks/useLocalSessionId', () => ({ + useLocalSessionId: () => localId, })); const createWrapper =