Live video on the AT Protocol
79
fork

Configure Feed

Select the types of activity you want to include in your feed.

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