Skip to content

Commit bf099f2

Browse files
authored
fix: 20 max conversations + many other fixes and cleaning (#1554)
1 parent e9567ae commit bf099f2

File tree

47 files changed

+497
-575
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+497
-575
lines changed

components/StateHandlers/HydrationStateHandler.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { prefetchConversationsQuery } from "@/queries/conversations-query";
1+
import { prefetchConversationsQuery } from "@/queries/use-conversations-query";
22
import { prefetchInboxIdQuery } from "@/queries/use-inbox-id-query";
33
import { captureError } from "@/utils/capture-error";
44
import { getAccountsList } from "@data/store/accountsStore";
@@ -28,7 +28,9 @@ export default function HydrationStateHandler() {
2828
for (const account of accounts) {
2929
// Don't await because this is for performance but not critical
3030
prefetchInboxIdQuery({ account }).catch(captureError);
31-
prefetchConversationsQuery({ account }).catch(captureError);
31+
prefetchConversationsQuery({
32+
account,
33+
}).catch(captureError);
3234
}
3335

3436
useAppStore.getState().setHydrationDone(true);

containers/GroupScreenConsentTable.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useGroupConsent } from "@/features/consent/use-group-consent";
1+
import { useGroupConsentForCurrentAccount } from "@/features/consent/use-group-consent-for-current-account";
22
import { translate } from "@i18n";
33
import { dangerColor, primaryColor } from "@styles/colors";
44
import { groupRemoveRestoreHandler } from "@utils/groupUtils/groupActionHandlers";
@@ -21,7 +21,8 @@ export const GroupScreenConsentTable: FC<GroupScreenConsentTableProps> = ({
2121
group,
2222
}) => {
2323
const colorScheme = useColorScheme();
24-
const { consent, allowGroup, blockGroup } = useGroupConsent(topic);
24+
const { consent, allowGroup, blockGroup } =
25+
useGroupConsentForCurrentAccount(topic);
2526

2627
const consentTableViewItems = useMemo(() => {
2728
const items: TableViewItemType[] = [];

features/GroupInvites/joinGroup/JoinGroup.client.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { IGroupConsentOptions } from "@/features/consent/use-group-consent";
1+
import { IGroupConsentOptions } from "@/features/consent/use-group-consent-for-current-account";
22
import {
33
createGroupJoinRequest,
44
getGroupJoinRequest,
@@ -24,7 +24,7 @@ import { AxiosInstance } from "axios";
2424

2525
import {} from "../groupInvites.utils";
2626
import { JoinGroupResult } from "./joinGroup.types";
27-
import { IConversationsQuery } from "@/queries/conversations-query";
27+
import { IConversationsQuery } from "@/queries/use-conversations-query";
2828
import { entify } from "@/queries/entify";
2929
import { wait } from "@/utils/general";
3030

@@ -94,11 +94,14 @@ export class JoinGroupClient {
9494
account: string
9595
): Promise<ConversationDataEntity> => {
9696
const { fetchConversationsQuery } = await import(
97-
"@/queries/conversations-query"
97+
"@/queries/use-conversations-query"
9898
);
9999

100100
const conversationList: IConversationsQuery =
101-
await fetchConversationsQuery({ account });
101+
await fetchConversationsQuery({
102+
account,
103+
caller: "liveFetchGroupsByAccount",
104+
});
102105

103106
const conversationEntity: ConversationDataEntity = entify(
104107
conversationList,

features/blocked-conversations/use-blocked-conversations-for-current-account.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { isConversationDenied } from "@/features/conversation/utils/is-conversation-denied";
22
import { getConversationMetadataQueryOptions } from "@/queries/conversation-metadata-query";
3-
import { useConversationsQuery } from "@/queries/conversations-query";
3+
import { useConversationsQuery } from "@/queries/use-conversations-query";
44
import { useCurrentAccount } from "@data/store/accountsStore";
55
import { useQueries } from "@tanstack/react-query";
66
import { useMemo } from "react";
@@ -10,6 +10,7 @@ export const useBlockedConversationsForCurrentAccount = () => {
1010

1111
const { data } = useConversationsQuery({
1212
account: currentAccount!,
13+
caller: "useBlockedConversationsForCurrentAccount",
1314
});
1415

1516
const conversationsMetadataQueries = useQueries({

features/consent/use-allow-group.mutation.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { updateConversationInConversationsQueryData } from "@/queries/conversations-query";
1+
import { updateConversationInConversationsQueryData } from "@/queries/use-conversations-query";
22
import { captureError } from "@/utils/capture-error";
33
import { GroupWithCodecsType } from "@/utils/xmtpRN/client.types";
44
import { queryClient } from "@queries/queryClient";
@@ -8,15 +8,15 @@ import {
88
useMutation,
99
} from "@tanstack/react-query";
1010
import { getV3IdFromTopic } from "@utils/groupUtils/groupId";
11-
import { updateInboxIdsConsentForAccount } from "./update-inbox-ids-consent-for-account";
12-
import { updateConsentForGroupsForAccount } from "./update-consent-for-groups-for-account";
1311
import {
1412
ConsentState,
1513
ConversationId,
1614
ConversationTopic,
1715
InboxId,
1816
} from "@xmtp/react-native-sdk";
1917
import { MutationKeys } from "../../queries/MutationKeys";
18+
import { updateConsentForGroupsForAccount } from "./update-consent-for-groups-for-account";
19+
import { updateInboxIdsConsentForAccount } from "./update-inbox-ids-consent-for-account";
2020
import {
2121
getGroupConsentQueryData,
2222
setGroupConsentQueryData,

features/consent/use-dm-consent.tsx renamed to features/consent/use-dm-consent-for-current-account.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {
22
getCurrentAccount,
33
useCurrentAccount,
44
} from "@/data/store/accountsStore";
5-
import { updateConversationInConversationsQueryData } from "@/queries/conversations-query";
5+
import { updateConversationInConversationsQueryData } from "@/queries/use-conversations-query";
66
import { getConversationQueryData } from "@/queries/useConversationQuery";
77
import { getDmQueryData, setDmQueryData } from "@/queries/useDmQuery";
88
import { updateObjectAndMethods } from "@/utils/update-object-and-methods";
@@ -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 useDmConsentForCurrentAccount() {
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/consent/use-group-consent.ts renamed to features/consent/use-group-consent-for-current-account.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export type IGroupConsentOptions = {
1515
includeAddedBy?: boolean;
1616
};
1717

18-
export const useGroupConsent = (topic: ConversationTopic) => {
18+
export const useGroupConsentForCurrentAccount = (topic: ConversationTopic) => {
1919
const account = currentAccount();
2020

2121
const { data: group, isLoading: isGroupLoading } = useGroupQuery({

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: 10 additions & 2 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() {
@@ -43,6 +44,7 @@ export const ConversationListPinnedConversations = memo(
4344
if (!hasPinnedConversations) {
4445
return null;
4546
}
47+
4648
return (
4749
<AnimatedVStack
4850
style={themed($container)}
@@ -105,7 +107,12 @@ const PinnedConversationWrapper = memo(
105107
function PinnedConversationWrapper(props: { topic: ConversationTopic }) {
106108
const { topic } = props;
107109

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

110117
if (!conversation) {
111118
captureError(
@@ -127,6 +134,7 @@ const $container: ThemedStyle<ViewStyle> = ({ spacing }) => ({
127134
paddingVertical: spacing.xs,
128135
paddingHorizontal: spacing.lg,
129136
rowGap: spacing.lg,
137+
justifyContent: "space-between",
130138
});
131139

132140
const $pinnedRow: ThemedStyle<ViewStyle> = ({ spacing }) => ({

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { usePreferredName } from "@/hooks/usePreferredName";
1818
import { translate } from "@/i18n";
1919
import { useHeader } from "@/navigation/use-header";
2020
import { ThemedStyle, useAppTheme } from "@/theme/useAppTheme";
21+
import { converseEventEmitter } from "@/utils/events";
2122
import { shortDisplayName } from "@/utils/str";
2223
import { useAccountsProfiles } from "@/utils/useAccountsProfiles";
2324
import { useNavigation } from "@react-navigation/native";
@@ -131,6 +132,10 @@ function ProfileAvatar() {
131132
const preferredName = usePreferredInboxName(currentAccountInboxId);
132133
const avatarUri = usePreferredInboxAvatar(currentAccountInboxId);
133134

135+
const showDebugMenu = useCallback(() => {
136+
converseEventEmitter.emit("showDebugMenu");
137+
}, []);
138+
134139
return (
135140
<Pressable
136141
onPress={() => {
@@ -139,6 +144,7 @@ function ProfileAvatar() {
139144
});
140145
}}
141146
hitSlop={theme.spacing.sm}
147+
onLongPress={showDebugMenu}
142148
>
143149
<Center style={themed($avatarContainer)}>
144150
<Avatar

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: 29 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,33 @@ 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+
});
145150

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;
151+
const deleteGroup = useDeleteGroup({ groupTopic: conversationTopic });
152+
const deleteDm = useDeleteDm({ topic: conversationTopic });
153+
154+
const handleDelete = useCallback(async () => {
155+
try {
156+
if (!conversation) {
157+
throw new Error("Conversation not found");
158+
}
159+
if (isConversationGroup(conversation)) {
160+
await deleteGroup();
161+
} else {
162+
await deleteDm();
163+
}
164+
} catch (error) {
165+
captureErrorWithToast(error, {
166+
message: "Error deleting conversation",
167+
});
168+
}
169+
}, [conversation, deleteGroup, deleteDm]);
153170

154171
return {
155172
actionKey: "delete",
@@ -160,6 +177,6 @@ function useConversationContextMenuDeleteItem(args: {
160177
iconTint: theme.colors.global.caution,
161178
},
162179
menuAttributes: ["destructive"],
163-
onPress: handleDeleteFn,
180+
onPress: handleDelete,
164181
} satisfies IUseContextMenuItem;
165182
}

features/conversation-list/hooks/use-conversations-count.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getConversationsQueryOptions } from "@/queries/conversations-query";
1+
import { getConversationsQueryOptions } from "@/queries/use-conversations-query";
22
import { useCurrentAccount } from "@data/store/accountsStore";
33
import { useQuery } from "@tanstack/react-query";
44

@@ -8,6 +8,7 @@ export const useConversationsCount = () => {
88
const { data: count, isLoading } = useQuery({
99
...getConversationsQueryOptions({
1010
account: account!,
11+
caller: "useConversationsCount",
1112
}),
1213
select: (data) => data?.length ?? 0,
1314
});

0 commit comments

Comments
 (0)