Live video on the AT Protocol

app: fix native fullscreen view

authored by 10xcrazy.horse and committed by

Natalie B df57b1be 5e77d632

+51 -1
+18
js/app/components/livestream/livestream.tsx
··· 35 35 import { useToastController } from "@tamagui/toast"; 36 36 import { selectProfiles, getProfile } from "features/bluesky/blueskySlice"; 37 37 import storage from "storage"; 38 + import { useFullscreen } from "contexts/FullscreenContext"; 38 39 39 40 export default function Livestream(props: Partial<PlayerProps>) { 40 41 return ( ··· 63 64 const [innerHeight, setInnerHeight] = useState(0); 64 65 const [isChatVisible, setIsChatVisible] = useState(true); 65 66 const [currentUserDID, setCurrentUserDID] = useState<string | null>(null); 67 + const { fullscreen, setFullscreen } = useFullscreen(); 66 68 67 69 const streamerDID = player.livestream?.author?.did; 68 70 const streamerProfile = streamerDID ? profiles[streamerDID] : undefined; ··· 115 117 } 116 118 }; 117 119 120 + if (fullscreen) { 121 + return ( 122 + <RNView style={{ flex: 1 }}> 123 + <Player 124 + telemetry={telemetry === true} 125 + src={src} 126 + fullscreen={fullscreen} 127 + setFullscreen={setFullscreen} 128 + {...extraProps} 129 + /> 130 + </RNView> 131 + ); 132 + } 133 + 118 134 return ( 119 135 <RNView style={{ flex: 1 }}> 120 136 <SafeAreaView style={{ flex: 1 }} onLayout={onOuterLayout}> ··· 195 211 <Player 196 212 telemetry={telemetry === true} 197 213 src={src} 214 + fullscreen={fullscreen} 215 + setFullscreen={setFullscreen} 198 216 {...extraProps} 199 217 /> 200 218 <View
+27
js/app/contexts/FullscreenContext.tsx
··· 1 + import React, { createContext, useContext, useState, ReactNode } from "react"; 2 + 3 + interface FullscreenContextValue { 4 + fullscreen: boolean; 5 + setFullscreen: (value: boolean) => void; 6 + } 7 + 8 + const FullscreenContext = createContext<FullscreenContextValue | undefined>( 9 + undefined, 10 + ); 11 + 12 + export const FullscreenProvider = ({ children }: { children: ReactNode }) => { 13 + const [fullscreen, setFullscreen] = useState(false); 14 + return ( 15 + <FullscreenContext.Provider value={{ fullscreen, setFullscreen }}> 16 + {children} 17 + </FullscreenContext.Provider> 18 + ); 19 + }; 20 + 21 + export function useFullscreen() { 22 + const ctx = useContext(FullscreenContext); 23 + if (!ctx) { 24 + throw new Error("useFullscreen must be used within a FullscreenProvider"); 25 + } 26 + return ctx; 27 + }
+6 -1
js/app/src/screens/stream.tsx
··· 2 2 import { isWeb } from "tamagui"; 3 3 import { queryToProps } from "./util"; 4 4 import Livestream from "components/livestream/livestream"; 5 + import { FullscreenProvider } from "contexts/FullscreenContext"; 5 6 6 7 export default function StreamScreen({ route }) { 7 8 const { user, protocol, url } = route.params; ··· 13 14 if (user === "stream") { 14 15 src = url; 15 16 } 16 - return <Livestream src={src} {...extraProps} />; 17 + return ( 18 + <FullscreenProvider> 19 + <Livestream src={src} {...extraProps} /> 20 + </FullscreenProvider> 21 + ); 17 22 }