forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 💫
1import {useCallback, useEffect, useState} from 'react'
2import {View} from 'react-native'
3import {useSafeAreaInsets} from 'react-native-safe-area-context'
4import {msg} from '@lingui/core/macro'
5import {useLingui} from '@lingui/react'
6import {useQueryClient} from '@tanstack/react-query'
7
8import {PressableScale} from '#/lib/custom-animations/PressableScale'
9import {STALE} from '#/state/queries'
10import {profilesQueryKey} from '#/state/queries/profile'
11import {useAgent, useSession} from '#/state/session'
12import {
13 useLoggedOutView,
14 useLoggedOutViewControls,
15} from '#/state/shell/logged-out'
16import {useEnableMinimalShellMode} from '#/state/shell/minimal-mode'
17import {ErrorBoundary} from '#/view/com/util/ErrorBoundary'
18import {Login} from '#/screens/Login'
19import {Signup} from '#/screens/Signup'
20import {LandingScreen} from '#/screens/StarterPack/StarterPackLandingScreen'
21import {atoms as a, native, tokens, useTheme} from '#/alf'
22import {Button, ButtonIcon} from '#/components/Button'
23import {TimesLarge_Stroke2_Corner0_Rounded as XIcon} from '#/components/icons/Times'
24import {useAnalytics} from '#/analytics'
25import {SplashScreen} from './SplashScreen'
26
27enum ScreenState {
28 S_LoginOrCreateAccount,
29 S_Login,
30 S_CreateAccount,
31 S_StarterPack,
32}
33export {ScreenState as LoggedOutScreenState}
34
35export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
36 const {_} = useLingui()
37 const ax = useAnalytics()
38 const t = useTheme()
39 const insets = useSafeAreaInsets()
40 useEnableMinimalShellMode()
41 const {requestedAccountSwitchTo} = useLoggedOutView()
42 const [screenState, setScreenState] = useState<ScreenState>(() => {
43 if (requestedAccountSwitchTo === 'new') {
44 return ScreenState.S_CreateAccount
45 } else if (requestedAccountSwitchTo === 'starterpack') {
46 return ScreenState.S_StarterPack
47 } else if (requestedAccountSwitchTo != null) {
48 return ScreenState.S_Login
49 } else {
50 return ScreenState.S_LoginOrCreateAccount
51 }
52 })
53 const {clearRequestedAccount} = useLoggedOutViewControls()
54
55 const queryClient = useQueryClient()
56 const {accounts} = useSession()
57 const agent = useAgent()
58 useEffect(() => {
59 const actors = accounts.map(acc => acc.did)
60 if (actors.length === 0) return
61 void queryClient.prefetchQuery({
62 queryKey: profilesQueryKey(actors),
63 staleTime: STALE.MINUTES.FIVE,
64 queryFn: async () => {
65 const res = await agent.getProfiles({actors})
66 return res.data
67 },
68 })
69 }, [accounts, agent, queryClient])
70
71 const onPressDismiss = useCallback(() => {
72 if (onDismiss) {
73 onDismiss()
74 }
75 clearRequestedAccount()
76 }, [clearRequestedAccount, onDismiss])
77
78 return (
79 <View
80 testID="noSessionView"
81 style={[
82 a.util_screen_outer,
83 t.atoms.bg,
84 {paddingTop: insets.top, paddingBottom: insets.bottom},
85 ]}>
86 <ErrorBoundary>
87 {onDismiss && screenState === ScreenState.S_LoginOrCreateAccount ? (
88 <Button
89 label={_(msg`Go back`)}
90 variant="solid"
91 color="secondary_inverted"
92 size="small"
93 shape="round"
94 PressableComponent={native(PressableScale)}
95 style={[
96 a.absolute,
97 {
98 top: insets.top + tokens.space.xl,
99 right: tokens.space.xl,
100 zIndex: 100,
101 },
102 ]}
103 onPress={onPressDismiss}>
104 <ButtonIcon icon={XIcon} />
105 </Button>
106 ) : null}
107
108 {screenState === ScreenState.S_StarterPack ? (
109 <LandingScreen setScreenState={setScreenState} />
110 ) : screenState === ScreenState.S_LoginOrCreateAccount ? (
111 <SplashScreen
112 onPressSignin={() => {
113 setScreenState(ScreenState.S_Login)
114 ax.metric('splash:signInPressed', {})
115 }}
116 onPressCreateAccount={() => {
117 setScreenState(ScreenState.S_CreateAccount)
118 ax.metric('splash:createAccountPressed', {})
119 }}
120 />
121 ) : undefined}
122 {screenState === ScreenState.S_Login ? (
123 <Login
124 onPressBack={() => {
125 setScreenState(ScreenState.S_LoginOrCreateAccount)
126 clearRequestedAccount()
127 }}
128 />
129 ) : undefined}
130 {screenState === ScreenState.S_CreateAccount ? (
131 <Signup
132 onPressBack={() =>
133 setScreenState(ScreenState.S_LoginOrCreateAccount)
134 }
135 onPressSignIn={() => {
136 setScreenState(ScreenState.S_Login)
137 ax.metric('splash:signInPressed', {})
138 }}
139 />
140 ) : undefined}
141 </ErrorBoundary>
142 </View>
143 )
144}