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 {useSetMinimalShellMode} 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 const setMinimalShellMode = useSetMinimalShellMode()
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 void queryClient.prefetchQuery({
61 queryKey: profilesQueryKey(actors),
62 staleTime: STALE.MINUTES.FIVE,
63 queryFn: async () => {
64 const res = await agent.getProfiles({actors})
65 return res.data
66 },
67 })
68 }, [accounts, agent, queryClient])
69
70 useEffect(() => {
71 setMinimalShellMode(true)
72 }, [setMinimalShellMode])
73
74 const onPressDismiss = useCallback(() => {
75 if (onDismiss) {
76 onDismiss()
77 }
78 clearRequestedAccount()
79 }, [clearRequestedAccount, onDismiss])
80
81 return (
82 <View
83 testID="noSessionView"
84 style={[
85 a.util_screen_outer,
86 t.atoms.bg,
87 {paddingTop: insets.top, paddingBottom: insets.bottom},
88 ]}>
89 <ErrorBoundary>
90 {onDismiss && screenState === ScreenState.S_LoginOrCreateAccount ? (
91 <Button
92 label={_(msg`Go back`)}
93 variant="solid"
94 color="secondary_inverted"
95 size="small"
96 shape="round"
97 PressableComponent={native(PressableScale)}
98 style={[
99 a.absolute,
100 {
101 top: insets.top + tokens.space.xl,
102 right: tokens.space.xl,
103 zIndex: 100,
104 },
105 ]}
106 onPress={onPressDismiss}>
107 <ButtonIcon icon={XIcon} />
108 </Button>
109 ) : null}
110
111 {screenState === ScreenState.S_StarterPack ? (
112 <LandingScreen setScreenState={setScreenState} />
113 ) : screenState === ScreenState.S_LoginOrCreateAccount ? (
114 <SplashScreen
115 onPressSignin={() => {
116 setScreenState(ScreenState.S_Login)
117 ax.metric('splash:signInPressed', {})
118 }}
119 onPressCreateAccount={() => {
120 setScreenState(ScreenState.S_CreateAccount)
121 ax.metric('splash:createAccountPressed', {})
122 }}
123 />
124 ) : undefined}
125 {screenState === ScreenState.S_Login ? (
126 <Login
127 onPressBack={() => {
128 setScreenState(ScreenState.S_LoginOrCreateAccount)
129 clearRequestedAccount()
130 }}
131 />
132 ) : undefined}
133 {screenState === ScreenState.S_CreateAccount ? (
134 <Signup
135 onPressBack={() =>
136 setScreenState(ScreenState.S_LoginOrCreateAccount)
137 }
138 onPressSignIn={() => {
139 setScreenState(ScreenState.S_Login)
140 logEvent('splash:signInPressed', {})
141 }}
142 />
143 ) : undefined}
144 </ErrorBoundary>
145 </View>
146 )
147}