Add soft reset to chat list (#7771)

* add soft reset to chat list

* refresh when soft resetting
This commit is contained in:
Samuel Newman
2025-02-25 10:27:11 -08:00
committed by GitHub
parent 595a894551
commit 3409a72548
2 changed files with 26 additions and 3 deletions
+26 -2
View File
@@ -1,9 +1,10 @@
import {useCallback, useEffect, useMemo, useState} from 'react' import {useCallback, useEffect, useMemo, useState} from 'react'
import {View} from 'react-native' import {View} from 'react-native'
import {useAnimatedRef} from 'react-native-reanimated'
import {ChatBskyConvoDefs} from '@atproto/api' import {ChatBskyConvoDefs} from '@atproto/api'
import {msg, Trans} from '@lingui/macro' import {msg, Trans} from '@lingui/macro'
import {useLingui} from '@lingui/react' import {useLingui} from '@lingui/react'
import {useFocusEffect} from '@react-navigation/native' import {useFocusEffect, useIsFocused} from '@react-navigation/native'
import {NativeStackScreenProps} from '@react-navigation/native-stack' import {NativeStackScreenProps} from '@react-navigation/native-stack'
import {useAppState} from '#/lib/hooks/useAppState' import {useAppState} from '#/lib/hooks/useAppState'
@@ -12,11 +13,12 @@ import {MessagesTabNavigatorParams} from '#/lib/routes/types'
import {cleanError} from '#/lib/strings/errors' import {cleanError} from '#/lib/strings/errors'
import {logger} from '#/logger' import {logger} from '#/logger'
import {isNative} from '#/platform/detection' import {isNative} from '#/platform/detection'
import {listenSoftReset} from '#/state/events'
import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const' import {MESSAGE_SCREEN_POLL_INTERVAL} from '#/state/messages/convo/const'
import {useMessagesEventBus} from '#/state/messages/events' import {useMessagesEventBus} from '#/state/messages/events'
import {useLeftConvos} from '#/state/queries/messages/leave-conversation' import {useLeftConvos} from '#/state/queries/messages/leave-conversation'
import {useListConvosQuery} from '#/state/queries/messages/list-conversations' import {useListConvosQuery} from '#/state/queries/messages/list-conversations'
import {List} from '#/view/com/util/List' import {List, ListRef} from '#/view/com/util/List'
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'
import {DialogControlProps, useDialogControl} from '#/components/Dialog' import {DialogControlProps, useDialogControl} from '#/components/Dialog'
@@ -48,6 +50,7 @@ export function MessagesScreen({navigation, route}: Props) {
const {_} = useLingui() const {_} = useLingui()
const t = useTheme() const t = useTheme()
const newChatControl = useDialogControl() const newChatControl = useDialogControl()
const scrollElRef: ListRef = useAnimatedRef()
const pushToConversation = route.params?.pushToConversation const pushToConversation = route.params?.pushToConversation
// Whenever we have `pushToConversation` set, it means we pressed a notification for a chat without being on // Whenever we have `pushToConversation` set, it means we pressed a notification for a chat without being on
@@ -134,6 +137,26 @@ export function MessagesScreen({navigation, route}: Props) {
[navigation], [navigation],
) )
const onSoftReset = useCallback(async () => {
scrollElRef.current?.scrollToOffset({
animated: isNative,
offset: 0,
})
try {
await refetch()
} catch (err) {
logger.error('Failed to refresh conversations', {message: err})
}
}, [scrollElRef, refetch])
const isScreenFocused = useIsFocused()
useEffect(() => {
if (!isScreenFocused) {
return
}
return listenSoftReset(onSoftReset)
}, [onSoftReset, isScreenFocused])
if (conversations.length < 1) { if (conversations.length < 1) {
return ( return (
<Layout.Screen> <Layout.Screen>
@@ -216,6 +239,7 @@ export function MessagesScreen({navigation, route}: Props) {
<Header newChatControl={newChatControl} /> <Header newChatControl={newChatControl} />
<NewChat onNewChat={onNewChat} control={newChatControl} /> <NewChat onNewChat={onNewChat} control={newChatControl} />
<List <List
ref={scrollElRef}
data={conversations} data={conversations}
renderItem={renderItem} renderItem={renderItem}
keyExtractor={keyExtractor} keyExtractor={keyExtractor}
@@ -175,7 +175,6 @@ export function NotificationFeed({
onEndReachedThreshold={2} onEndReachedThreshold={2}
onScrolledDownChange={onScrolledDownChange} onScrolledDownChange={onScrolledDownChange}
contentContainerStyle={s.contentContainer} contentContainerStyle={s.contentContainer}
// @ts-ignore our .web version only -prf
desktopFixedHeight desktopFixedHeight
initialNumToRender={initialNumToRender} initialNumToRender={initialNumToRender}
windowSize={11} windowSize={11}