Skip to content

Commit 1b2e39b

Browse files
authored
Merge pull request #1932 from fedspendingtransparency/FDG-10809
FDG-10809 Add Load Time Notice
2 parents 1403eb6 + afe7dc0 commit 1b2e39b

File tree

2 files changed

+75
-47
lines changed

2 files changed

+75
-47
lines changed

src/components/published-reports/download-report-table/gen-report-download-table-row/gen-report-download-table-row.tsx

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { FunctionComponent, useEffect, useState } from 'react';
1+
import React, { FunctionComponent, useEffect, useState, useRef } from 'react';
22
import { fileDescription } from '../download-report-table-row/download-report-table-row.module.scss';
33
import { getGeneratedReportFileDisplay } from '../../util/util';
44
import { useRenderPDF } from './useRenderPDF';
@@ -25,24 +25,24 @@ const GenReportDownloadTableRow: FunctionComponent<{
2525
const [publishedDate, setPublishedDate] = useState(null);
2626
const { value, loading, error } = useRenderPDF(generatedReport);
2727

28-
const updateData = () => {
29-
const curReportFile: IGeneratedReport = generatedReport;
30-
const fileDisplay = getGeneratedReportFileDisplay(curReportFile);
31-
setDisplayName(fileDisplay?.displayName);
32-
setPublishedDate(curReportFile?.date);
33-
};
34-
28+
const prevLoadingRef = useRef<boolean>(false);
3529
useEffect(() => {
36-
updateData();
37-
}, [generatedReport]);
30+
const prev = prevLoadingRef.current;
31+
if (loading !== prev) {
32+
setIsLoading(loading);
33+
prevLoadingRef.current = loading;
34+
}
35+
}, [loading, setIsLoading]);
3836

3937
useEffect(() => {
40-
setIsLoading(loading);
41-
}, [loading]);
38+
setApiErrorMessage(!!error);
39+
}, [error, setApiErrorMessage]);
4240

4341
useEffect(() => {
44-
setApiErrorMessage(!!error);
45-
}, [error]);
42+
const fileDisplay = getGeneratedReportFileDisplay(generatedReport);
43+
setDisplayName(fileDisplay?.displayName);
44+
setPublishedDate(generatedReport?.date);
45+
}, [generatedReport]);
4646

4747
return (
4848
<>

src/components/published-reports/generative-reports-section/generative-reports-section.tsx

Lines changed: 61 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { FunctionComponent, useEffect, useMemo, useState } from 'react';
1+
import React, { FunctionComponent, useEffect, useMemo, useState, useRef } from 'react';
22
import DatasetSectionContainer from '../../dataset-section-container/dataset-section-container';
33
import { filtersContainer } from '../reports-section/reports-section.module.scss';
44
import { apiPrefix, basicFetch } from '../../../utils/api-utils';
@@ -28,8 +28,21 @@ const GenerativeReportsSection: FunctionComponent<{ dataset: IDatasetConfig; wid
2828
const [allReports, setAllReports] = useState([]);
2929
const [apiErrorMessage, setApiErrorMessage] = useState(false);
3030
const [noMatchingData, setNoMatchingData] = useState(false);
31+
const [isFetching, setIsFetching] = useState(false);
32+
const [renderLoadCount, setRenderLoadCount] = useState(0);
3133
const [isLoading, setIsLoading] = useState<boolean>(false);
3234

35+
const lastShowTsRef = useRef<number>(0);
36+
const incrementRender = () => setRenderLoadCount(count => count + 1);
37+
const decrementRender = () => setRenderLoadCount(count => Math.max(0, count - 1));
38+
39+
const handleRowLoading = (loading: boolean) => {
40+
if (loading) incrementRender();
41+
else decrementRender();
42+
};
43+
44+
const showLoading = isFetching || renderLoadCount > 0;
45+
3346
const bannerCopy = reportsBannerCopy[reportGenKey];
3447
const heading = noMatchingData ? bannerCopy?.noDataMatchHeader : bannerCopy?.additionalFiltersHeader;
3548
const body = noMatchingData ? bannerCopy?.noDataMatchBody : bannerCopy?.additionalFiltersBody;
@@ -120,45 +133,60 @@ const GenerativeReportsSection: FunctionComponent<{ dataset: IDatasetConfig; wid
120133
setAllReportYears(Array.from(yearsSet));
121134
}, [earliestReportDate, latestReportDate]);
122135

136+
useEffect(() => {
137+
if (showLoading) {
138+
lastShowTsRef.current = Date.now();
139+
setIsLoading(true);
140+
} else {
141+
const t = setTimeout(() => setIsLoading(false), 0);
142+
return () => clearTimeout(t);
143+
}
144+
}, [showLoading]);
145+
123146
useMemo(() => {
124147
(async () => {
125-
if (selectedAccount.value) {
148+
if (!selectedAccount.value) {
149+
setAllReports([]);
150+
setIsFetching(false);
151+
return;
152+
}
153+
154+
setIsFetching(true);
155+
try {
126156
const reports = [];
127157
for (const report of apisProp) {
128158
const reportConfig = reportsConfig[reportGenKey][report.apiId];
129-
if (reportConfig) {
130-
const formattedDate = format(selectedDate, 'MMMM yyyy');
131-
const downloadDate = format(selectedDate, 'MMyyyy');
132-
let reportData;
133-
try {
134-
reportData = await getReportData(report, reportConfig);
135-
} catch (error) {
136-
setIsLoading(false);
137-
setApiErrorMessage(true);
138-
break;
139-
}
140-
setApiErrorMessage(false);
141-
const curReport = {
142-
id: report.apiId,
143-
name: `${report.tableName} - ${selectedAccount.label}.pdf`,
144-
date: formattedDate,
145-
size: '2KB',
146-
downloadName: `${reportConfig.downloadName}_${selectedAccount.label}_${downloadDate}.pdf`,
147-
data: reportData.tableData,
148-
summaryData: reportData.summaryTableData,
149-
summaryValues: reportData.summaryData,
150-
config: reportConfig,
151-
colConfig: report,
152-
};
153-
reports.push(curReport);
154-
//When no main table data is available, pull summary values from the summary data
155-
const summary = reportData.tableData.length > 0 ? reportData.tableData : reportData.summaryData;
156-
setSummaryValues(reportConfig, formattedDate, summary, reportData.summaryData);
157-
}
159+
if (!reportConfig) continue;
160+
161+
const formattedDate = format(selectedDate, 'MMMM yyyy');
162+
const downloadDate = format(selectedDate, 'MMyyyy');
163+
164+
const reportData = await getReportData(report, reportConfig);
165+
setApiErrorMessage(false);
166+
167+
const curReport = {
168+
id: report.apiId,
169+
name: `${report.tableName} - ${selectedAccount.label}.pdf`,
170+
date: formattedDate,
171+
size: '2KB',
172+
downloadName: `${reportConfig.downloadName}_${selectedAccount.label}_${downloadDate}.pdf`,
173+
data: reportData.tableData,
174+
summaryData: reportData.summaryTableData,
175+
summaryValues: reportData.summaryData,
176+
config: reportConfig,
177+
colConfig: report,
178+
};
179+
reports.push(curReport);
180+
181+
const summarySource = reportData.tableData.length > 0 ? reportData.tableData : reportData.summaryData;
182+
setSummaryValues(reportConfig, formattedDate, summarySource, reportData.summaryData);
158183
}
159184
setAllReports(reports);
160-
} else {
185+
} catch (error) {
186+
setApiErrorMessage(true);
161187
setAllReports([]);
188+
} finally {
189+
setIsFetching(false);
162190
}
163191
})();
164192
}, [selectedAccount, selectedDate]);
@@ -213,7 +241,7 @@ const GenerativeReportsSection: FunctionComponent<{ dataset: IDatasetConfig; wid
213241
width={width}
214242
setApiErrorMessage={setApiErrorMessage}
215243
isLoading={isLoading}
216-
setIsLoading={setIsLoading}
244+
setIsLoading={handleRowLoading}
217245
/>
218246
)}
219247
<DataPreviewDatatableBanner bannerNotice={dataset?.publishedReportsTip} isReport={true} />

0 commit comments

Comments
 (0)