From 2f93d6c17813db3904a74439c93152648a4956d3 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 06:33:56 +0300 Subject: [PATCH] fix(example): preserve concurrent message and pagination updates Use functional state for appending/prepending messages and pages, compute new chat messages from current rather than captured lengths, and label the unstable-chat scroll control with its actual target index. --- fixture/react-native/src/Chat.tsx | 4 +--- fixture/react-native/src/ChatUnstableItems.tsx | 6 +++--- fixture/react-native/src/Messages/Messages.tsx | 2 +- fixture/react-native/src/Messages/MessagesFlatList.tsx | 2 +- fixture/react-native/src/PaginatedList.tsx | 8 +++----- fixture/web/Chat.tsx | 4 +--- 6 files changed, 10 insertions(+), 16 deletions(-) diff --git a/fixture/react-native/src/Chat.tsx b/fixture/react-native/src/Chat.tsx index 56bc48421..42a06d991 100644 --- a/fixture/react-native/src/Chat.tsx +++ b/fixture/react-native/src/Chat.tsx @@ -42,9 +42,7 @@ export function Chat() { }, []); const addMessageAtBottom = useCallback(() => { - const newMessage = generateRandomMessage(messages.length); - setMessages((prev) => [...prev, newMessage]); - // eslint-disable-next-line react-hooks/exhaustive-deps + setMessages((prev) => [...prev, generateRandomMessage(prev.length)]); }, []); const renderItem = useCallback((info: { item: ChatMessage }) => { diff --git a/fixture/react-native/src/ChatUnstableItems.tsx b/fixture/react-native/src/ChatUnstableItems.tsx index c633927d4..8cf5f72dd 100644 --- a/fixture/react-native/src/ChatUnstableItems.tsx +++ b/fixture/react-native/src/ChatUnstableItems.tsx @@ -81,7 +81,7 @@ export function ChatUnstableItems() { return () => clearTimeout(id); }, [scrollTarget]); - const scrollToItem25 = useCallback(() => { + const scrollToItem150 = useCallback(() => { setScrollTarget(150); }, []); @@ -131,9 +131,9 @@ export function ChatUnstableItems() { - Scroll to 25 + Scroll to 150 diff --git a/fixture/react-native/src/Messages/Messages.tsx b/fixture/react-native/src/Messages/Messages.tsx index 9c73dba2c..bdff28a48 100644 --- a/fixture/react-native/src/Messages/Messages.tsx +++ b/fixture/react-native/src/Messages/Messages.tsx @@ -19,7 +19,7 @@ const Messages = () => { sender: userName, type: MessageType.Text, } as Message; - setMessages([...messages, message]); + setMessages((previous) => [...previous, message]); }; return ( diff --git a/fixture/react-native/src/Messages/MessagesFlatList.tsx b/fixture/react-native/src/Messages/MessagesFlatList.tsx index cc0789b6e..75ab68795 100644 --- a/fixture/react-native/src/Messages/MessagesFlatList.tsx +++ b/fixture/react-native/src/Messages/MessagesFlatList.tsx @@ -24,7 +24,7 @@ const MessagesFlatList = () => { type: MessageType.Text, } as Message; - setMessages([message, ...messages]); + setMessages((previous) => [message, ...previous]); }; return ( diff --git a/fixture/react-native/src/PaginatedList.tsx b/fixture/react-native/src/PaginatedList.tsx index 923a96362..029b206fe 100644 --- a/fixture/react-native/src/PaginatedList.tsx +++ b/fixture/react-native/src/PaginatedList.tsx @@ -47,11 +47,9 @@ export default class PaginatedList extends React.Component { onEndReached={() => { console.log("onEndReached"); // Since FlatList is a pure component, data reference should change for a render - const elems = [...this.state.elems]; - elems.push(...this._generateArray(elems.length, 20)); - this.setState(() => { - return { elems }; - }); + this.setState(({ elems }: PaginatedListState) => ({ + elems: [...elems, ...this._generateArray(elems.length, 20)], + })); }} onStartReached={() => { console.log("onStartReached"); diff --git a/fixture/web/Chat.tsx b/fixture/web/Chat.tsx index 56bc48421..42a06d991 100644 --- a/fixture/web/Chat.tsx +++ b/fixture/web/Chat.tsx @@ -42,9 +42,7 @@ export function Chat() { }, []); const addMessageAtBottom = useCallback(() => { - const newMessage = generateRandomMessage(messages.length); - setMessages((prev) => [...prev, newMessage]); - // eslint-disable-next-line react-hooks/exhaustive-deps + setMessages((prev) => [...prev, generateRandomMessage(prev.length)]); }, []); const renderItem = useCallback((info: { item: ChatMessage }) => {