Skip to content

Commit 6ca5f78

Browse files
committed
many fixes and refactor
1 parent b4c84c8 commit 6ca5f78

28 files changed

+331
-413
lines changed

features/consent/use-dm-consent.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@ import {
1616
import { updateConsentForGroupsForAccount } from "./update-consent-for-groups-for-account";
1717
import { updateInboxIdsConsentForAccount } from "./update-inbox-ids-consent-for-account";
1818

19-
export function useDmConsent(args: {
20-
peerInboxId: InboxId;
21-
conversationId: ConversationId;
22-
topic: ConversationTopic;
23-
}) {
24-
const { peerInboxId, conversationId, topic } = args;
25-
19+
export function useDmConsent() {
2620
const currentAccount = useCurrentAccount()!;
2721

2822
return useMutation({
29-
mutationFn: async (args: { consent: "allow" | "deny" }) => {
23+
mutationFn: async (args: {
24+
consent: "allow" | "deny";
25+
peerInboxId: InboxId;
26+
conversationId: ConversationId;
27+
topic: ConversationTopic;
28+
}) => {
29+
const { peerInboxId, conversationId, topic } = args;
3030
if (!peerInboxId) {
3131
throw new Error("Peer inbox id not found");
3232
}
@@ -45,6 +45,7 @@ export function useDmConsent(args: {
4545
]);
4646
},
4747
onMutate: (args) => {
48+
const { peerInboxId, conversationId, topic } = args;
4849
const conversation = getConversationQueryData({
4950
account: currentAccount,
5051
topic,
@@ -70,7 +71,8 @@ export function useDmConsent(args: {
7071
return { previousDmConsent: conversation.state };
7172
}
7273
},
73-
onError: (error, _, context) => {
74+
onError: (error, variables, context) => {
75+
const { topic } = variables;
7476
const { previousDmConsent } = context || {};
7577
if (previousDmConsent) {
7678
const dm = getDmQueryData({

features/conversation-list/conversation-list-awaiting-requests.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const ConversationListAwaitingRequests = memo(
2828
const conversationsMetadataQueries = useQueries({
2929
queries: (likelyNotSpam ?? []).map((conversation) =>
3030
getConversationMetadataQueryOptions({
31-
account: currentAccount!,
31+
account: currentAccount,
3232
topic: conversation.topic,
3333
})
3434
),

features/conversation-list/conversation-list-item/conversation-list-item-dm.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ export const ConversationListItemDm = memo(function ConversationListItemDm({
4444
topic: conversationTopic,
4545
});
4646

47-
const deleteDm = useDeleteDm(conversation as DmWithCodecsType);
47+
const deleteDm = useDeleteDm({
48+
topic: conversationTopic,
49+
});
4850
const { restoreConversationAsync } = useRestoreConversation({
4951
topic: conversationTopic,
5052
});

features/conversation-list/conversation-list-pinned-conversations/conversation-list-pinned-conversations.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useCurrentAccount } from "@/data/store/accountsStore";
12
import { AnimatedCenter } from "@/design-system/Center";
23
import { AnimatedHStack } from "@/design-system/HStack";
34
import { AnimatedVStack } from "@/design-system/VStack";
@@ -8,14 +9,14 @@ import { useConversationListPinnedConversationsStyles } from "@/features/convers
89
import { useConversationsCount } from "@/features/conversation-list/hooks/use-conversations-count";
910
import { usePinnedConversations } from "@/features/conversation-list/hooks/use-pinned-conversations";
1011
import { isConversationGroup } from "@/features/conversation/utils/is-conversation-group";
12+
import { useConversationQuery } from "@/queries/useConversationQuery";
1113
import { ThemedStyle, useAppTheme } from "@/theme/useAppTheme";
1214
import { captureError } from "@/utils/capture-error";
1315
import { hexToRGBA } from "@/utils/colors";
1416
import { chunk } from "@/utils/general";
1517
import { ConversationTopic } from "@xmtp/react-native-sdk";
1618
import { memo } from "react";
1719
import { ViewStyle } from "react-native";
18-
import { useConversationByTopic } from "../hooks/use-conversation-by-topic";
1920

2021
export const ConversationListPinnedConversations = memo(
2122
function ConversationListPinnedConversations() {
@@ -84,7 +85,9 @@ const PinnedConversationsSkeleton = memo(function () {
8485
const { avatarSize } = useConversationListPinnedConversationsStyles();
8586

8687
return (
87-
<AnimatedHStack style={themed($container)}>
88+
<AnimatedHStack
89+
style={[themed($container), { justifyContent: "space-between" }]}
90+
>
8891
<ConversationListItemAvatarSkeleton
8992
color={hexToRGBA("#FF8080", 0.15)}
9093
size={avatarSize}
@@ -105,7 +108,12 @@ const PinnedConversationWrapper = memo(
105108
function PinnedConversationWrapper(props: { topic: ConversationTopic }) {
106109
const { topic } = props;
107110

108-
const conversation = useConversationByTopic(topic);
111+
const currentAccount = useCurrentAccount();
112+
113+
const { data: conversation } = useConversationQuery({
114+
topic,
115+
account: currentAccount!,
116+
});
109117

110118
if (!conversation) {
111119
captureError(

features/conversation-list/conversation-list.screen.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ export function ConversationListScreen(props: IConversationListProps) {
5555
}
5656
}, [refetchConversations]);
5757

58-
console.log("conversations:", conversations);
59-
6058
return (
6159
<Screen contentContainerStyle={$globalStyles.flex1}>
6260
<AnimatedVStack layout={theme.animation.reanimatedLayoutSpringTransition}>

features/conversation-list/hooks/use-conversation-by-topic.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

features/conversation-list/hooks/use-conversation-list-item-context-menu-default-props.tsx

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
import { useCurrentAccount } from "@/data/store/accountsStore";
12
import { iconRegistry } from "@/design-system/Icon/Icon";
23
import { VStack } from "@/design-system/VStack";
3-
import { useConversationByTopic } from "@/features/conversation-list/hooks/use-conversation-by-topic";
44
import { useConversationIsPinned } from "@/features/conversation-list/hooks/use-conversation-is-pinned";
55
import { useConversationIsUnread } from "@/features/conversation-list/hooks/use-conversation-is-unread";
66
import { useDeleteDm } from "@/features/conversation-list/hooks/use-delete-dm";
77
import { useDeleteGroup } from "@/features/conversation-list/hooks/use-delete-group";
88
import { useToggleReadStatus } from "@/features/conversation-list/hooks/use-toggle-read-status";
9+
import { ConversationPreview } from "@/features/conversation/conversation-preview/conversation-preview";
910
import { isConversationGroup } from "@/features/conversation/utils/is-conversation-group";
1011
import { translate } from "@/i18n";
11-
import { ConversationPreview } from "@/features/conversation/conversation-preview/conversation-preview";
12+
import { useConversationQuery } from "@/queries/useConversationQuery";
1213
import { useAppTheme } from "@/theme/useAppTheme";
1314
import { captureErrorWithToast } from "@/utils/capture-error";
1415
import { Haptics } from "@/utils/haptics";
1516
import { ConversationTopic } from "@xmtp/react-native-sdk";
17+
import { useCallback } from "react";
1618
import {
1719
ContextMenuViewProps,
1820
MenuActionConfig,
@@ -138,18 +140,29 @@ function useConversationContextMenuDeleteItem(args: {
138140
conversationTopic: ConversationTopic;
139141
}): IUseContextMenuItem {
140142
const { conversationTopic } = args;
141-
143+
const currentAccount = useCurrentAccount();
142144
const { theme } = useAppTheme();
143145

144-
const conversation = useConversationByTopic(conversationTopic);
146+
const { data: conversation } = useConversationQuery({
147+
account: currentAccount!,
148+
topic: conversationTopic,
149+
});
150+
151+
const deleteGroup = useDeleteGroup({ groupTopic: conversationTopic });
152+
const deleteDm = useDeleteDm({ topic: conversationTopic });
145153

146-
const handleDeleteFn = conversation
147-
? isConversationGroup(conversation)
148-
? // eslint-disable-next-line react-hooks/rules-of-hooks
149-
useDeleteGroup({ groupTopic: conversationTopic })
150-
: // eslint-disable-next-line react-hooks/rules-of-hooks
151-
useDeleteDm(conversation)
152-
: () => null;
154+
const handleDelete = useCallback(async () => {
155+
if (!conversation) return;
156+
try {
157+
if (isConversationGroup(conversation)) {
158+
await deleteGroup();
159+
} else {
160+
await deleteDm();
161+
}
162+
} catch (error) {
163+
captureErrorWithToast(error);
164+
}
165+
}, [conversation, deleteGroup, deleteDm]);
153166

154167
return {
155168
actionKey: "delete",
@@ -160,6 +173,6 @@ function useConversationContextMenuDeleteItem(args: {
160173
iconTint: theme.colors.global.caution,
161174
},
162175
menuAttributes: ["destructive"],
163-
onPress: handleDeleteFn,
176+
onPress: handleDelete,
164177
} satisfies IUseContextMenuItem;
165178
}

features/conversation-list/hooks/use-delete-dm.ts

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,54 @@ import {
77
getConversationMetadataQueryData,
88
updateConversationMetadataQueryData,
99
} from "@/queries/conversation-metadata-query";
10+
import { getConversationQueryOptions } from "@/queries/useConversationQuery";
1011
import { useDmPeerInboxId } from "@/queries/useDmPeerInbox";
1112
import { actionSheetColors } from "@/styles/colors";
1213
import { useAppTheme } from "@/theme/useAppTheme";
1314
import { deleteTopic } from "@/utils/api/topics";
1415
import { captureErrorWithToast } from "@/utils/capture-error";
15-
import { DmWithCodecsType } from "@/utils/xmtpRN/client.types";
16-
import { useMutation } from "@tanstack/react-query";
16+
import { useMutation, useQuery } from "@tanstack/react-query";
17+
import { ConversationTopic } from "@xmtp/react-native-sdk";
1718
import { useCallback } from "react";
1819

19-
export const useDeleteDm = (dm: DmWithCodecsType) => {
20+
export const useDeleteDm = ({ topic }: { topic: ConversationTopic }) => {
2021
const { theme } = useAppTheme();
2122
const colorScheme = theme.isDark ? "dark" : "light";
2223

2324
const currentAccount = useCurrentAccount()!;
2425

26+
const { data: conversationId } = useQuery({
27+
...getConversationQueryOptions({
28+
account: currentAccount,
29+
topic,
30+
}),
31+
select: (conversation) => conversation?.id,
32+
});
33+
2534
const { data: peerInboxId } = useDmPeerInboxId({
2635
account: currentAccount,
27-
topic: dm.topic,
36+
topic,
2837
});
2938

30-
const { mutateAsync: updateDmConsentAsync } = useDmConsent({
31-
peerInboxId: peerInboxId!,
32-
conversationId: dm.id,
33-
topic: dm.topic,
34-
});
39+
const { mutateAsync: updateDmConsentAsync } = useDmConsent();
3540

3641
const preferredName = usePreferredInboxName(peerInboxId);
3742

3843
const { mutateAsync: deleteDmAsync } = useMutation({
3944
mutationFn: () =>
4045
deleteTopic({
4146
account: currentAccount,
42-
topic: dm.topic,
47+
topic,
4348
}),
4449
onMutate: () => {
4550
const previousIsDeleted = getConversationMetadataQueryData({
4651
account: currentAccount,
47-
topic: dm.topic,
52+
topic,
4853
})?.isDeleted;
4954

5055
updateConversationMetadataQueryData({
5156
account: currentAccount,
52-
topic: dm.topic,
57+
topic,
5358
updateData: { isDeleted: true },
5459
});
5560

@@ -58,7 +63,7 @@ export const useDeleteDm = (dm: DmWithCodecsType) => {
5863
onError: (error, _, context) => {
5964
updateConversationMetadataQueryData({
6065
account: currentAccount,
61-
topic: dm.topic,
66+
topic,
6267
updateData: { isDeleted: context?.previousIsDeleted },
6368
});
6469
},
@@ -67,6 +72,14 @@ export const useDeleteDm = (dm: DmWithCodecsType) => {
6772
return useCallback(() => {
6873
const title = `${translate("delete_chat_with")} ${preferredName}?`;
6974

75+
if (!conversationId) {
76+
throw new Error("Conversation not found in useDeleteDm");
77+
}
78+
79+
if (!peerInboxId) {
80+
throw new Error("Peer inbox id not found in useDeleteDm");
81+
}
82+
7083
const actions = [
7184
{
7285
label: translate("delete"),
@@ -85,6 +98,9 @@ export const useDeleteDm = (dm: DmWithCodecsType) => {
8598
await deleteDmAsync();
8699
await updateDmConsentAsync({
87100
consent: "deny",
101+
peerInboxId: peerInboxId,
102+
conversationId,
103+
topic,
88104
});
89105
} catch (error) {
90106
captureErrorWithToast(error);
@@ -111,5 +127,13 @@ export const useDeleteDm = (dm: DmWithCodecsType) => {
111127
}
112128
}
113129
);
114-
}, [colorScheme, preferredName, deleteDmAsync, updateDmConsentAsync]);
130+
}, [
131+
colorScheme,
132+
preferredName,
133+
deleteDmAsync,
134+
updateDmConsentAsync,
135+
peerInboxId,
136+
conversationId,
137+
topic,
138+
]);
115139
};

features/conversation-list/use-conversation-list-conversations.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,5 @@ export const useConversationListConversations = () => {
9292
*/
9393
}, [conversations, conversationsMetadataQueries]);
9494

95-
console.log(
96-
"filteredAndSortedConversations:",
97-
filteredAndSortedConversations
98-
);
99-
10095
return { data: filteredAndSortedConversations, refetch };
10196
};

features/conversation-requests-list/use-conversation-requests-list-items.tsx

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,31 @@ export function useConversationRequestsListItem() {
5757

5858
const isLoading =
5959
unkownConsentConversationsLoading || spamQueries.some((q) => q.isLoading);
60-
const spamResults = spamQueries.map((q, i) => ({
61-
conversation: unkownConsentConversations?.[i],
62-
isSpam: q.data ?? true,
63-
}));
60+
61+
const spamResults = spamQueries
62+
.map((q, i) => ({
63+
conversation: unkownConsentConversations?.[i],
64+
isSpam: q.data ?? true,
65+
}))
66+
.filter((r) => !!r.conversation);
6467

6568
return {
6669
likelyNotSpam:
67-
spamResults.filter((r) => !r.isSpam).map((r) => r.conversation) ?? [],
70+
spamResults
71+
.filter((r) => !r.isSpam)
72+
.map(
73+
(r) =>
74+
// ! because we do .filter above
75+
r.conversation!
76+
) ?? [],
6877
likelySpam:
69-
spamResults.filter((r) => r.isSpam).map((r) => r.conversation) ?? [],
78+
spamResults
79+
.filter((r) => r.isSpam)
80+
.map(
81+
(r) =>
82+
// ! because we do .filter above
83+
r.conversation!
84+
) ?? [],
7085
isLoading,
7186
};
7287
}

0 commit comments

Comments
 (0)