Files
cinny/src/app/hooks/useCall.ts
T

61 lines
2.1 KiB
TypeScript
Raw Normal View History

2026-03-07 18:03:32 +11:00
import { Room } from 'matrix-js-sdk';
import {
MatrixRTCSession,
MatrixRTCSessionEvent,
2026-05-23 17:20:41 +05:30
MatrixRTCSessionEventHandlerMap,
2026-03-07 18:03:32 +11:00
} from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSession';
import { CallMembership } from 'matrix-js-sdk/lib/matrixrtc/CallMembership';
import { useEffect, useState } from 'react';
import { MatrixRTCSessionManagerEvents } from 'matrix-js-sdk/lib/matrixrtc/MatrixRTCSessionManager';
import { useMatrixClient } from './useMatrixClient';
export const useCallSession = (room: Room): MatrixRTCSession => {
const mx = useMatrixClient();
const [session, setSession] = useState(mx.matrixRTC.getRoomSession(room));
useEffect(() => {
const start = (roomId: string) => {
if (roomId !== room.roomId) return;
setSession(mx.matrixRTC.getRoomSession(room));
};
const end = (roomId: string) => {
if (roomId !== room.roomId) return;
setSession(mx.matrixRTC.getRoomSession(room));
};
mx.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionStarted, start);
mx.matrixRTC.on(MatrixRTCSessionManagerEvents.SessionEnded, end);
return () => {
mx.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionStarted, start);
mx.matrixRTC.off(MatrixRTCSessionManagerEvents.SessionEnded, end);
};
}, [mx, room]);
return session;
};
2026-05-23 17:20:41 +05:30
export const useCallMembersChange = (
session: MatrixRTCSession,
2026-05-23 11:26:45 -04:00
callback: (members: CallMembership[]) => void,
2026-05-23 17:20:41 +05:30
): void => {
2026-03-07 18:03:32 +11:00
useEffect(() => {
2026-05-23 17:20:41 +05:30
const handleMembershipsChange: MatrixRTCSessionEventHandlerMap[MatrixRTCSessionEvent.MembershipsChanged] =
(oldestMembership, newMemberships) => {
callback(newMemberships);
};
2026-03-07 18:03:32 +11:00
2026-05-23 17:20:41 +05:30
session.on(MatrixRTCSessionEvent.MembershipsChanged, handleMembershipsChange);
2026-03-07 18:03:32 +11:00
return () => {
2026-05-23 17:20:41 +05:30
session.removeListener(MatrixRTCSessionEvent.MembershipsChanged, handleMembershipsChange);
2026-03-07 18:03:32 +11:00
};
2026-05-23 17:20:41 +05:30
}, [session, callback]);
2026-03-07 18:03:32 +11:00
};
2026-05-23 17:20:41 +05:30
export const useCallMembers = (session: MatrixRTCSession): CallMembership[] => {
const [memberships, setMemberships] = useState<CallMembership[]>(session.memberships);
useCallMembersChange(session, setMemberships);
return memberships;
};