From 0a9e8c5d3842d13fd4b68c1aef277ab1ecb76536 Mon Sep 17 00:00:00 2001 From: Russell Pollari Date: Thu, 14 Sep 2023 20:47:09 -0400 Subject: [PATCH] Add loading indicator to transaction rows (#66) * Show loading indicator for syncing transactions * Refactor and style --------- Co-authored-by: russell-pollari --- client/components/ImportTransactions.tsx | 4 +- client/components/LoadingSpinner.tsx | 25 +++++ client/components/SyncDetails.tsx | 18 +++- client/components/TransactionTable.tsx | 119 +++++++++++++++-------- client/numToAccountingString.ts | 18 ++++ client/pages/TransactionsPage.tsx | 6 +- client/store/transactions.ts | 28 +++++- 7 files changed, 166 insertions(+), 52 deletions(-) create mode 100644 client/components/LoadingSpinner.tsx create mode 100644 client/numToAccountingString.ts diff --git a/client/components/ImportTransactions.tsx b/client/components/ImportTransactions.tsx index c45b4b0..7ec7aad 100644 --- a/client/components/ImportTransactions.tsx +++ b/client/components/ImportTransactions.tsx @@ -42,10 +42,10 @@ const ImportTransactions = () => { }; return ( -
+
{isSyncing ? `${status}...` : 'Import Stripe Transactions'} diff --git a/client/components/LoadingSpinner.tsx b/client/components/LoadingSpinner.tsx new file mode 100644 index 0000000..5d8771e --- /dev/null +++ b/client/components/LoadingSpinner.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; + +const LoadingSpinner = () => ( +
+ + Loading... +
+); + +export default LoadingSpinner; diff --git a/client/components/SyncDetails.tsx b/client/components/SyncDetails.tsx index ca1f7fe..e19fa51 100644 --- a/client/components/SyncDetails.tsx +++ b/client/components/SyncDetails.tsx @@ -1,18 +1,26 @@ import * as React from 'react'; import { Dialog } from '@headlessui/react'; -import { useDispatch } from 'react-redux'; +import { useDispatch, useSelector } from 'react-redux'; -import { Transaction } from '../types'; +import type { Transaction } from '../types'; +import type { RootState } from '../store/store'; import { selectTransaction } from '../store/transactions'; -const SyncDetails = ({ transaction }: { transaction: Transaction | null }) => { +const SyncDetails = () => { const dispatch = useDispatch(); - const isOpen = transaction !== null; + const transactions = useSelector( + (state: RootState) => state.transactions.transactions + ); + const selectedTransaction = useSelector( + (state: RootState) => state.transactions.selectedTransaction + ); + + const transaction: Transaction = transactions[selectedTransaction]; return ( dispatch(selectTransaction(null))} >