debounce fetching of individual jobs

This commit is contained in:
Keith Grant
2020-06-09 15:24:15 -07:00
parent 58b954df3e
commit 7aa8495d1a
2 changed files with 46 additions and 11 deletions

View File

@@ -61,19 +61,24 @@ function JobList({ i18n, defaultParams, showTypeColumn = false }) {
const { request: addJobsById } = useRequest( const { request: addJobsById } = useRequest(
useCallback( useCallback(
async ids => { async ids => {
if (!ids.length) {
return;
}
const params = parseQueryString(QS_CONFIG, location.search); const params = parseQueryString(QS_CONFIG, location.search);
params.id__in = ids; params.id__in = ids.join(',');
const { data } = await UnifiedJobsAPI.read({ ...params }); const { data } = await UnifiedJobsAPI.read({ ...params });
const mergedJobsList = [...data.results, ...results].slice( setValue(prev => {
0, const mergedJobsList = [...data.results, ...prev.results].slice(
params.page_size 0,
); params.page_size
setValue({ );
results: mergedJobsList, return {
count: count + data.count, results: mergedJobsList,
count: prev.count + data.count,
};
}); });
}, },
[location, setValue, QS_CONFIG] // eslint-disable-line react-hooks/exhaustive-deps [location, setValue] // eslint-disable-line react-hooks/exhaustive-deps
) )
); );

View File

@@ -3,10 +3,24 @@ import { useState, useEffect, useRef } from 'react';
export default function useWsJobs(initialJobs, fetchJobsById, filtersApplied) { export default function useWsJobs(initialJobs, fetchJobsById, filtersApplied) {
const [jobs, setJobs] = useState(initialJobs); const [jobs, setJobs] = useState(initialJobs);
const [lastMessage, setLastMessage] = useState(null); const [lastMessage, setLastMessage] = useState(null);
const [jobsToFetch, setJobsToFetch] = useState([]);
const debouncedJobsToFetch = useDebounce(jobsToFetch, 5000);
useEffect(() => { useEffect(() => {
setJobs(initialJobs); setJobs(initialJobs);
}, [initialJobs]); }, [initialJobs]);
const enqueueJobId = id => {
if (!jobsToFetch.includes(id)) {
setJobsToFetch(ids => ids.concat(id));
}
};
useEffect(() => {
if (debouncedJobsToFetch.length) {
fetchJobsById(debouncedJobsToFetch);
setJobsToFetch([]);
}
}, [debouncedJobsToFetch, fetchJobsById]);
const ws = useRef(null); const ws = useRef(null);
useEffect(() => { useEffect(() => {
@@ -15,7 +29,7 @@ export default function useWsJobs(initialJobs, fetchJobsById, filtersApplied) {
} }
if (filtersApplied) { if (filtersApplied) {
if (['completed', 'failed', 'error'].includes(lastMessage.status)) { if (['completed', 'failed', 'error'].includes(lastMessage.status)) {
fetchJobsById([lastMessage.unified_job_id]); enqueueJobId(lastMessage.unified_job_id);
} }
return; return;
} }
@@ -25,7 +39,7 @@ export default function useWsJobs(initialJobs, fetchJobsById, filtersApplied) {
if (index > -1) { if (index > -1) {
setJobs(updateJob(jobs, index, lastMessage)); setJobs(updateJob(jobs, index, lastMessage));
} else { } else {
fetchJobsById([lastMessage.unified_job_id]); enqueueJobId(lastMessage.unified_job_id);
} }
}, [lastMessage]); // eslint-disable-line react-hooks/exhaustive-deps }, [lastMessage]); // eslint-disable-line react-hooks/exhaustive-deps
@@ -85,3 +99,19 @@ function updateJob(jobs, index, message) {
}; };
return [...jobs.slice(0, index), job, ...jobs.slice(index + 1)]; return [...jobs.slice(0, index), job, ...jobs.slice(index + 1)];
} }
function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => {
const timeout = setTimeout(() => {
setDebouncedValue(value);
}, delay);
return () => {
clearTimeout(timeout);
};
}, [value, delay]);
return debouncedValue;
}