Live video on the AT Protocol
1import { useRoute } from "@react-navigation/native";
2import {
3 LivestreamProvider,
4 PlayerProvider,
5 zero,
6} from "@streamplace/components";
7import BentoGrid from "components/live-dashboard/bento-grid";
8import Loading from "components/loading/loading";
9import { VideoElementProvider } from "contexts/VideoElementContext";
10import { useLiveUser } from "hooks/useLiveUser";
11import { useCallback, useEffect, useState } from "react";
12import { useStore } from "store";
13import { useIsReady, useUserProfile } from "store/hooks";
14
15const { flex, bg } = zero;
16
17export default function LiveDashboard() {
18 const isReady = useIsReady();
19 const userProfile = useUserProfile();
20 const isLive = useLiveUser();
21 const openLoginModal = useStore((state) => state.openLoginModal);
22 const route = useRoute();
23 const [videoElement, setVideoElement] = useState<HTMLVideoElement | null>(
24 null,
25 );
26
27 const videoRef = useCallback((node: HTMLVideoElement | null) => {
28 if (node !== null) {
29 setVideoElement(node);
30 }
31 }, []);
32
33 useEffect(() => {
34 if (isReady && !userProfile) {
35 openLoginModal({ name: route.name, params: route.params });
36 }
37 }, [isReady, userProfile, openLoginModal, route.name, route.params]);
38
39 if (!isReady) {
40 return <Loading />;
41 }
42
43 if (!userProfile) {
44 return <Loading />;
45 }
46
47 return (
48 <LivestreamProvider src={userProfile.did}>
49 <VideoElementProvider videoElement={videoElement}>
50 <PlayerProvider>
51 <BentoGrid isLive={isLive} videoRef={videoRef} />
52 </PlayerProvider>
53 </VideoElementProvider>
54 </LivestreamProvider>
55 );
56}