(queryClient: QueryClient, chatId: string)
| 1253 | }; |
| 1254 | |
| 1255 | export const editChatMessage = (queryClient: QueryClient, chatId: string) => ({ |
| 1256 | mutationFn: ({ messageId, req }: EditChatMessageMutationArgs) => |
| 1257 | API.experimental.editChatMessage(chatId, messageId, req), |
| 1258 | onMutate: async ({ |
| 1259 | messageId, |
| 1260 | optimisticMessage, |
| 1261 | }: EditChatMessageMutationArgs): Promise<EditChatMessageMutationContext> => { |
| 1262 | // Cancel in-flight refetches so they don't overwrite the |
| 1263 | // optimistic update before the mutation completes. |
| 1264 | await queryClient.cancelQueries({ |
| 1265 | queryKey: chatMessagesKey(chatId), |
| 1266 | exact: true, |
| 1267 | }); |
| 1268 | |
| 1269 | const previousData = queryClient.getQueryData< |
| 1270 | InfiniteData<TypesGen.ChatMessagesResponse> |
| 1271 | >(chatMessagesKey(chatId)); |
| 1272 | |
| 1273 | queryClient.setQueryData< |
| 1274 | InfiniteData<TypesGen.ChatMessagesResponse> | undefined |
| 1275 | >(chatMessagesKey(chatId), (current) => |
| 1276 | projectEditedConversationIntoCache({ |
| 1277 | currentData: current, |
| 1278 | editedMessageId: messageId, |
| 1279 | replacementMessage: optimisticMessage, |
| 1280 | queuedMessages: [], |
| 1281 | }), |
| 1282 | ); |
| 1283 | |
| 1284 | return { previousData }; |
| 1285 | }, |
| 1286 | onError: ( |
| 1287 | _error: unknown, |
| 1288 | _variables: EditChatMessageMutationArgs, |
| 1289 | context: EditChatMessageMutationContext | undefined, |
| 1290 | ) => { |
| 1291 | // Restore the cache on failure so the user sees the |
| 1292 | // original messages again. |
| 1293 | if (context?.previousData) { |
| 1294 | queryClient.setQueryData(chatMessagesKey(chatId), context.previousData); |
| 1295 | } |
| 1296 | // Invalidate messages as a safety net: the restored snapshot |
| 1297 | // may be missing WebSocket-delivered messages that arrived |
| 1298 | // during the mutation's flight time. |
| 1299 | void queryClient.invalidateQueries({ |
| 1300 | queryKey: chatMessagesKey(chatId), |
| 1301 | exact: true, |
| 1302 | }); |
| 1303 | }, |
| 1304 | onSuccess: ( |
| 1305 | response: TypesGen.EditChatMessageResponse, |
| 1306 | variables: EditChatMessageMutationArgs, |
| 1307 | ) => { |
| 1308 | queryClient.setQueryData< |
| 1309 | InfiniteData<TypesGen.ChatMessagesResponse> | undefined |
| 1310 | >(chatMessagesKey(chatId), (current) => |
| 1311 | reconcileEditedMessageInCache({ |
| 1312 | currentData: current, |
no test coverage detected