Live video on the AT Protocol
79
fork

Configure Feed

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

at eli/pg-locking-fix 99 lines 2.7 kB view raw
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}