From 223a1bdd77b1b260de13b3c1d82e775d8c308c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Demenech?= Date: Tue, 6 Jun 2023 14:49:22 -0300 Subject: [PATCH] [#912,@portaljs/components][s]: create LoadingSpinner component and add that to when using the URL parameter --- .../components/src/components/FlatUiTable.tsx | 45 ++++++------------- .../src/components/LoadingSpinner.tsx | 23 ++++++++++ packages/components/src/components/Table.tsx | 12 ++++- 3 files changed, 47 insertions(+), 33 deletions(-) create mode 100644 packages/components/src/components/LoadingSpinner.tsx diff --git a/packages/components/src/components/FlatUiTable.tsx b/packages/components/src/components/FlatUiTable.tsx index 0e29d71d..bec51bbc 100644 --- a/packages/components/src/components/FlatUiTable.tsx +++ b/packages/components/src/components/FlatUiTable.tsx @@ -1,12 +1,13 @@ import { QueryClient, QueryClientProvider, useQuery } from 'react-query'; import Papa from 'papaparse'; import { Grid } from '@githubocto/flat-ui'; +import LoadingSpinner from './LoadingSpinner'; const queryClient = new QueryClient(); export async function getCsv(url: string, corsProxy?: string) { if (corsProxy) { - url = corsProxy + url + url = corsProxy + url; } const response = await fetch(url, { headers: { @@ -36,30 +37,6 @@ export async function parseCsv(file: string): Promise { }); } -const Spinning = () => { - return ( -
- - Loading... -
- ); -}; - export interface FlatUiTableProps { url?: string; data?: { [key: string]: number | string }[]; @@ -80,10 +57,15 @@ export const FlatUiTable: React.FC = ({ ); }; -const TableInner: React.FC = ({ url, data, rawCsv, corsProxy }) => { +const TableInner: React.FC = ({ + url, + data, + rawCsv, + corsProxy, +}) => { if (data) { return ( -
+
); @@ -95,19 +77,18 @@ const TableInner: React.FC = ({ url, data, rawCsv, corsProxy } ); const { data: parsedData, isLoading: isParsing } = useQuery( ['dataPreview', csvString], - () => parseCsv(rawCsv ? rawCsv as string : csvString as string), + () => parseCsv(rawCsv ? (rawCsv as string) : (csvString as string)), { enabled: rawCsv ? true : !!csvString } ); if (isParsing || isDownloadingCSV)
- +
; if (parsedData) return ( -
+
); - return + return ; }; - diff --git a/packages/components/src/components/LoadingSpinner.tsx b/packages/components/src/components/LoadingSpinner.tsx new file mode 100644 index 00000000..e2654a12 --- /dev/null +++ b/packages/components/src/components/LoadingSpinner.tsx @@ -0,0 +1,23 @@ +export default function LoadingSpinner() { + return ( +
+ + Loading... +
+ ); +} diff --git a/packages/components/src/components/Table.tsx b/packages/components/src/components/Table.tsx index 5e261e79..c069273c 100644 --- a/packages/components/src/components/Table.tsx +++ b/packages/components/src/components/Table.tsx @@ -23,6 +23,7 @@ import React, { useEffect, useMemo, useState } from 'react'; import parseCsv from '../lib/parseCsv'; import DebouncedInput from './DebouncedInput'; import loadData from '../lib/loadData'; +import LoadingSpinner from './LoadingSpinner'; export type TableProps = { data?: Array<{ [key: string]: number | string }>; @@ -39,6 +40,8 @@ export const Table = ({ url = '', fullWidth = false, }: TableProps) => { + const [isLoading, setIsLoading] = useState(false); + if (csv) { const out = parseCsv(csv); ogData = out.rows; @@ -77,15 +80,22 @@ export const Table = ({ useEffect(() => { if (url) { + setIsLoading(true); + // TODO: exception handling. What if the file doesn't exist? What if fetching was not possible? loadData(url).then((data) => { const { rows, fields } = parseCsv(data); setData(rows); setCols(fields); + setIsLoading(false); }); } }, [url]); - return ( + return isLoading ? ( +
+ +
+ ) : (