Skip to content

Commit b61a177

Browse files
authored
Merge pull request #791 from RohitR311/cache-api-v2
feat: faster data fetching v2
2 parents 6b81aa6 + 6c1d661 commit b61a177

File tree

5 files changed

+178
-106
lines changed

5 files changed

+178
-106
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"@mui/lab": "^5.0.0-alpha.80",
1212
"@mui/material": "^5.6.2",
1313
"@react-oauth/google": "^0.12.1",
14+
"@tanstack/react-query": "^5.89.0",
1415
"@testing-library/react": "^13.1.1",
1516
"@testing-library/user-event": "^13.5.0",
1617
"@types/bcrypt": "^5.0.2",

src/components/robot/RecordingsTable.tsx

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ import {
3636
MoreHoriz,
3737
Refresh
3838
} from "@mui/icons-material";
39-
import { useGlobalInfoStore } from "../../context/globalInfo";
40-
import { checkRunsForRecording, deleteRecordingFromStorage, getStoredRecordings } from "../../api/storage";
39+
import { useGlobalInfoStore, useCachedRecordings } from "../../context/globalInfo";
40+
import { checkRunsForRecording, deleteRecordingFromStorage } from "../../api/storage";
4141
import { Add } from "@mui/icons-material";
4242
import { useNavigate } from 'react-router-dom';
4343
import { canCreateBrowserInState, getActiveBrowserId, stopRecording } from "../../api/recording";
@@ -150,12 +150,11 @@ export const RecordingsTable = ({
150150
const { t } = useTranslation();
151151
const [page, setPage] = React.useState(0);
152152
const [rowsPerPage, setRowsPerPage] = React.useState(10);
153-
const [rows, setRows] = React.useState<Data[]>([]);
153+
const { data: recordingsData = [], isLoading: isFetching, error, refetch } = useCachedRecordings();
154154
const [isModalOpen, setModalOpen] = React.useState(false);
155155
const [searchTerm, setSearchTerm] = React.useState('');
156156
const [isWarningModalOpen, setWarningModalOpen] = React.useState(false);
157157
const [activeBrowserId, setActiveBrowserId] = React.useState('');
158-
const [isFetching, setIsFetching] = React.useState(true);
159158

160159
const columns = useMemo(() => [
161160
{ id: 'interpret', label: t('recordingtable.run'), minWidth: 80 },
@@ -238,44 +237,42 @@ export const RecordingsTable = ({
238237
if (dateStr.includes('PM') || dateStr.includes('AM')) {
239238
return new Date(dateStr);
240239
}
241-
240+
242241
return new Date(dateStr.replace(/(\d+)\/(\d+)\//, '$2/$1/'))
243242
} catch {
244243
return new Date(0);
245244
}
246245
};
247246

248-
const fetchRecordings = useCallback(async () => {
249-
try {
250-
const recordings = await getStoredRecordings();
251-
if (recordings) {
252-
const parsedRows = recordings
253-
.map((recording: any, index: number) => {
254-
if (recording?.recording_meta) {
255-
const parsedDate = parseDateString(recording.recording_meta.updatedAt);
256-
257-
return {
258-
id: index,
259-
...recording.recording_meta,
260-
content: recording.recording,
261-
parsedDate
262-
};
263-
}
264-
return null;
265-
})
266-
.filter(Boolean)
267-
.sort((a, b) => b.parsedDate.getTime() - a.parsedDate.getTime());
268-
269-
setRecordings(parsedRows.map((recording) => recording.name));
270-
setRows(parsedRows);
271-
}
272-
} catch (error) {
273-
console.error('Error fetching recordings:', error);
274-
notify('error', t('recordingtable.notifications.fetch_error'));
275-
} finally {
276-
setIsFetching(false);
247+
const rows = useMemo(() => {
248+
if (!recordingsData) return [];
249+
250+
const parsedRows = recordingsData
251+
.map((recording: any, index: number) => {
252+
if (recording?.recording_meta) {
253+
const parsedDate = parseDateString(recording.recording_meta.updatedAt);
254+
255+
return {
256+
id: index,
257+
...recording.recording_meta,
258+
content: recording.recording,
259+
parsedDate
260+
};
261+
}
262+
return null;
263+
})
264+
.filter(Boolean)
265+
.sort((a, b) => b.parsedDate.getTime() - a.parsedDate.getTime());
266+
267+
return parsedRows;
268+
}, [recordingsData]);
269+
270+
useEffect(() => {
271+
if (rows.length > 0) {
272+
setRecordings(rows.map((recording) => recording.name));
277273
}
278-
}, [setRecordings, notify, t]);
274+
}, [rows, setRecordings]);
275+
279276

280277
const handleNewRecording = useCallback(async () => {
281278
const canCreateRecording = await canCreateBrowserInState("recording");
@@ -331,7 +328,7 @@ export const RecordingsTable = ({
331328

332329
if (lastPair?.what) {
333330
if (Array.isArray(lastPair.what)) {
334-
const gotoAction = lastPair.what.find(action =>
331+
const gotoAction = lastPair.what.find((action: any) =>
335332
action && typeof action === 'object' && 'action' in action && action.action === "goto"
336333
) as any;
337334

@@ -408,17 +405,12 @@ export const RecordingsTable = ({
408405
window.sessionStorage.setItem('initialUrl', event.target.value);
409406
}
410407

411-
useEffect(() => {
412-
fetchRecordings();
413-
}, [fetchRecordings]);
414-
415408
useEffect(() => {
416409
if (rerenderRobots) {
417-
fetchRecordings().then(() => {
418-
setRerenderRobots(false);
419-
});
410+
refetch();
411+
setRerenderRobots(false);
420412
}
421-
}, [rerenderRobots, fetchRecordings, setRerenderRobots]);
413+
}, [rerenderRobots, setRerenderRobots, refetch]);
422414

423415
function useDebounce<T>(value: T, delay: number): T {
424416
const [debouncedValue, setDebouncedValue] = React.useState<T>(value);
@@ -468,12 +460,11 @@ export const RecordingsTable = ({
468460

469461
const success = await deleteRecordingFromStorage(id);
470462
if (success) {
471-
setRows([]);
472463
notify('success', t('recordingtable.notifications.delete_success'));
473-
fetchRecordings();
464+
refetch();
474465
}
475466
}
476-
}), [handleRunRecording, handleScheduleRecording, handleIntegrateRecording, handleSettingsRecording, handleEditRobot, handleDuplicateRobot, handleRetrainRobot, notify, t]);
467+
}), [handleRunRecording, handleScheduleRecording, handleIntegrateRecording, handleSettingsRecording, handleEditRobot, handleDuplicateRobot, handleRetrainRobot, notify, t, refetch]);
477468

478469
return (
479470
<React.Fragment>

src/components/run/RunsTable.tsx

Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ import { Accordion, AccordionSummary, AccordionDetails, Typography, Box, TextFie
1313
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
1414
import SearchIcon from '@mui/icons-material/Search';
1515
import { useLocation, useNavigate } from 'react-router-dom';
16-
import { useGlobalInfoStore } from "../../context/globalInfo";
17-
import { getStoredRuns } from "../../api/storage";
16+
import { useGlobalInfoStore, useCachedRuns } from "../../context/globalInfo";
1817
import { RunSettings } from "./RunSettings";
1918
import { CollapsibleRow } from "./ColapsibleRow";
2019
import { ArrowDownward, ArrowUpward, UnfoldMore } from '@mui/icons-material';
@@ -132,16 +131,14 @@ export const RunsTable: React.FC<RunsTableProps> = ({
132131
[t]
133132
);
134133

135-
const [rows, setRows] = useState<Data[]>([]);
136-
const [searchTerm, setSearchTerm] = useState('');
137-
const [isFetching, setIsFetching] = useState(true);
134+
const { notify, rerenderRuns, setRerenderRuns } = useGlobalInfoStore();
135+
const { data: rows = [], isLoading: isFetching, error, refetch } = useCachedRuns();
138136

137+
const [searchTerm, setSearchTerm] = useState('');
139138
const [paginationStates, setPaginationStates] = useState<PaginationState>({});
140139
const [expandedRows, setExpandedRows] = useState<Set<string>>(new Set());
141140
const [expandedAccordions, setExpandedAccordions] = useState<Set<string>>(new Set());
142141

143-
const { notify, rerenderRuns, setRerenderRuns } = useGlobalInfoStore();
144-
145142
const handleAccordionChange = useCallback((robotMetaId: string, isExpanded: boolean) => {
146143
setExpandedAccordions(prev => {
147144
const newSet = new Set(prev);
@@ -278,47 +275,18 @@ export const RunsTable: React.FC<RunsTableProps> = ({
278275
debouncedSetSearch(event.target.value);
279276
}, [debouncedSearch]);
280277

281-
const fetchRuns = useCallback(async () => {
282-
try {
283-
const runs = await getStoredRuns();
284-
if (runs) {
285-
const parsedRows: Data[] = runs.map((run: any, index: number) => ({
286-
id: index,
287-
...run,
288-
}));
289-
setRows(parsedRows);
290-
} else {
291-
notify('error', t('runstable.notifications.no_runs'));
292-
}
293-
} catch (error) {
294-
notify('error', t('runstable.notifications.fetch_error'));
295-
} finally {
296-
setIsFetching(false);
297-
}
298-
}, [notify, t]);
299278

300279
useEffect(() => {
301-
let mounted = true;
302-
303-
if (rows.length === 0 || rerenderRuns) {
304-
setIsFetching(true);
305-
fetchRuns().then(() => {
306-
if (mounted) {
307-
setRerenderRuns(false);
308-
}
309-
});
280+
if (rerenderRuns) {
281+
refetch();
282+
setRerenderRuns(false);
310283
}
311-
312-
return () => {
313-
mounted = false;
314-
};
315-
}, [rerenderRuns, rows.length, setRerenderRuns, fetchRuns]);
284+
}, [rerenderRuns, setRerenderRuns, refetch]);
316285

317286
const handleDelete = useCallback(() => {
318-
setRows([]);
319287
notify('success', t('runstable.notifications.delete_success'));
320-
fetchRuns();
321-
}, [notify, t, fetchRuns]);
288+
refetch();
289+
}, [notify, t, refetch]);
322290

323291
// Filter rows based on search term
324292
const filteredRows = useMemo(() => {
@@ -350,15 +318,15 @@ export const RunsTable: React.FC<RunsTableProps> = ({
350318
}, {} as Record<string, Data[]>);
351319

352320
Object.keys(groupedData).forEach(robotId => {
353-
groupedData[robotId].sort((a, b) =>
321+
groupedData[robotId].sort((a: any, b: any) =>
354322
parseDateString(b.startedAt).getTime() - parseDateString(a.startedAt).getTime()
355323
);
356324
});
357325

358326
const robotEntries = Object.entries(groupedData).map(([robotId, runs]) => ({
359327
robotId,
360-
runs,
361-
latestRunDate: parseDateString(runs[0].startedAt).getTime()
328+
runs: runs as Data[],
329+
latestRunDate: parseDateString((runs as Data[])[0].startedAt).getTime()
362330
}));
363331

364332
robotEntries.sort((a, b) => b.latestRunDate - a.latestRunDate);

0 commit comments

Comments
 (0)