@@ -2,9 +2,20 @@ import { unknownConsentConversationsQueryKey } from "@/queries/QueryKeys";
2
2
import { setConversationQueryData } from "@/queries/useConversationQuery" ;
3
3
import { captureError } from "@/utils/capture-error" ;
4
4
import logger from "@/utils/logger" ;
5
- import { ConverseXmtpClientType } from "@/utils/xmtpRN/client.types" ;
5
+ import {
6
+ ConversationWithCodecsType ,
7
+ ConverseXmtpClientType ,
8
+ } from "@/utils/xmtpRN/client.types" ;
6
9
import { getXmtpClient } from "@/utils/xmtpRN/sync" ;
7
- import { queryOptions } from "@tanstack/react-query" ;
10
+ import { QueryObserver , queryOptions , useQuery } from "@tanstack/react-query" ;
11
+ import { reactQueryPersister } from "@/utils/mmkv" ;
12
+ import { updateObjectAndMethods } from "@/utils/update-object-and-methods" ;
13
+ import { ConversationTopic } from "@xmtp/react-native-sdk" ;
14
+ import { queryClient } from "./queryClient" ;
15
+
16
+ export type IUnknownConversationsQuery = Awaited <
17
+ ReturnType < typeof getUnknownConversations >
18
+ > ;
8
19
9
20
async function getUnknownConversations ( args : { account : string } ) {
10
21
const { account } = args ;
@@ -23,7 +34,7 @@ async function getUnknownConversations(args: { account: string }) {
23
34
if ( timeDiff > 3000 ) {
24
35
captureError (
25
36
new Error (
26
- `[ConversationsQuery] Fetching conversations from network took ${ timeDiff } ms for unknown consent for account ${ account } `
37
+ `[ConversationsQuery] Fetching conversations from network took ${ timeDiff } ms`
27
38
)
28
39
) ;
29
40
}
@@ -38,8 +49,7 @@ async function getUnknownConversations(args: { account: string }) {
38
49
lastMessage : true ,
39
50
description : true ,
40
51
} ,
41
- 20 , // For now we only fetch 20 until we have the right pagination system. At least people will be able to see their conversations
42
- [ "unknown" ]
52
+ 20 // For now we only fetch 20 until we have the right pagination system. At least people will be able to see their conversations
43
53
) ;
44
54
45
55
// For now conversations have all the same properties as one conversation
@@ -54,13 +64,124 @@ async function getUnknownConversations(args: { account: string }) {
54
64
return conversations ;
55
65
}
56
66
67
+ export const prefetchUnknownConsentConversationsQuery = ( args : {
68
+ account : string ;
69
+ } ) => {
70
+ return queryClient . prefetchQuery (
71
+ getUnknownConsentConversationsQueryOptions ( args )
72
+ ) ;
73
+ } ;
74
+
75
+ export const addConversationToUnknownConsentConversationsQuery = ( args : {
76
+ account : string ;
77
+ conversation : ConversationWithCodecsType ;
78
+ } ) => {
79
+ const { account, conversation } = args ;
80
+ logger . debug (
81
+ `[UnknownConversationsQuery] addConversationToUnknownConsentConversationsQuery for account ${ account } `
82
+ ) ;
83
+ const previousConversationsData = getUnknownConsentConversationsQueryData ( {
84
+ account,
85
+ } ) ;
86
+
87
+ if ( ! previousConversationsData ) {
88
+ queryClient . setQueryData < IUnknownConversationsQuery > (
89
+ getUnknownConsentConversationsQueryOptions ( { account } ) . queryKey ,
90
+ [ conversation ]
91
+ ) ;
92
+ return ;
93
+ }
94
+
95
+ const conversationExists = previousConversationsData . some (
96
+ ( c ) => c . topic === conversation . topic
97
+ ) ;
98
+
99
+ if ( conversationExists ) {
100
+ return ;
101
+ }
102
+
103
+ queryClient . setQueryData < IUnknownConversationsQuery > (
104
+ getUnknownConsentConversationsQueryOptions ( { account } ) . queryKey ,
105
+ [ conversation , ...previousConversationsData ]
106
+ ) ;
107
+ } ;
108
+
109
+ export const getUnknownConsentConversationsQueryData = ( args : {
110
+ account : string ;
111
+ } ) => {
112
+ return queryClient . getQueryData < IUnknownConversationsQuery > (
113
+ getUnknownConsentConversationsQueryOptions ( args ) . queryKey
114
+ ) ;
115
+ } ;
116
+
117
+ export const updateConversationInUnknownConsentConversationsQueryData = ( args : {
118
+ account : string ;
119
+ topic : ConversationTopic ;
120
+ conversationUpdate : Partial < ConversationWithCodecsType > ;
121
+ } ) => {
122
+ const { account, topic, conversationUpdate } = args ;
123
+
124
+ logger . debug (
125
+ `[UnknownConversationsQuery] updateConversationInUnknownConsentConversationsQueryData for account ${ account } and topic ${ topic } `
126
+ ) ;
127
+
128
+ const previousConversationsData = getUnknownConsentConversationsQueryData ( {
129
+ account,
130
+ } ) ;
131
+ if ( ! previousConversationsData ) {
132
+ return ;
133
+ }
134
+ const newConversations = previousConversationsData . map ( ( c ) => {
135
+ if ( c . topic === topic ) {
136
+ return updateObjectAndMethods ( c , conversationUpdate ) ;
137
+ }
138
+ return c ;
139
+ } ) ;
140
+
141
+ queryClient . setQueryData < IUnknownConversationsQuery > (
142
+ getUnknownConsentConversationsQueryOptions ( {
143
+ account,
144
+ } ) . queryKey ,
145
+ newConversations
146
+ ) ;
147
+ } ;
148
+
149
+ export const removeConversationFromUnknownConsentConversationsQueryData =
150
+ ( args : { account : string ; topic : ConversationTopic } ) => {
151
+ const { account, topic } = args ;
152
+
153
+ logger . debug (
154
+ `[UnknownConversationsQuery] removeConversationFromUnknownConsentConversationsQueryData for account ${ account } and topic ${ topic } `
155
+ ) ;
156
+
157
+ const previousConversationsData = getUnknownConsentConversationsQueryData ( {
158
+ account,
159
+ } ) ;
160
+
161
+ if ( ! previousConversationsData ) {
162
+ return ;
163
+ }
164
+
165
+ const newConversations = previousConversationsData . filter (
166
+ ( conversation ) => conversation . topic !== topic
167
+ ) ;
168
+
169
+ queryClient . setQueryData < IUnknownConversationsQuery > (
170
+ getUnknownConsentConversationsQueryOptions ( { account } ) . queryKey ,
171
+ newConversations
172
+ ) ;
173
+ } ;
174
+
57
175
export function getUnknownConsentConversationsQueryOptions ( args : {
58
176
account : string ;
177
+ caller ?: string ;
59
178
} ) {
60
- const { account } = args ;
179
+ const { account, caller } = args ;
61
180
return queryOptions ( {
62
181
queryFn : ( ) => getUnknownConversations ( { account } ) ,
63
182
queryKey : unknownConsentConversationsQueryKey ( account ) ,
64
183
enabled : ! ! account ,
184
+ refetchOnMount : true ,
185
+ persister : reactQueryPersister ,
65
186
} ) ;
66
187
}
0 commit comments