Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
119
fork

Configure Feed

Select the types of activity you want to include in your feed.

at a876aae44ea07494ebea9727350aa060b81f317b 148 lines 4.9 kB view raw
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 ax.metric('splash:signInPressed', {}) 142 }} 143 /> 144 ) : undefined} 145 </ErrorBoundary> 146 </View> 147 ) 148}