( queryClient: ReturnType<typeof useQueryClient>, queryKey: readonly unknown[], snapshot: Message, shouldRestore?: RestoreMessageGuard )
| 222 | * optimistic mutations can pass a guard so newer live events are not replaced |
| 223 | * by stale snapshots. |
| 224 | */ |
| 225 | export function restoreMessageInCache( |
| 226 | queryClient: ReturnType<typeof useQueryClient>, |
| 227 | queryKey: readonly unknown[], |
| 228 | snapshot: Message, |
| 229 | shouldRestore?: RestoreMessageGuard |
| 230 | ): boolean { |
| 231 | let restored = false; |
| 232 | queryClient.setQueryData<MessageInfiniteData>(queryKey, old => { |
| 233 | if (!old) return old; |
| 234 | for (let pageIndex = 0; pageIndex < old.pages.length; pageIndex++) { |
| 235 | const page = old.pages[pageIndex]; |
| 236 | if (!page) continue; |
| 237 | const messageIndex = page.messages.findIndex(msg => msg.id === snapshot.id); |
| 238 | if (messageIndex === -1) continue; |
| 239 | |
| 240 | const current = page.messages[messageIndex]; |
| 241 | if (!current) return old; |
| 242 | if (shouldRestore && !shouldRestore(current)) return old; |
| 243 | |
| 244 | const pages = old.pages.slice(); |
| 245 | const updatedMessages = page.messages.slice(); |
| 246 | updatedMessages[messageIndex] = snapshot; |
| 247 | pages[pageIndex] = withPageMessages(page, updatedMessages); |
| 248 | restored = true; |
| 249 | return { ...old, pages }; |
| 250 | } |
| 251 | return old; |
| 252 | }); |
| 253 | return restored; |
| 254 | } |
| 255 | |
| 256 | /** |
no test coverage detected