Replace layout components in settings screens
This commit is contained in:
@@ -1,100 +0,0 @@
|
|||||||
import React, {useContext, useMemo} from 'react'
|
|
||||||
import {View, ViewStyle} from 'react-native'
|
|
||||||
import {StyleProp} from 'react-native'
|
|
||||||
import {useSafeAreaInsets} from 'react-native-safe-area-context'
|
|
||||||
|
|
||||||
import {ViewHeader} from '#/view/com/util/ViewHeader'
|
|
||||||
import {ScrollView} from '#/view/com/util/Views'
|
|
||||||
import {CenteredView} from '#/view/com/util/Views'
|
|
||||||
import {atoms as a} from '#/alf'
|
|
||||||
|
|
||||||
// Every screen should have a Layout component wrapping it.
|
|
||||||
// This component provides a default padding for the top of the screen.
|
|
||||||
// This allows certain screens to avoid the top padding if they want to.
|
|
||||||
|
|
||||||
const LayoutContext = React.createContext({
|
|
||||||
withinScreen: false,
|
|
||||||
topPaddingDisabled: false,
|
|
||||||
withinScrollView: false,
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Every screen should have a Layout.Screen component wrapping it.
|
|
||||||
* This component provides a default padding for the top of the screen
|
|
||||||
* and height/minHeight
|
|
||||||
*/
|
|
||||||
let Screen = ({
|
|
||||||
disableTopPadding = false,
|
|
||||||
style,
|
|
||||||
...props
|
|
||||||
}: React.ComponentProps<typeof View> & {
|
|
||||||
disableTopPadding?: boolean
|
|
||||||
style?: StyleProp<ViewStyle>
|
|
||||||
}): React.ReactNode => {
|
|
||||||
const {top} = useSafeAreaInsets()
|
|
||||||
const context = useMemo(
|
|
||||||
() => ({
|
|
||||||
withinScreen: true,
|
|
||||||
topPaddingDisabled: disableTopPadding,
|
|
||||||
withinScrollView: false,
|
|
||||||
}),
|
|
||||||
[disableTopPadding],
|
|
||||||
)
|
|
||||||
return (
|
|
||||||
<LayoutContext.Provider value={context}>
|
|
||||||
<View
|
|
||||||
style={[
|
|
||||||
{paddingTop: disableTopPadding ? 0 : top},
|
|
||||||
a.util_screen_outer,
|
|
||||||
style,
|
|
||||||
]}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
</LayoutContext.Provider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Screen = React.memo(Screen)
|
|
||||||
export {Screen}
|
|
||||||
|
|
||||||
let Header = (
|
|
||||||
props: React.ComponentProps<typeof ViewHeader>,
|
|
||||||
): React.ReactNode => {
|
|
||||||
const {withinScrollView} = useContext(LayoutContext)
|
|
||||||
if (!withinScrollView) {
|
|
||||||
return (
|
|
||||||
<CenteredView topBorder={false} sideBorders>
|
|
||||||
<ViewHeader showOnDesktop showBorder {...props} />
|
|
||||||
</CenteredView>
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
return <ViewHeader showOnDesktop showBorder {...props} />
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Header = React.memo(Header)
|
|
||||||
export {Header}
|
|
||||||
|
|
||||||
let Content = ({
|
|
||||||
style,
|
|
||||||
contentContainerStyle,
|
|
||||||
...props
|
|
||||||
}: React.ComponentProps<typeof ScrollView> & {
|
|
||||||
style?: StyleProp<ViewStyle>
|
|
||||||
contentContainerStyle?: StyleProp<ViewStyle>
|
|
||||||
}): React.ReactNode => {
|
|
||||||
const context = useContext(LayoutContext)
|
|
||||||
const newContext = useMemo(
|
|
||||||
() => ({...context, withinScrollView: true}),
|
|
||||||
[context],
|
|
||||||
)
|
|
||||||
return (
|
|
||||||
<LayoutContext.Provider value={newContext}>
|
|
||||||
<ScrollView
|
|
||||||
style={[a.flex_1, style]}
|
|
||||||
contentContainerStyle={[{paddingBottom: 100}, contentContainerStyle]}
|
|
||||||
{...props}
|
|
||||||
/>
|
|
||||||
</LayoutContext.Provider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Content = React.memo(Content)
|
|
||||||
export {Content}
|
|
||||||
@@ -21,8 +21,15 @@ export function AboutSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`About`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>About</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.LinkItem
|
<SettingsList.LinkItem
|
||||||
to="https://bsky.social/about/support/tos"
|
to="https://bsky.social/about/support/tos"
|
||||||
|
|||||||
@@ -39,8 +39,15 @@ export function AccessibilitySettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Accessibility`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Accessibility</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Group contentContainerStyle={[a.gap_sm]}>
|
<SettingsList.Group contentContainerStyle={[a.gap_sm]}>
|
||||||
<SettingsList.ItemIcon icon={AccessibilityIcon} />
|
<SettingsList.ItemIcon icon={AccessibilityIcon} />
|
||||||
|
|||||||
@@ -38,8 +38,16 @@ export function AccountSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Account`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Account</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
|
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Item>
|
<SettingsList.Item>
|
||||||
<SettingsList.ItemIcon icon={EnvelopeIcon} />
|
<SettingsList.ItemIcon icon={EnvelopeIcon} />
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import {Alert, View} from 'react-native'
|
import {Alert, View} from 'react-native'
|
||||||
import {Image} from 'expo-image'
|
import {Image} from 'expo-image'
|
||||||
import {msg} from '@lingui/macro'
|
import {msg, Trans} from '@lingui/macro'
|
||||||
import {useLingui} from '@lingui/react'
|
import {useLingui} from '@lingui/react'
|
||||||
import * as AppIcon from '@mozzius/expo-dynamic-app-icon'
|
import * as AppIcon from '@mozzius/expo-dynamic-app-icon'
|
||||||
import {NativeStackScreenProps} from '@react-navigation/native-stack'
|
import {NativeStackScreenProps} from '@react-navigation/native-stack'
|
||||||
@@ -20,9 +20,16 @@ export function AppIconSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_('App Icon')} />
|
|
||||||
<Layout.Content
|
<Layout.Content
|
||||||
contentContainerStyle={[a.py_2xl, a.px_xl, {paddingBottom: 100}]}>
|
contentContainerStyle={[a.py_2xl, a.px_xl, {paddingBottom: 100}]}>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>App Icon</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<Text style={[a.text_lg, a.font_heavy]}>Defaults</Text>
|
<Text style={[a.text_lg, a.font_heavy]}>Defaults</Text>
|
||||||
<View style={[a.flex_row, a.flex_wrap]}>
|
<View style={[a.flex_row, a.flex_wrap]}>
|
||||||
{sets.defaults.map(icon => (
|
{sets.defaults.map(icon => (
|
||||||
|
|||||||
@@ -44,8 +44,15 @@ export function AppPasswordsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen testID="AppPasswordsScreen">
|
<Layout.Screen testID="AppPasswordsScreen">
|
||||||
<Layout.Header title={_(msg`App Passwords`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>App Passwords</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
{error ? (
|
{error ? (
|
||||||
<ErrorScreen
|
<ErrorScreen
|
||||||
title={_(msg`Oops!`)}
|
title={_(msg`Oops!`)}
|
||||||
|
|||||||
@@ -79,8 +79,15 @@ export function AppearanceSettingsScreen({}: Props) {
|
|||||||
return (
|
return (
|
||||||
<LayoutAnimationConfig skipExiting skipEntering>
|
<LayoutAnimationConfig skipExiting skipEntering>
|
||||||
<Layout.Screen testID="preferencesThreadsScreen">
|
<Layout.Screen testID="preferencesThreadsScreen">
|
||||||
<Layout.Header title={_(msg`Appearance`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Appearance</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<AppearanceToggleButtonGroup
|
<AppearanceToggleButtonGroup
|
||||||
title={_(msg`Color mode`)}
|
title={_(msg`Color mode`)}
|
||||||
|
|||||||
@@ -32,8 +32,15 @@ export function ContentAndMediaSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Content and Media`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Content & Media</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.LinkItem
|
<SettingsList.LinkItem
|
||||||
to="/settings/saved-feeds"
|
to="/settings/saved-feeds"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import {Fragment} from 'react'
|
import {Fragment} from 'react'
|
||||||
import {View} from 'react-native'
|
import {View} from 'react-native'
|
||||||
import {msg, Trans} from '@lingui/macro'
|
import {Trans} from '@lingui/macro'
|
||||||
import {useLingui} from '@lingui/react'
|
|
||||||
|
|
||||||
import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types'
|
import {CommonNavigatorParams, NativeStackScreenProps} from '#/lib/routes/types'
|
||||||
import {
|
import {
|
||||||
@@ -23,11 +22,17 @@ type Props = NativeStackScreenProps<
|
|||||||
'PreferencesExternalEmbeds'
|
'PreferencesExternalEmbeds'
|
||||||
>
|
>
|
||||||
export function ExternalMediaPreferencesScreen({}: Props) {
|
export function ExternalMediaPreferencesScreen({}: Props) {
|
||||||
const {_} = useLingui()
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen testID="externalMediaPreferencesScreen">
|
<Layout.Screen testID="externalMediaPreferencesScreen">
|
||||||
<Layout.Header title={_(msg`External Media Preferences`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>External Media Preferences</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Item>
|
<SettingsList.Item>
|
||||||
<Admonition type="info" style={[a.flex_1]}>
|
<Admonition type="info" style={[a.flex_1]}>
|
||||||
|
|||||||
@@ -46,8 +46,15 @@ export function FollowingFeedPreferencesScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen testID="followingFeedPreferencesScreen">
|
<Layout.Screen testID="followingFeedPreferencesScreen">
|
||||||
<Layout.Header title={_(msg`Following Feed Preferences`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Following Feed Preferences</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Item>
|
<SettingsList.Item>
|
||||||
<Admonition type="tip" style={[a.flex_1]}>
|
<Admonition type="tip" style={[a.flex_1]}>
|
||||||
|
|||||||
@@ -64,8 +64,15 @@ export function LanguageSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen testID="PreferencesLanguagesScreen">
|
<Layout.Screen testID="PreferencesLanguagesScreen">
|
||||||
<Layout.Header title={_(msg`Languages`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Languages</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Group iconInset={false}>
|
<SettingsList.Group iconInset={false}>
|
||||||
<SettingsList.ItemText>
|
<SettingsList.ItemText>
|
||||||
|
|||||||
@@ -33,8 +33,15 @@ export function NotificationSettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Notification Settings`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Notification Settings</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
{isQueryError ? (
|
{isQueryError ? (
|
||||||
<Error
|
<Error
|
||||||
title={_(msg`Oops!`)}
|
title={_(msg`Oops!`)}
|
||||||
|
|||||||
@@ -29,8 +29,15 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Privacy and Security`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Privacy and Security</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Item>
|
<SettingsList.Item>
|
||||||
<SettingsList.ItemIcon
|
<SettingsList.ItemIcon
|
||||||
|
|||||||
@@ -73,8 +73,16 @@ export function SettingsScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen>
|
<Layout.Screen>
|
||||||
<Layout.Header title={_(msg`Settings`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Settings</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
</Layout.Header.Outer>
|
||||||
|
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<View
|
<View
|
||||||
style={[
|
style={[
|
||||||
|
|||||||
@@ -38,8 +38,17 @@ export function ThreadPreferencesScreen({}: Props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Layout.Screen testID="threadPreferencesScreen">
|
<Layout.Screen testID="threadPreferencesScreen">
|
||||||
<Layout.Header title={_(msg`Thread Preferences`)} />
|
|
||||||
<Layout.Content>
|
<Layout.Content>
|
||||||
|
<Layout.Header.Outer>
|
||||||
|
<Layout.Header.BackButton />
|
||||||
|
<Layout.Header.Content>
|
||||||
|
<Layout.Header.TitleText>
|
||||||
|
<Trans>Thread Preferences</Trans>
|
||||||
|
</Layout.Header.TitleText>
|
||||||
|
</Layout.Header.Content>
|
||||||
|
<Layout.Header.Slot />
|
||||||
|
</Layout.Header.Outer>
|
||||||
|
|
||||||
<SettingsList.Container>
|
<SettingsList.Container>
|
||||||
<SettingsList.Group>
|
<SettingsList.Group>
|
||||||
<SettingsList.ItemIcon icon={BubblesIcon} />
|
<SettingsList.ItemIcon icon={BubblesIcon} />
|
||||||
|
|||||||
Reference in New Issue
Block a user