[Layout] ChatList header (#6929)

* Replace ChatList header

* update chat settings as well

---------

Co-authored-by: Samuel Newman <mozzius@protonmail.com>
This commit is contained in:
Eric Bailey
2024-12-04 11:39:59 -06:00
committed by GitHub
parent 5db4af49d9
commit 3711f9353d
2 changed files with 91 additions and 130 deletions
+43 -88
View File
@@ -16,7 +16,6 @@ import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const'
import {useMessagesEventBus} from '#/state/messages/events' import {useMessagesEventBus} from '#/state/messages/events'
import {useListConvosQuery} from '#/state/queries/messages/list-converations' import {useListConvosQuery} from '#/state/queries/messages/list-converations'
import {List} from '#/view/com/util/List' import {List} from '#/view/com/util/List'
import {ViewHeader} from '#/view/com/util/ViewHeader'
import {CenteredView} from '#/view/com/util/Views' import {CenteredView} from '#/view/com/util/Views'
import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' import {atoms as a, useBreakpoints, useTheme, web} from '#/alf'
import {Button, ButtonIcon, ButtonText} from '#/components/Button' import {Button, ButtonIcon, ButtonText} from '#/components/Button'
@@ -81,21 +80,6 @@ export function MessagesScreen({navigation, route}: Props) {
}, [messagesBus, isActive]), }, [messagesBus, isActive]),
) )
const renderButton = useCallback(() => {
return (
<Link
to="/messages/settings"
label={_(msg`Chat settings`)}
size="small"
variant="ghost"
color="secondary"
shape="square"
style={[a.justify_center]}>
<SettingsSlider size="md" style={[t.atoms.text_contrast_medium]} />
</Link>
)
}, [_, t])
const initialNumToRender = useInitialNumToRender({minItemHeight: 80}) const initialNumToRender = useInitialNumToRender({minItemHeight: 80})
const [isPTRing, setIsPTRing] = useState(false) const [isPTRing, setIsPTRing] = useState(false)
@@ -144,27 +128,11 @@ export function MessagesScreen({navigation, route}: Props) {
[navigation], [navigation],
) )
const onNavigateToSettings = useCallback(() => {
navigation.navigate('MessagesSettings')
}, [navigation])
if (conversations.length < 1) { if (conversations.length < 1) {
return ( return (
<Layout.Screen> <Layout.Screen>
<CenteredView sideBorders={gtMobile} style={[a.h_full_vh]}> <CenteredView sideBorders={gtMobile} style={[a.h_full_vh]}>
{gtMobile ? ( <Header newChatControl={newChatControl} />
<DesktopHeader
newChatControl={newChatControl}
onNavigateToSettings={onNavigateToSettings}
/>
) : (
<ViewHeader
title={_(msg`Messages`)}
renderButton={renderButton}
showBorder
canGoBack={false}
/>
)}
{isLoading ? ( {isLoading ? (
<View style={[a.align_center, a.pt_3xl, web({paddingTop: '10vh'})]}> <View style={[a.align_center, a.pt_3xl, web({paddingTop: '10vh'})]}>
@@ -237,15 +205,9 @@ export function MessagesScreen({navigation, route}: Props) {
} }
return ( return (
<Layout.Screen testID="messagesScreen"> <Layout.Screen testID="messagesScreen" temp__enableWebBorders>
{!gtMobile && ( <Layout.Center>
<ViewHeader <Header newChatControl={newChatControl} />
title={_(msg`Messages`)}
renderButton={renderButton}
showBorder
canGoBack={false}
/>
)}
<NewChat onNewChat={onNewChat} control={newChatControl} /> <NewChat onNewChat={onNewChat} control={newChatControl} />
<List <List
data={conversations} data={conversations}
@@ -254,12 +216,6 @@ export function MessagesScreen({navigation, route}: Props) {
refreshing={isPTRing} refreshing={isPTRing}
onRefresh={onRefresh} onRefresh={onRefresh}
onEndReached={onEndReached} onEndReached={onEndReached}
ListHeaderComponent={
<DesktopHeader
newChatControl={newChatControl}
onNavigateToSettings={onNavigateToSettings}
/>
}
ListFooterComponent={ ListFooterComponent={
<ListFooter <ListFooter
isFetchingNextPage={isFetchingNextPage} isFetchingNextPage={isFetchingNextPage}
@@ -276,54 +232,42 @@ export function MessagesScreen({navigation, route}: Props) {
windowSize={11} windowSize={11}
// @ts-ignore our .web version only -sfn // @ts-ignore our .web version only -sfn
desktopFixedHeight desktopFixedHeight
sideBorders={false}
/> />
</Layout.Center>
</Layout.Screen> </Layout.Screen>
) )
} }
function DesktopHeader({ function Header({newChatControl}: {newChatControl: DialogControlProps}) {
newChatControl,
onNavigateToSettings,
}: {
newChatControl: DialogControlProps
onNavigateToSettings: () => void
}) {
const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
const {gtMobile, gtTablet} = useBreakpoints() const {gtMobile} = useBreakpoints()
if (!gtMobile) { const settingsLink = (
return null <Link
} to="/messages/settings"
label={_(msg`Chat settings`)}
return (
<View
style={[
t.atoms.bg,
a.flex_row,
a.align_center,
a.justify_between,
a.gap_lg,
a.px_lg,
a.pr_md,
a.py_sm,
a.border_b,
t.atoms.border_contrast_low,
]}>
<Text style={[a.text_2xl, a.font_bold]}>
<Trans>Messages</Trans>
</Text>
<View style={[a.flex_row, a.align_center, a.gap_sm]}>
<Button
label={_(msg`Message settings`)}
color="secondary"
size="small" size="small"
variant="ghost" variant="ghost"
color="secondary"
shape="square" shape="square"
onPress={onNavigateToSettings}> style={[a.justify_center]}>
<SettingsSlider size="md" style={[t.atoms.text_contrast_medium]} /> <ButtonIcon icon={SettingsSlider} size="md" />
</Button> </Link>
{gtTablet && ( )
return (
<Layout.Header.Outer>
{gtMobile ? (
<>
<Layout.Header.Content>
<Layout.Header.TitleText>
<Trans>Messages</Trans>
</Layout.Header.TitleText>
</Layout.Header.Content>
<View style={[a.flex_row, a.align_center, a.gap_sm]}>
{settingsLink}
<Button <Button
label={_(msg`New chat`)} label={_(msg`New chat`)}
color="primary" color="primary"
@@ -335,8 +279,19 @@ function DesktopHeader({
<Trans>New chat</Trans> <Trans>New chat</Trans>
</ButtonText> </ButtonText>
</Button> </Button>
</View>
</>
) : (
<>
<Layout.Header.MenuButton />
<Layout.Header.Content>
<Layout.Header.TitleText>
<Trans>Messages</Trans>
</Layout.Header.TitleText>
</Layout.Header.Content>
<Layout.Header.Slot>{settingsLink}</Layout.Header.Slot>
</>
)} )}
</View> </Layout.Header.Outer>
</View>
) )
} }
+11 -5
View File
@@ -10,8 +10,6 @@ import {useUpdateActorDeclaration} from '#/state/queries/messages/actor-declarat
import {useProfileQuery} from '#/state/queries/profile' import {useProfileQuery} from '#/state/queries/profile'
import {useSession} from '#/state/session' import {useSession} from '#/state/session'
import * as Toast from '#/view/com/util/Toast' import * as Toast from '#/view/com/util/Toast'
import {ViewHeader} from '#/view/com/util/ViewHeader'
import {ScrollView} from '#/view/com/util/Views'
import {atoms as a} from '#/alf' import {atoms as a} from '#/alf'
import {Admonition} from '#/components/Admonition' import {Admonition} from '#/components/Admonition'
import {Divider} from '#/components/Divider' import {Divider} from '#/components/Divider'
@@ -57,8 +55,16 @@ export function MessagesSettingsScreen({}: Props) {
return ( return (
<Layout.Screen testID="messagesSettingsScreen"> <Layout.Screen testID="messagesSettingsScreen">
<ScrollView stickyHeaderIndices={[0]}> <Layout.Header.Outer>
<ViewHeader title={_(msg`Chat Settings`)} showOnDesktop showBorder /> <Layout.Header.BackButton />
<Layout.Header.Content>
<Layout.Header.TitleText>
<Trans>Chat Settings</Trans>
</Layout.Header.TitleText>
</Layout.Header.Content>
<Layout.Header.Slot />
</Layout.Header.Outer>
<Layout.Content>
<View style={[a.p_lg, a.gap_md]}> <View style={[a.p_lg, a.gap_md]}>
<Text style={[a.text_lg, a.font_bold]}> <Text style={[a.text_lg, a.font_bold]}>
<Trans>Allow new messages from</Trans> <Trans>Allow new messages from</Trans>
@@ -142,7 +148,7 @@ export function MessagesSettingsScreen({}: Props) {
</> </>
)} )}
</View> </View>
</ScrollView> </Layout.Content>
</Layout.Screen> </Layout.Screen>
) )
} }