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