Live video on the AT Protocol
1import {
2 KeepAwake,
3 LivestreamProvider,
4 Player,
5 PlayerProps,
6 PlayerProvider,
7 usePlayerStore,
8 zero,
9} from "@streamplace/components";
10import { DesktopUi } from "components/mobile/desktop-ui";
11import { FullscreenProvider } from "contexts/FullscreenContext";
12import { useEffect, useState } from "react";
13import { Text, View } from "react-native";
14
15const { layout, flex } = zero;
16
17function IdViewer({ reqid }) {
18 const id = usePlayerStore((p) => p.id);
19 return (
20 <View style={[layout.flex.center, layout.flex.row]}>
21 <Text>
22 {reqid} {id}
23 </Text>
24 </View>
25 );
26}
27
28export default function MultiScreen({ route }) {
29 const config = route.params?.config;
30 if (typeof config !== "string") {
31 return <View />;
32 }
33
34 const [rows, setRows] = useState<Partial<PlayerProps | null>[][]>([]);
35 const [error, setError] = useState<string | null>(null);
36
37 useEffect(() => {
38 try {
39 let nearestSquareExpo = 1;
40 const playerProps = JSON.parse(
41 config as string,
42 ) as Partial<PlayerProps>[];
43 while (Math.pow(nearestSquareExpo, 2) < playerProps.length) {
44 nearestSquareExpo += 1;
45 }
46 const rows: Partial<PlayerProps | null>[][] = [];
47 let idx = 0;
48 for (let i = 0; i < nearestSquareExpo; i += 1) {
49 const row: Partial<PlayerProps | null>[] = [];
50 for (let j = 0; j < nearestSquareExpo; j += 1) {
51 if (playerProps[idx]) {
52 row.push(playerProps[idx]);
53 } else {
54 row.push(null);
55 }
56 idx += 1;
57 }
58 rows.push(row);
59 }
60 setRows(rows);
61 } catch (e) {
62 setError(e.message);
63 }
64 }, [config]);
65
66 if (error) {
67 return <Text>{error}</Text>;
68 }
69
70 return (
71 <>
72 <KeepAwake />
73 <FullscreenProvider>
74 <View style={[flex.values[1]]}>
75 {rows.map((players, i) => (
76 <View key={i} style={[flex.values[1], layout.flex.row]}>
77 {players.map((props, j) => (
78 <View key={j} style={[flex.values[1]]}>
79 {props === null ? (
80 <View />
81 ) : (
82 <LivestreamProvider src={props.src || ""}>
83 <PlayerProvider defaultId={props.playerId}>
84 <Player {...props}>
85 <DesktopUi />
86 <IdViewer reqid={props.playerId} />
87 </Player>
88 </PlayerProvider>
89 </LivestreamProvider>
90 )}
91 </View>
92 ))}
93 </View>
94 ))}
95 </View>
96 </FullscreenProvider>
97 </>
98 );
99}