Live video on the AT Protocol
1import {
2 DarkTheme,
3 LinkingOptions,
4 NavigationContainer,
5} from "@react-navigation/native";
6import { StreamplaceProvider as ZustandStreamplaceProvider } from "@streamplace/components";
7import { ToastProvider, ToastViewport } from "@tamagui/toast";
8import { useFonts } from "expo-font";
9import BlueskyProvider from "features/bluesky/blueskyProvider";
10import { selectOAuthSession } from "features/bluesky/blueskySlice";
11import StreamplaceProvider from "features/streamplace/streamplaceProvider";
12import useStreamplaceNode from "hooks/useStreamplaceNode";
13import React from "react";
14import { Provider as ReduxProvider } from "react-redux";
15import { useAppSelector } from "store/hooks";
16import { store } from "store/store";
17import { PortalProvider, TamaguiProvider } from "tamagui";
18import config from "tamagui.config";
19import { CurrentToast } from "./CurrentToast";
20export default function Provider({
21 children,
22 linking,
23}: {
24 children: React.ReactNode;
25 linking: LinkingOptions<ReactNavigation.RootParamList>;
26}) {
27 return (
28 <TamaguiProvider config={config} defaultTheme={"dark"}>
29 <NavigationContainer theme={DarkTheme} linking={linking}>
30 <ReduxProvider store={store}>
31 <StreamplaceProvider>
32 <BlueskyProvider>
33 <NewStreamplaceProvider>
34 <PortalProvider>
35 <ToastProvider
36 swipeDirection="vertical"
37 duration={6000}
38 native={
39 [
40 /* uncomment the next line to do native toasts on mobile. NOTE: it'll require you making a dev build and won't work with Expo Go */
41 // 'mobile'
42 ]
43 }
44 >
45 <FontProvider>{children}</FontProvider>
46 <CurrentToast />
47 <ToastViewport name="default" top="$8" left={0} right={0} />
48 </ToastProvider>
49 </PortalProvider>
50 </NewStreamplaceProvider>
51 </BlueskyProvider>
52 </StreamplaceProvider>
53 </ReduxProvider>
54 </NavigationContainer>
55 </TamaguiProvider>
56 );
57}
58
59export const NewStreamplaceProvider = ({
60 children,
61}: {
62 children: React.ReactNode;
63}) => {
64 const { url } = useStreamplaceNode();
65 const oauthSession = useAppSelector(selectOAuthSession);
66 return (
67 <ZustandStreamplaceProvider
68 url={url}
69 oauthSession={oauthSession || undefined}
70 >
71 {children}
72 </ZustandStreamplaceProvider>
73 );
74};
75
76export const FontProvider = ({ children }: { children: React.ReactNode }) => {
77 const [fontLoaded, fontError] = useFonts({
78 "FiraCode-Light": require("../../assets/fonts/FiraCode-Light.ttf"),
79 "FiraCode-Medium": require("../../assets/fonts/FiraCode-Medium.ttf"),
80 "FiraCode-Bold": require("../../assets/fonts/FiraCode-Bold.ttf"),
81 "FiraSans-Medium": require("../../assets/fonts/FiraSans-Medium.ttf"),
82 });
83
84 if (!fontLoaded && !fontError) {
85 return null;
86 }
87
88 return <>{children}</>;
89};