From 3b8e0097a1822534fbd9ea96a2a75a90b8b32919 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Tue, 15 Sep 2020 19:40:29 +0000 Subject: [PATCH] Add loading spinners to buttons --- webclient/src/Classes.js | 13 ++++++++++--- webclient/src/InstructorClasses.js | 7 +++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/webclient/src/Classes.js b/webclient/src/Classes.js index b839b58..5dea796 100644 --- a/webclient/src/Classes.js +++ b/webclient/src/Classes.js @@ -92,6 +92,7 @@ export function ClassDetail(props) { const [clazz, setClass] = useState(false); const [refreshCount, refreshClass] = useReducer(x => x + 1, 0); const [error, setError] = useState(false); + const [loading, setLoading] = useState(false); const { token, user, refreshUser } = props; const { id } = useParams(); const userTraining = clazz && clazz.students.find(x => x.user == user.id); @@ -108,6 +109,7 @@ export function ClassDetail(props) { }, [refreshCount]); const handleSignup = () => { + setLoading(true); const data = { attendance_status: 'Waiting for payment', session: id }; requester('/training/', 'POST', token, data) .then(res => { @@ -120,6 +122,7 @@ export function ClassDetail(props) { }; const handleToggle = (newStatus) => { + setLoading(true); const data = { attendance_status: newStatus, session: id }; requester('/training/'+userTraining.id+'/', 'PUT', token, data) .then(res => { @@ -132,6 +135,10 @@ export function ClassDetail(props) { }); }; + useEffect(() => { + setLoading(false); + }, [userTraining]); + // TODO: calculate yesterday and lock signups return ( @@ -198,11 +205,11 @@ export function ClassDetail(props) {

Status: {userTraining.attendance_status}

{userTraining.attendance_status === 'Withdrawn' ? - : - } @@ -226,7 +233,7 @@ export function ClassDetail(props) { ((clazz.max_students && clazz.student_count >= clazz.max_students) ?

The class is full.

: - ) diff --git a/webclient/src/InstructorClasses.js b/webclient/src/InstructorClasses.js index 3603dba..836f067 100644 --- a/webclient/src/InstructorClasses.js +++ b/webclient/src/InstructorClasses.js @@ -68,8 +68,10 @@ class AttendanceSheet extends React.Component { function AttendanceRow(props) { const { student, token, refreshClass } = props; const [error, setError] = useState(false); + const [loading, setLoading] = useState(false); const handleMark = (newStatus) => { + setLoading(newStatus); const data = { ...student, attendance_status: newStatus }; requester('/training/'+student.id+'/', 'PATCH', token, data) .then(res => { @@ -86,8 +88,13 @@ function AttendanceRow(props) { onClick: () => handleMark(name), toggle: true, active: student.attendance_status === name, + loading: loading === name, }); + useEffect(() => { + setLoading(false); + }, [student.attendance_status]); + return (

{student.student_name}{student.attendance_status === 'Waiting for payment' && ' (Waiting for payment)'}: