@@ -88,6 +88,40 @@ Create a real-time data listener that returns a `watcher` object.
8888- ` add ` : New document added
8989- ` delete ` : Document deleted
9090
91+ ## Initial Readiness Contract
92+
93+ Calling ` .watch() ` only starts the listener setup. Do not assume the queried data is ready immediately after ` watch() ` returns.
94+
95+ - Treat the first ` onChange ` snapshot whose ` docChanges ` contain ` dataType: 'init' ` as the canonical "initial data is ready" signal.
96+ - Until that ` init ` snapshot arrives, keep loading state explicit.
97+ - Do not enable turn-based actions, render room state as authoritative, or conclude that the query returned no rows before the ` init ` snapshot.
98+
99+ Example:
100+
101+ ``` javascript
102+ let initialReady = false ;
103+
104+ const watcher = db .collection (" rooms" )
105+ .where ({ roomId })
106+ .watch ({
107+ onChange (snapshot ) {
108+ const isInit = snapshot .docChanges ? .some (
109+ change => change .dataType === ' init'
110+ );
111+
112+ syncRoomState (snapshot .docs );
113+
114+ if (isInit && ! initialReady) {
115+ initialReady = true ;
116+ setLoading (false );
117+ }
118+ },
119+ onError (error ) {
120+ handleWatchError (error);
121+ }
122+ });
123+ ` ` `
124+
91125**Watcher object methods:**
92126- ` watcher .close ()` : Close monitoring and release resources
93127
@@ -120,10 +154,18 @@ import { useEffect } from 'react';
120154
121155function ChatRoom ({ roomId }) {
122156 useEffect (() => {
157+ let initialReady = false ;
123158 const watcher = db .collection (" messages" )
124159 .where ({ chatRoomId: roomId })
125160 .watch ({
126- onChange: handleNewMessages,
161+ onChange (snapshot ) {
162+ handleNewMessages (snapshot);
163+
164+ if (! initialReady && snapshot .docChanges ? .some (change => change .dataType === ' init' )) {
165+ initialReady = true ;
166+ setLoading (false );
167+ }
168+ },
127169 onError: handleError
128170 });
129171
@@ -133,4 +175,4 @@ function ChatRoom({ roomId }) {
133175 };
134176 }, [roomId]);
135177}
136- ```
178+ ` ` `
0 commit comments