[PWI] Clean up logged out screen (#1978)

* Clean up logged out screen

* Better responsive styles
zio/stable
Eric Bailey 2023-11-22 16:53:25 -06:00 committed by GitHub
parent 95f8bd8ddb
commit ec819f06ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 98 additions and 80 deletions

View File

@ -1,5 +1,10 @@
import React from 'react' import React from 'react'
import {SafeAreaView} from 'react-native' import {View, Pressable} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {useLingui} from '@lingui/react'
import {msg} from '@lingui/macro'
import {isIOS} from 'platform/detection'
import {Login} from 'view/com/auth/login/Login' import {Login} from 'view/com/auth/login/Login'
import {CreateAccount} from 'view/com/auth/create/CreateAccount' import {CreateAccount} from 'view/com/auth/create/CreateAccount'
import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {ErrorBoundary} from 'view/com/util/ErrorBoundary'
@ -8,6 +13,7 @@ import {usePalette} from 'lib/hooks/usePalette'
import {useAnalytics} from 'lib/analytics/analytics' import {useAnalytics} from 'lib/analytics/analytics'
import {SplashScreen} from './SplashScreen' import {SplashScreen} from './SplashScreen'
import {useSetMinimalShellMode} from '#/state/shell/minimal-mode' import {useSetMinimalShellMode} from '#/state/shell/minimal-mode'
import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries'
enum ScreenState { enum ScreenState {
S_LoginOrCreateAccount, S_LoginOrCreateAccount,
@ -16,31 +22,65 @@ enum ScreenState {
} }
export function LoggedOut({onDismiss}: {onDismiss?: () => void}) { export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
const {_} = useLingui()
const pal = usePalette('default') const pal = usePalette('default')
const setMinimalShellMode = useSetMinimalShellMode() const setMinimalShellMode = useSetMinimalShellMode()
const {screen} = useAnalytics() const {screen} = useAnalytics()
const [screenState, setScreenState] = React.useState<ScreenState>( const [screenState, setScreenState] = React.useState<ScreenState>(
ScreenState.S_LoginOrCreateAccount, ScreenState.S_LoginOrCreateAccount,
) )
const {isMobile} = useWebMediaQueries()
React.useEffect(() => { React.useEffect(() => {
screen('Login') screen('Login')
setMinimalShellMode(true) setMinimalShellMode(true)
}, [screen, setMinimalShellMode]) }, [screen, setMinimalShellMode])
if (screenState === ScreenState.S_LoginOrCreateAccount) {
return (
<SplashScreen
onDismiss={onDismiss}
onPressSignin={() => setScreenState(ScreenState.S_Login)}
onPressCreateAccount={() => setScreenState(ScreenState.S_CreateAccount)}
/>
)
}
return ( return (
<SafeAreaView testID="noSessionView" style={[s.hContentRegion, pal.view]}> <View
testID="noSessionView"
style={[
s.hContentRegion,
pal.view,
{
// only needed if dismiss button is present
paddingTop: onDismiss && isMobile ? 40 : 0,
},
]}>
<ErrorBoundary> <ErrorBoundary>
{onDismiss && (
<Pressable
accessibilityHint={_(msg`Go back`)}
accessibilityLabel={_(msg`Go back`)}
accessibilityRole="button"
style={{
position: 'absolute',
top: isIOS ? 0 : 20,
right: 20,
padding: 10,
zIndex: 100,
backgroundColor: pal.text.color,
borderRadius: 100,
}}
onPress={onDismiss}>
<FontAwesomeIcon
icon="x"
size={12}
style={{
color: String(pal.textInverted.color),
}}
/>
</Pressable>
)}
{screenState === ScreenState.S_LoginOrCreateAccount ? (
<SplashScreen
onPressSignin={() => setScreenState(ScreenState.S_Login)}
onPressCreateAccount={() =>
setScreenState(ScreenState.S_CreateAccount)
}
/>
) : undefined}
{screenState === ScreenState.S_Login ? ( {screenState === ScreenState.S_Login ? (
<Login <Login
onPressBack={() => onPressBack={() =>
@ -56,6 +96,6 @@ export function LoggedOut({onDismiss}: {onDismiss?: () => void}) {
/> />
) : undefined} ) : undefined}
</ErrorBoundary> </ErrorBoundary>
</SafeAreaView> </View>
) )
} }

View File

@ -1,12 +1,5 @@
import React from 'react' import React from 'react'
import { import {StyleSheet, TouchableOpacity, View} from 'react-native'
SafeAreaView,
StyleSheet,
TouchableOpacity,
Pressable,
View,
} from 'react-native'
import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome'
import {Text} from 'view/com/util/text/Text' import {Text} from 'view/com/util/text/Text'
import {ErrorBoundary} from 'view/com/util/ErrorBoundary' import {ErrorBoundary} from 'view/com/util/ErrorBoundary'
import {s, colors} from 'lib/styles' import {s, colors} from 'lib/styles'
@ -16,11 +9,9 @@ import {Trans, msg} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
export const SplashScreen = ({ export const SplashScreen = ({
onDismiss,
onPressSignin, onPressSignin,
onPressCreateAccount, onPressCreateAccount,
}: { }: {
onDismiss?: () => void
onPressSignin: () => void onPressSignin: () => void
onPressCreateAccount: () => void onPressCreateAccount: () => void
}) => { }) => {
@ -29,63 +20,40 @@ export const SplashScreen = ({
return ( return (
<CenteredView style={[styles.container, pal.view]}> <CenteredView style={[styles.container, pal.view]}>
{onDismiss && ( <ErrorBoundary>
<Pressable <View style={styles.hero}>
accessibilityRole="button" <Text style={[styles.title, pal.link]}>
style={{ <Trans>Bluesky</Trans>
position: 'absolute', </Text>
top: 20, <Text style={[styles.subtitle, pal.textLight]}>
right: 20, <Trans>See what's next</Trans>
padding: 20, </Text>
zIndex: 100, </View>
}} <View testID="signinOrCreateAccount" style={styles.btns}>
onPress={onDismiss}> <TouchableOpacity
<FontAwesomeIcon testID="createAccountButton"
icon="x" style={[styles.btn, {backgroundColor: colors.blue3}]}
size={24} onPress={onPressCreateAccount}
style={{ accessibilityRole="button"
color: String(pal.text.color), accessibilityLabel={_(msg`Create new account`)}
}} accessibilityHint="Opens flow to create a new Bluesky account">
/> <Text style={[s.white, styles.btnLabel]}>
</Pressable> <Trans>Create a new account</Trans>
)}
<SafeAreaView testID="noSessionView" style={styles.container}>
<ErrorBoundary>
<View style={styles.hero}>
<Text style={[styles.title, pal.link]}>
<Trans>Bluesky</Trans>
</Text> </Text>
<Text style={[styles.subtitle, pal.textLight]}> </TouchableOpacity>
<Trans>See what's next</Trans> <TouchableOpacity
testID="signInButton"
style={[styles.btn, pal.btn]}
onPress={onPressSignin}
accessibilityRole="button"
accessibilityLabel={_(msg`Sign in`)}
accessibilityHint="Opens flow to sign into your existing Bluesky account">
<Text style={[pal.text, styles.btnLabel]}>
<Trans>Sign In</Trans>
</Text> </Text>
</View> </TouchableOpacity>
<View testID="signinOrCreateAccount" style={styles.btns}> </View>
<TouchableOpacity </ErrorBoundary>
testID="createAccountButton"
style={[styles.btn, {backgroundColor: colors.blue3}]}
onPress={onPressCreateAccount}
accessibilityRole="button"
accessibilityLabel={_(msg`Create new account`)}
accessibilityHint="Opens flow to create a new Bluesky account">
<Text style={[s.white, styles.btnLabel]}>
<Trans>Create a new account</Trans>
</Text>
</TouchableOpacity>
<TouchableOpacity
testID="signInButton"
style={[styles.btn, pal.btn]}
onPress={onPressSignin}
accessibilityRole="button"
accessibilityLabel={_(msg`Sign in`)}
accessibilityHint="Opens flow to sign into your existing Bluesky account">
<Text style={[pal.text, styles.btnLabel]}>
<Trans>Sign In</Trans>
</Text>
</TouchableOpacity>
</View>
</ErrorBoundary>
</SafeAreaView>
</CenteredView> </CenteredView>
) )
} }

View File

@ -1 +1,6 @@
export {SearchScreenMobile as SearchScreen} from '#/view/screens/Search/Search' import {withAuthRequired} from '#/view/com/auth/withAuthRequired'
import {SearchScreenMobile} from '#/view/screens/Search/Search'
export const SearchScreen = withAuthRequired(SearchScreenMobile, {
isPublic: true,
})

View File

@ -1 +1,6 @@
export {SearchScreenDesktop as SearchScreen} from '#/view/screens/Search/Search' import {withAuthRequired} from '#/view/com/auth/withAuthRequired'
import {SearchScreenDesktop} from '#/view/screens/Search/Search'
export const SearchScreen = withAuthRequired(SearchScreenDesktop, {
isPublic: true,
})