11import React , { ReactNode , useMemo , memo , useEffect } from 'react' ;
22
3+ import { UserAction } from '../../../../app/ui' ;
34import { roomTypes } from '../../../../app/utils/client' ;
45import { IRoom } from '../../../../definition/IRoom' ;
6+ import { useUserSubscription } from '../../../contexts/UserContext' ;
57import { RoomManager , useHandleRoom } from '../../../lib/RoomManager' ;
68import { AsyncStatePhase } from '../../../lib/asyncState' ;
79import Skeleton from '../Room/Skeleton' ;
@@ -13,18 +15,23 @@ export type Props = {
1315 rid : IRoom [ '_id' ] ;
1416} ;
1517
18+ const fields = { } ;
19+
1620const RoomProvider = ( { rid, children } : Props ) : JSX . Element => {
1721 const { phase, value : room } = useHandleRoom ( rid ) ;
22+
23+ const subscribed = Boolean ( useUserSubscription ( rid , fields ) ) ;
1824 const context = useMemo ( ( ) => {
1925 if ( ! room ) {
2026 return null ;
2127 }
2228 room . _id = rid ;
2329 return {
30+ subscribed,
2431 rid,
2532 room : { ...room , name : roomTypes . getRoomName ( room . t , room ) } ,
2633 } ;
27- } , [ room , rid ] ) ;
34+ } , [ room , rid , subscribed ] ) ;
2835
2936 useEffect ( ( ) => {
3037 RoomManager . open ( rid ) ;
@@ -33,6 +40,17 @@ const RoomProvider = ({ rid, children }: Props): JSX.Element => {
3340 } ;
3441 } , [ rid ] ) ;
3542
43+ useEffect ( ( ) => {
44+ if ( ! subscribed ) {
45+ return ( ) : void => undefined ;
46+ }
47+
48+ UserAction . addStream ( rid ) ;
49+ return ( ) : void => {
50+ UserAction . cancel ( rid ) ;
51+ } ;
52+ } , [ rid , subscribed ] ) ;
53+
3654 if ( phase === AsyncStatePhase . LOADING || ! room ) {
3755 return < Skeleton /> ;
3856 }
0 commit comments