From e640ba953936337d0a35f327bc14c920416eeceb Mon Sep 17 00:00:00 2001 From: Ben Silverman Date: Mon, 28 Dec 2020 11:31:00 -0500 Subject: [PATCH] #106 Loading indicators on group routes --- src/pages/groups/[id]/edit.jsx | 60 ++++++++++++++++++++++++++-------- src/pages/groups/index.jsx | 18 +++++++--- src/pages/groups/new.jsx | 17 +++++++--- 3 files changed, 74 insertions(+), 21 deletions(-) diff --git a/src/pages/groups/[id]/edit.jsx b/src/pages/groups/[id]/edit.jsx index c426e46a..47246702 100644 --- a/src/pages/groups/[id]/edit.jsx +++ b/src/pages/groups/[id]/edit.jsx @@ -1,6 +1,6 @@ import { useSession } from 'next-auth/client'; import { Pencil, TrashFill } from 'react-bootstrap-icons'; -import { useState, useRef } from 'react'; +import { useState, useRef, useEffect } from 'react'; import { Button, Card, @@ -40,6 +40,15 @@ const EditGroup = ({ statefulSession, }) => { const [session, loading] = useSession(); + const [pageLoading, setPageLoading] = useState(true); + + useEffect(() => { + if (loading === false) { + setPageLoading(false); + } + }, [loading]); + + const [alerts, setAlerts] = useState(initAlerts || []); const router = useRouter(); @@ -80,10 +89,10 @@ const EditGroup = ({ return ( - {!session && loading && ( + {((!session && loading) || pageLoading) && ( )} - {session && !loading + {session && !loading && !pageLoading && (session.user.role === 'admin' || roleInGroup(session) === 'owner' || roleInGroup(session) === 'manager') @@ -115,6 +124,7 @@ const EditGroup = ({ })} onSubmit={(values, actions) => { setTimeout(() => { + setPageLoading(true); renameGroup(group, values.groupName).then(() => { setAlerts([...alerts, { text: 'Group successfully renamed.', @@ -123,8 +133,10 @@ const EditGroup = ({ setState({ ...state, editingGroupName: false, groupName: values.groupName, }); + setPageLoading(false); }).catch((err) => { setAlerts([...alerts, { text: err.message, variant: 'danger' }]); + setPageLoading(false); }); actions.setSubmitting(false); }, 1000); @@ -200,6 +212,7 @@ const EditGroup = ({ { + setPageLoading(true); changeUserRole(group, member, 'member').then(() => { const newArray = [...state.members]; const newMember = { ...member, role: 'member' }; @@ -209,8 +222,10 @@ const EditGroup = ({ text: 'User\'s role changed successfully.', variant: 'success', }]); + setPageLoading(false); }).catch((err) => { setAlerts([...alerts, { text: err.message, variant: 'danger' }]); + setPageLoading(false); }); }} > @@ -219,6 +234,7 @@ const EditGroup = ({ { + setPageLoading(true); changeUserRole(group, member, 'manager').then(() => { const newArray = [...state.members]; const newMember = { ...member, role: 'manager' }; @@ -228,8 +244,10 @@ const EditGroup = ({ text: 'User\'s role changed successfully.', variant: 'success', }]); + setPageLoading(false); }).catch((err) => { setAlerts([...alerts, { text: err.message, variant: 'danger' }]); + setPageLoading(false); }); }} > @@ -245,16 +263,21 @@ const EditGroup = ({ variant="outline-danger" className="btn-sm" type="button" - onClick={() => removeUserFromGroup(group, member).then(() => { - const members = state.members.filter((val, i) => i !== idx); - setState({ ...state, members }); - setAlerts([...alerts, { - text: 'User successfully removed from group.', - variant: 'warning', - }]); - }).catch((err) => { - setAlerts([...alerts, { text: err.message, variant: 'danger' }]); - })} + onClick={() => { + setPageLoading(true); + removeUserFromGroup(group, member).then(() => { + const members = state.members.filter((val, i) => i !== idx); + setState({ ...state, members }); + setAlerts([...alerts, { + text: 'User successfully removed from group.', + variant: 'warning', + }]); + setPageLoading(false); + }).catch((err) => { + setAlerts([...alerts, { text: err.message, variant: 'danger' }]); + setPageLoading(false); + }); + }} > Remove @@ -274,6 +297,7 @@ const EditGroup = ({