From c9374e1a9705a7a33145c463cb0f1736659dcdfc Mon Sep 17 00:00:00 2001
From: Diana Rita Nanyanzi <31903212+d-rita@users.noreply.github.com>
Date: Fri, 12 Aug 2022 13:23:19 +0300
Subject: [PATCH] Replace submit button with loader during results fetch

---
 src/components/mapathon/mapathonReportForm.js | 25 +++++++++++++------
 src/components/userGroup/userGroupForm.js     | 22 ++++++++++++----
 src/components/userGroup/userGroupResults.js  |  4 +--
 src/views/MapathonReports.js                  | 13 ----------
 src/views/UserGroupReport.js                  | 24 +++++++++++-------
 5 files changed, 51 insertions(+), 37 deletions(-)

diff --git a/src/components/mapathon/mapathonReportForm.js b/src/components/mapathon/mapathonReportForm.js
index 4ab0f26..0cc7ccd 100644
--- a/src/components/mapathon/mapathonReportForm.js
+++ b/src/components/mapathon/mapathonReportForm.js
@@ -12,6 +12,7 @@ import { setLoading, setTriggerSubmit } from "../../features/form/formSlice";
 import { FormContext } from "../../context/formContext";
 import { getTimeZone } from "../../utils/timeUtils";
 import { validateMapathonFormData } from "../../utils/validationUtils";
+import { SpinnerIcon } from "../../assets/svgIcons";
 import messages from "../messages";
 
 export const MapathonReportForm = ({ fetch, error, loading }) => {
@@ -172,14 +173,22 @@ export const MapathonReportForm = ({ fetch, error, loading }) => {
             />
           </div>
         </div>
-        <div className="text-center mt-4">
-          <SubmitButton
-            styles="bg-red text-white py-3 px-10 text-xl"
-            disabled={loading}
-          >
-            <FormattedMessage {...messages.mapathonSubmitForm} />
-          </SubmitButton>
-        </div>
+        {!loading && (
+          <div className="text-center mt-4">
+            <SubmitButton
+              styles="bg-red text-white py-3 px-10 text-xl"
+              disabled={loading}
+            >
+              <FormattedMessage {...messages.mapathonSubmitForm} />
+            </SubmitButton>
+          </div>
+        )}
+        {loading && (
+          <div className="mx-auto text-center w-1/4 p-1 mt-5">
+            <SpinnerIcon className="animate-spin w-5 h-5 mr-2 mb-1 inline text-red" />
+            Loading...
+          </div>
+        )}
       </form>
       {formError && (
         <Error>
diff --git a/src/components/userGroup/userGroupForm.js b/src/components/userGroup/userGroupForm.js
index 1e9e686..36f482f 100644
--- a/src/components/userGroup/userGroupForm.js
+++ b/src/components/userGroup/userGroupForm.js
@@ -7,6 +7,7 @@ import { SubmitButton } from "../button";
 import { Error } from "../formResponses";
 import { UserGroupErrorMessage } from "./userGroupError";
 import { getTimeZone } from "../../utils/timeUtils";
+import { SpinnerIcon } from "../../assets/svgIcons";
 import messages from "./messages";
 
 export const UserGroupReportForm = ({
@@ -16,6 +17,8 @@ export const UserGroupReportForm = ({
   setUsers,
   formError,
   setFormError,
+  setLoading,
+  loading,
 }) => {
   const intl = useIntl();
 
@@ -34,6 +37,7 @@ export const UserGroupReportForm = ({
     event.preventDefault();
     if (formData.usernames.length > 0) {
       setUsers([]);
+      setLoading(true);
       fetch(formData); // API call
       setFormError(null);
     } else {
@@ -124,11 +128,19 @@ export const UserGroupReportForm = ({
             />
           </div>
         </div>
-        <div className="text-center mt-4">
-          <SubmitButton styles="bg-red text-white py-3 px-10 text-xl">
-            <FormattedMessage {...messages.Submit} />
-          </SubmitButton>
-        </div>
+        {!loading && (
+          <div className="text-center mt-4">
+            <SubmitButton styles="bg-red text-white py-3 px-10 text-xl">
+              <FormattedMessage {...messages.Submit} />
+            </SubmitButton>
+          </div>
+        )}
+        {loading && (
+          <div className="mx-auto text-center w-1/4 p-1 mt-5">
+            <SpinnerIcon className="animate-spin w-5 h-5 mr-2 mb-1 inline text-red" />
+            Loading...
+          </div>
+        )}
       </form>
       {formError && (
         <Error>
diff --git a/src/components/userGroup/userGroupResults.js b/src/components/userGroup/userGroupResults.js
index 7b16fd8..ffe6c05 100644
--- a/src/components/userGroup/userGroupResults.js
+++ b/src/components/userGroup/userGroupResults.js
@@ -19,7 +19,7 @@ export function UserGroupResultsTable({
   columns,
   data,
   userDataCheck,
-  loading,
+  tableLoading,
 }) {
   const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =
     useTable(
@@ -104,7 +104,7 @@ export function UserGroupResultsTable({
                     })}
                   </tbody>
                 </table>
-                {loading ? (
+                {tableLoading ? (
                   <div className="text-center w-11/12 mx-auto">
                     <SpinnerIcon className="animate-spin w-5 h-5 mt-2 inline text-red" />
                   </div>
diff --git a/src/views/MapathonReports.js b/src/views/MapathonReports.js
index 1f20e10..4473a1c 100644
--- a/src/views/MapathonReports.js
+++ b/src/views/MapathonReports.js
@@ -15,7 +15,6 @@ import { setTriggerSubmit } from "../features/form/formSlice";
 import { MiniNavBar } from "../components/nav/navbar";
 import { aggregateMapathonUserData } from "../utils/mapathonDataUtils";
 import { MapathonDetailedTableHeaders } from "../components/mapathon/constants";
-import { SpinnerIcon } from "../assets/svgIcons";
 
 const MAPATHON_PAGES = [
   { pageTitle: "Mapathon Summary Report", pageURL: "/mapathon-report/summary" },
@@ -51,12 +50,6 @@ export const MapathonSummaryReport = (props) => {
       <div className="text-center mt-4">
         <MapathonRedirectButton triggerFn={triggeredSubmit} />
       </div>
-      {isLoading && (
-        <div className="mx-auto text-center w-1/4 p-1 mt-5">
-          <SpinnerIcon className="animate-spin w-5 h-5 mr-2 mb-1 inline text-red" />
-          Loading...
-        </div>
-      )}
       {data && <MapathonSummaryResults data={data} />}
     </div>
   );
@@ -83,12 +76,6 @@ export const MapathonDetailedReport = () => {
         fetch={mutate}
         loading={isLoading || triggeredLoading}
       />
-      {(isLoading || triggeredLoading) && (
-        <div className="mx-auto text-center w-1/4 p-1 mt-5">
-          <SpinnerIcon className="animate-spin w-5 h-5 mr-2 mb-1 inline text-red" />
-          Loading...
-        </div>
-      )}
       {data && (
         <MapathonDetailedResultsTable
           data={aggregateMapathonUserData(data)}
diff --git a/src/views/UserGroupReport.js b/src/views/UserGroupReport.js
index b6f8360..046cc7f 100644
--- a/src/views/UserGroupReport.js
+++ b/src/views/UserGroupReport.js
@@ -9,7 +9,6 @@ import { getUserIds, getUserStats } from "../queries/getUserStats";
 import { MiniNavBar } from "../components/nav/navbar";
 import { UserGroupColumnHeadings } from "../components/userGroup/constants";
 import { aggregateUserGroupData } from "../utils/userGroupUtils";
-import { SpinnerIcon } from "../assets/svgIcons";
 
 const userGroupPage = [
   { pageTitle: "User Group Report", pageURL: "/user-report" },
@@ -19,12 +18,14 @@ export const UserGroupReport = () => {
   const { userGroupFormData, setUserGroupFormData } = useContext(FormContext);
   const [formError, setFormError] = useState(null);
   const [userIds, setUserIds] = useState([]);
-  const [users, setUsers] = useState();
+  const [users, setUsers] = useState(null);
+  const [loading, setLoading] = useState(false);
 
   const { mutate, data, isLoading, error } = useMutation(getUserIds);
 
   useEffect(() => {
     if (error) {
+      setLoading(false);
       if (error.response.status === 500) {
         setFormError(error.response.data);
       } else {
@@ -39,6 +40,8 @@ export const UserGroupReport = () => {
 
   const fetchUserStats = useCallback(
     (ids) => {
+      setLoading(true);
+      setUsers([]);
       ids.map((i) =>
         getUserStats(i.userId, userGroupFormData)
           .then((res) => {
@@ -59,9 +62,16 @@ export const UserGroupReport = () => {
     [userGroupFormData]
   );
 
+  useEffect(() => {
+    if (isLoading) {
+      setLoading(isLoading);
+    }
+  }, [isLoading]);
+
   useEffect(() => {
     if (userIds) {
       fetchUserStats(userIds);
+      setLoading(false);
     }
   }, [userIds]);
 
@@ -75,19 +85,15 @@ export const UserGroupReport = () => {
         setUsers={setUsers}
         formError={formError}
         setFormError={setFormError}
+        setLoading={setLoading}
+        loading={loading}
       />
-      {isLoading && (
-        <div className="mx-auto text-center w-1/4 p-1 mt-5">
-          <SpinnerIcon className="animate-spin w-5 h-5 mr-2 mb-1 inline text-red" />
-          Loading...
-        </div>
-      )}
       {data && (
         <UserGroupResultsTable
           columns={UserGroupColumnHeadings}
           data={aggregateUserGroupData(users)}
           userDataCheck={userIds && userIds.length > 0}
-          loading={userIds.length !== users.length}
+          tableLoading={userIds.length !== users.length}
         />
       )}
     </div>