diff --git a/js/app/src/linking-config.ts b/js/app/src/linking-config.ts index b5c49d7db..e9041dc8f 100644 --- a/js/app/src/linking-config.ts +++ b/js/app/src/linking-config.ts @@ -123,6 +123,10 @@ export const SCREEN_PATHS = { InfoWidgetEmbed: "info-widget", LegacyStream: "legacy/:user", DanmuOBS: "widgets/:user/danmu", + PopoutStreamMonitor: "widgets/stream-monitor", + PopoutInfoWidget: "widgets/info", + PopoutMultistream: "widgets/multistream", + PopoutLivestream: "widgets/livestream", } as const; /** @@ -222,6 +226,10 @@ export const streamplaceLinkingOptions: LinkingOptions state.openLoginModal); + const hideSidebar = useStore((x) => x.setSidebarHidden); + const showSidebar = useStore((x) => x.setSidebarUnhidden); + + useEffect(() => { + hideSidebar(); + return () => { + showSidebar(); + }; + }, [showSidebar]); + + if (!isReady) return ; + if (!userProfile) { + openLoginModal({ name: "PopoutInfoWidget" }); + return ; + } + + return ( + + + + + + + + ); +} diff --git a/js/app/src/screens/popout-livestream.tsx b/js/app/src/screens/popout-livestream.tsx new file mode 100644 index 000000000..cb36b9d06 --- /dev/null +++ b/js/app/src/screens/popout-livestream.tsx @@ -0,0 +1,44 @@ +import { + LivestreamProvider, + PlayerProvider, + zero, +} from "@streamplace/components"; +import LivestreamPanel from "components/live-dashboard/livestream-panel"; +import Loading from "components/loading/loading"; +import { useEffect } from "react"; +import { View } from "react-native"; +import { useStore } from "store"; +import { useIsReady, useUserProfile } from "store/hooks"; + +const { flex, p } = zero; + +export default function PopoutLivestream() { + const isReady = useIsReady(); + const userProfile = useUserProfile(); + const openLoginModal = useStore((state) => state.openLoginModal); + const hideSidebar = useStore((x) => x.setSidebarHidden); + const showSidebar = useStore((x) => x.setSidebarUnhidden); + + useEffect(() => { + hideSidebar(); + return () => { + showSidebar(); + }; + }, [showSidebar]); + + if (!isReady) return ; + if (!userProfile) { + openLoginModal({ name: "PopoutLivestream" }); + return ; + } + + return ( + + + + + + + + ); +} diff --git a/js/app/src/screens/popout-multistream.tsx b/js/app/src/screens/popout-multistream.tsx new file mode 100644 index 000000000..83566b77c --- /dev/null +++ b/js/app/src/screens/popout-multistream.tsx @@ -0,0 +1,36 @@ +import { zero } from "@streamplace/components"; +import MultistreamStatus from "components/live-dashboard/multistream-status"; +import Loading from "components/loading/loading"; +import { useEffect } from "react"; +import { View } from "react-native"; +import { useStore } from "store"; +import { useIsReady, useUserProfile } from "store/hooks"; + +const { flex } = zero; + +export default function PopoutMultistream() { + const isReady = useIsReady(); + const userProfile = useUserProfile(); + const openLoginModal = useStore((state) => state.openLoginModal); + const hideSidebar = useStore((x) => x.setSidebarHidden); + const showSidebar = useStore((x) => x.setSidebarUnhidden); + + useEffect(() => { + hideSidebar(); + return () => { + showSidebar(); + }; + }, [showSidebar]); + + if (!isReady) return ; + if (!userProfile) { + openLoginModal({ name: "PopoutMultistream" }); + return ; + } + + return ( + + + + ); +} diff --git a/js/app/src/screens/popout-stream-monitor.tsx b/js/app/src/screens/popout-stream-monitor.tsx new file mode 100644 index 000000000..39f8b409e --- /dev/null +++ b/js/app/src/screens/popout-stream-monitor.tsx @@ -0,0 +1,54 @@ +import { + LivestreamProvider, + PlayerProvider, + zero, +} from "@streamplace/components"; +import StreamMonitor from "components/live-dashboard/stream-monitor"; +import Loading from "components/loading/loading"; +import { useLiveUser } from "hooks/useLiveUser"; +import { useEffect } from "react"; +import { View } from "react-native"; +import { useStore } from "store"; +import { useIsReady, useUserProfile } from "store/hooks"; + +const { flex } = zero; + +function PopoutStreamMonitorInner() { + const isLive = useLiveUser(); + const profile = useUserProfile(); + const hideSidebar = useStore((x) => x.setSidebarHidden); + const showSidebar = useStore((x) => x.setSidebarUnhidden); + + useEffect(() => { + hideSidebar(); + return () => { + showSidebar(); + }; + }, [showSidebar]); + + return ( + + + + ); +} + +export default function PopoutStreamMonitor() { + const isReady = useIsReady(); + const userProfile = useUserProfile(); + const openLoginModal = useStore((state) => state.openLoginModal); + + if (!isReady) return ; + if (!userProfile) { + openLoginModal({ name: "PopoutStreamMonitor" }); + return ; + } + + return ( + + + + + + ); +} diff --git a/js/app/src/shell.tsx b/js/app/src/shell.tsx index 4768de4d7..48c9ba87f 100644 --- a/js/app/src/shell.tsx +++ b/js/app/src/shell.tsx @@ -60,6 +60,10 @@ import LiveDashboard from "src/screens/live-dashboard"; import MobileGoLive from "src/screens/mobile-go-live"; import MobileStream from "src/screens/mobile-stream"; import MultiScreen from "src/screens/multi"; +import PopoutInfoWidget from "src/screens/popout-info-widget"; +import PopoutLivestream from "src/screens/popout-livestream"; +import PopoutMultistream from "src/screens/popout-multistream"; +import PopoutStreamMonitor from "src/screens/popout-stream-monitor"; import SupportScreen from "src/screens/support"; import { useStore } from "store"; import { @@ -594,6 +598,26 @@ export default function Shell() { component={DanmuOBSScreen} options={{ headerShown: false }} /> + + + +