@@ -72,25 +72,30 @@ import { deliverMessage } from "./actions.js";
7272function Thread ({ messages, sendMessage }) {
7373 const formRef = useRef ();
7474 async function formAction (formData ) {
75- addOptimisticMessage (formData .get (" message" ));
75+ const message = {
76+ key: new Date ().getTime (),
77+ text: formData .get (" message" )
78+ };
79+ addOptimisticMessage (message);
7680 formRef .current .reset ();
77- await sendMessage (formData );
81+ await sendMessage (message );
7882 }
7983 const [optimisticMessages , addOptimisticMessage ] = useOptimistic (
8084 messages,
8185 (state , newMessage ) => [
82- ... state,
86+ // properly merge state by removing the duplicated message
87+ ... state .filter (msg => msg .key !== newMessage .key ),
8388 {
84- text : newMessage,
89+ ... newMessage,
8590 sending: true
8691 }
8792 ]
8893 );
8994
9095 return (
9196 <>
92- {optimisticMessages .map ((message , index ) => (
93- < div key= {index }>
97+ {optimisticMessages .map ((message ) => (
98+ < div key= {message . key }>
9499 {message .text }
95100 {!! message .sending && < small> (Sending... )< / small> }
96101 < / div>
@@ -107,9 +112,9 @@ export default function App() {
107112 const [messages , setMessages ] = useState ([
108113 { text: " Hello there!" , sending: false , key: 1 }
109114 ]);
110- async function sendMessage (formData ) {
111- const sentMessage = await deliverMessage (formData . get ( " message" ) );
112- setMessages ((messages ) => [... messages, { text : sentMessage } ]);
115+ async function sendMessage (message ) {
116+ const sentMessage = await deliverMessage (message);
117+ setMessages ((messages ) => [... messages, sentMessage]);
113118 }
114119 return < Thread messages= {messages} sendMessage= {sendMessage} / > ;
115120}
0 commit comments