Open
Description
const { isLive, isSyncing, isLoading, results, error } = useParseQuery(query);
- when
query
changes you get
{ results: resultsOfPreviousQuery, isLoading: false, isLive: true, isSyncing: false, error: undefined }
- a little later you get a re-rerender with the appropriate response
{ results: undefined, isLoading: true, isLive: true, isSyncing: false, error: undefined }
- and when the fetching is done
{ results: newResults, isLoading: false, isLive: true, isSyncing: false, error: undefined }
Response (2) should be what's returned at step (1). A new query shouldn't return results from a previous one.
@parse/react-ssr 0.0.1-alpha.17
Here's a page for reproducing it:
import { initializeParse } from '@parse/react-ssr';
import { useEffect, useState } from 'react';
import { useParseQuery } from '@parse/react-ssr';
initializeParse(
process.env.NEXT_PUBLIC_PARSE_SERVER_URL!,
process.env.NEXT_PUBLIC_PARSE_APP_ID!,
process.env.NEXT_PUBLIC_PARSE_JS_KEY!
);
const OBJECT_CLASS = 'Showtime';
interface LogEntry {
requestedId?: string;
resultId?: string;
isLoading: boolean;
isSyncing: boolean;
isLive: boolean;
error?: Error;
}
export default function FalseZero() {
const [ids, setIds] = useState<string[]>([]);
const [requestedId, setRequestedId] = useState('');
const [log, setLog] = useState<LogEntry[]>([]);
const query = new Parse.Query(OBJECT_CLASS).equalTo('objectId', requestedId);
const { isLive, isSyncing, isLoading, results, error } = useParseQuery(query);
const resultId = results?.[0]?.id;
// log results when they change
useEffect(() => {
setLog((prev) => [...prev, { requestedId, resultId, isLoading, error, isLive, isSyncing }]);
}, [requestedId, resultId, isLoading, error, isLive, isSyncing]);
// on mount, load valid ids
useEffect(() => {
new Parse.Query(OBJECT_CLASS)
.find()
.then((results) => setIds(getIds(results)))
.catch(console.error);
}, []);
// request a random id
function fetchRandomObject() {
if (!ids?.length) return;
const i = Math.floor(Math.random() * ids.length);
setRequestedId(ids[i]);
}
if (!ids?.length) return <>no ids yet</>;
return (
<>
<button className={'btn btn-sm btn-primary'} onClick={fetchRandomObject}>
fetch
</button>
<button className={'btn btn-sm btn-primary ml-2'} onClick={() => setLog([])}>
clear log
</button>
<p>{resultId}</p>
<p>---</p>
<p>{log.length} entries</p>
{log.map(reportLogEntry)}
</>
);
}
function reportLogEntry(entry: LogEntry, i: number) {
const { isLoading, error, requestedId, resultId, isSyncing, isLive } = entry;
const bad = !isLoading && !error && requestedId !== resultId;
return (
<p key={i} style={{ marginTop: '1em', color: bad ? 'red' : 'black' }}>
requested: {requestedId || '[none]'}
<br />
result: {resultId || '[none]'}
<br />
isLoading: {isLoading ? 'true' : 'false'}
<br />
error: {entry.error?.message || '[none]'}
<br />
isLive: {isLive ? 'true' : 'false'}
<br />
isSyncing: {isSyncing ? 'true' : 'false'}
</p>
);
}
function getIds(list: { id: string }[]) {
return list.map(({ id }) => id);
}