diff options
author | Samuel Newman <mozzius@protonmail.com> | 2025-03-04 13:54:19 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-03-04 05:54:19 -0800 |
commit | c995eb2f2fa3e73dcc6943078c85cd6a68f5370b (patch) | |
tree | 2dfea8ae6e4d86a77a90c72663b22441ca407159 /src/components/dms | |
parent | 5c14f695660dcbf815a584d9d3bb037171dd0c14 (diff) | |
download | voidsky-c995eb2f2fa3e73dcc6943078c85cd6a68f5370b.tar.zst |
DMs inbox (#7778)
* improve error screen * add chat request prompt * mock up inbox * bigger button * use two-button layout * get inbox working somewhat * fix type errors * fetch both pages for badge * don't include read convos in preview * in-chat ui for non-accepted convos (part 1) * add chatstatusinfo * fix status info not disappearing * get chat status info working * change min item height * move files around * add updated sdk * improve badge behaviour * mock up mark all as read * update sdk to 0.14.4 * hide chat status info if initiating convo * fix unread count for deleted accounts * add toasts after rejection * add prompt to delete * adjust badge on desktop * requests -> chat requests * fix height flicker * add mark as read button to header * add mark all as read APIs * separate avatarstack into two components (#7845) * fix messages being hidden behind chatstatusinfo * show inbox preview on empty state * fix empty state again * Use new convo availability API (#7812) * [Inbox] Accept button on convo screen (#7795) * accept button on convo screen * fix types * fix type error * improve spacing * [DMs] Implement new log types (#7835) * optimise badge state * add read message log * add isLogAcceptConvo * mute/unmute convo logs * use setqueriesdata * always show label on button * optimistically update badge * change incorrect unread count change * Update src/screens/Messages/Inbox.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestButtons.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestButtons.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * Update src/screens/Messages/components/RequestListItem.tsx Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> * fix race condition with accepting convo * fix back button on web * filter left convos from badge * update atproto to fix CI * Add accept override external to convo (#7891) * Add accept override external to convo * rm log --------- Co-authored-by: Samuel Newman <mozzius@protonmail.com> --------- Co-authored-by: surfdude29 <149612116+surfdude29@users.noreply.github.com> Co-authored-by: Eric Bailey <git@esb.lol>
Diffstat (limited to 'src/components/dms')
-rw-r--r-- | src/components/dms/LeaveConvoPrompt.tsx | 6 | ||||
-rw-r--r-- | src/components/dms/MessageProfileButton.tsx | 45 | ||||
-rw-r--r-- | src/components/dms/MessagesListHeader.tsx | 6 | ||||
-rw-r--r-- | src/components/dms/ReportDialog.tsx | 25 |
4 files changed, 57 insertions, 25 deletions
diff --git a/src/components/dms/LeaveConvoPrompt.tsx b/src/components/dms/LeaveConvoPrompt.tsx index c99f8d063..57acd5ca7 100644 --- a/src/components/dms/LeaveConvoPrompt.tsx +++ b/src/components/dms/LeaveConvoPrompt.tsx @@ -13,10 +13,12 @@ export function LeaveConvoPrompt({ control, convoId, currentScreen, + hasMessages = true, }: { control: DialogOuterProps['control'] convoId: string currentScreen: 'list' | 'conversation' + hasMessages?: boolean }) { const {_} = useLingui() const navigation = useNavigation<NavigationProp>() @@ -39,7 +41,9 @@ export function LeaveConvoPrompt({ control={control} title={_(msg`Leave conversation`)} description={_( - msg`Are you sure you want to leave this conversation? Your messages will be deleted for you, but not for the other participant.`, + hasMessages + ? msg`Are you sure you want to leave this conversation? Your messages will be deleted for you, but not for the other participant.` + : msg`Are you sure you want to leave this conversation?`, )} confirmButtonCta={_(msg`Leave`)} confirmButtonColor="negative" diff --git a/src/components/dms/MessageProfileButton.tsx b/src/components/dms/MessageProfileButton.tsx index 5eac7f5c5..7f31f550c 100644 --- a/src/components/dms/MessageProfileButton.tsx +++ b/src/components/dms/MessageProfileButton.tsx @@ -8,13 +8,15 @@ import {useNavigation} from '@react-navigation/native' import {useEmail} from '#/lib/hooks/useEmail' import {NavigationProp} from '#/lib/routes/types' import {logEvent} from '#/lib/statsig/statsig' -import {useMaybeConvoForUser} from '#/state/queries/messages/get-convo-for-members' +import {useGetConvoAvailabilityQuery} from '#/state/queries/messages/get-convo-availability' +import {useGetConvoForMembers} from '#/state/queries/messages/get-convo-for-members' +import * as Toast from '#/view/com/util/Toast' import {atoms as a, useTheme} from '#/alf' import {Button, ButtonIcon} from '#/components/Button' +import {useDialogControl} from '#/components/Dialog' +import {VerifyEmailDialog} from '#/components/dialogs/VerifyEmailDialog' import {canBeMessaged} from '#/components/dms/util' import {Message_Stroke2_Corner0_Rounded as Message} from '#/components/icons/Message' -import {useDialogControl} from '../Dialog' -import {VerifyEmailDialog} from '../dialogs/VerifyEmailDialog' export function MessageProfileButton({ profile, @@ -27,10 +29,19 @@ export function MessageProfileButton({ const {needsEmailVerification} = useEmail() const verifyEmailControl = useDialogControl() - const {data: convo, isPending} = useMaybeConvoForUser(profile.did) + const {data: convoAvailability} = useGetConvoAvailabilityQuery(profile.did) + const {mutate: initiateConvo} = useGetConvoForMembers({ + onSuccess: ({convo}) => { + logEvent('chat:open', {logContext: 'ProfileHeader'}) + navigation.navigate('MessagesConversation', {conversation: convo.id}) + }, + onError: () => { + Toast.show(_(msg`Failed to create conversation`)) + }, + }) const onPress = React.useCallback(() => { - if (!convo?.id) { + if (!convoAvailability?.canChat) { return } @@ -39,15 +50,25 @@ export function MessageProfileButton({ return } - if (convo && !convo.lastMessage) { + if (convoAvailability.convo) { + logEvent('chat:open', {logContext: 'ProfileHeader'}) + navigation.navigate('MessagesConversation', { + conversation: convoAvailability.convo.id, + }) + } else { logEvent('chat:create', {logContext: 'ProfileHeader'}) + initiateConvo([profile.did]) } - logEvent('chat:open', {logContext: 'ProfileHeader'}) - - navigation.navigate('MessagesConversation', {conversation: convo.id}) - }, [needsEmailVerification, verifyEmailControl, convo, navigation]) + }, [ + needsEmailVerification, + verifyEmailControl, + navigation, + profile.did, + initiateConvo, + convoAvailability, + ]) - if (isPending) { + if (!convoAvailability) { // show pending state based on declaration if (canBeMessaged(profile)) { return ( @@ -69,7 +90,7 @@ export function MessageProfileButton({ } } - if (convo) { + if (convoAvailability.canChat) { return ( <> <Button diff --git a/src/components/dms/MessagesListHeader.tsx b/src/components/dms/MessagesListHeader.tsx index 7c35c30ba..8da8c015f 100644 --- a/src/components/dms/MessagesListHeader.tsx +++ b/src/components/dms/MessagesListHeader.tsx @@ -53,10 +53,10 @@ export let MessagesListHeader = ({ }, [moderation]) const onPressBack = useCallback(() => { - if (isWeb) { - navigation.replace('Messages', {}) - } else { + if (navigation.canGoBack()) { navigation.goBack() + } else { + navigation.navigate('Messages', {}) } }, [navigation]) diff --git a/src/components/dms/ReportDialog.tsx b/src/components/dms/ReportDialog.tsx index 71cca897a..c1ea854f9 100644 --- a/src/components/dms/ReportDialog.tsx +++ b/src/components/dms/ReportDialog.tsx @@ -311,6 +311,19 @@ function DoneStep({ }, }) + let btnText = _(msg`Done`) + let toastMsg: string | undefined + if (actions.includes('leave') && actions.includes('block')) { + btnText = _(msg`Block and Delete`) + toastMsg = _(msg`Conversation deleted`) + } else if (actions.includes('leave')) { + btnText = _(msg`Delete Conversation`) + toastMsg = _(msg`Conversation deleted`) + } else if (actions.includes('block')) { + btnText = _(msg`Block User`) + toastMsg = _(msg`User blocked`) + } + const onPressPrimaryAction = () => { control.close(() => { if (actions.includes('block')) { @@ -319,18 +332,12 @@ function DoneStep({ if (actions.includes('leave')) { leaveConvo() } + if (toastMsg) { + Toast.show(toastMsg, 'check') + } }) } - let btnText = _(msg`Done`) - if (actions.includes('leave') && actions.includes('block')) { - btnText = _(msg`Block and Delete`) - } else if (actions.includes('leave')) { - btnText = _(msg`Delete Conversation`) - } else if (actions.includes('block')) { - btnText = _(msg`Block User`) - } - return ( <View style={a.gap_2xl}> <View style={[a.justify_center, gtMobile ? a.gap_sm : a.gap_xs]}> |