From 5ed05b96a58a12c45c5faf102b9e35c1563d9bd3 Mon Sep 17 00:00:00 2001 From: Lebaud Antoine Date: Tue, 26 Mar 2024 21:50:12 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A9=B9(frontend)=20disable=20submission?= =?UTF-8?q?=20button=20while=20a=20request=20is=20pending?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If any request is taking longer than expected, the user could interact with the frontend, thinking the previous submission was not taken into account, and would re-submit a request. It happened to me while sending an invitation. Replaying request can either lead to inconsistencies in db for the user, or to errors in requests' response. I propose to disable all interactive button while submitting a request. It's good enough for this actual sprint, these types of interactivity issues could be improved later on. --- .../addMembers/components/ModalAddMembers.tsx | 18 +++++++++++++++--- .../addMembers/components/SearchMembers.tsx | 3 +++ .../features/members/components/ModalRole.tsx | 10 ++++++++-- .../teams/components/CardCreateTeam.tsx | 5 ++++- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/frontend/apps/desk/src/features/addMembers/components/ModalAddMembers.tsx b/src/frontend/apps/desk/src/features/addMembers/components/ModalAddMembers.tsx index 01c1606..355dfc8 100644 --- a/src/frontend/apps/desk/src/features/addMembers/components/ModalAddMembers.tsx +++ b/src/frontend/apps/desk/src/features/addMembers/components/ModalAddMembers.tsx @@ -57,6 +57,8 @@ export const ModalAddMembers = ({ const { mutateAsync: createInvitation } = useCreateInvitation(); const { mutateAsync: createTeamAccess } = useCreateTeamAccess(); + const [isPending, setIsPending] = useState(false); + const switchActions = (selectedMembers: OptionsSelect) => selectedMembers.map(async (selectedMember) => { switch (selectedMember.type) { @@ -111,11 +113,15 @@ export const ModalAddMembers = ({ }; const handleValidate = async () => { + setIsPending(true); + const settledPromises = await Promise.allSettled< OptionInvitation | OptionNewMember >(switchActions(selectedMembers)); onClose(); + setIsPending(false); + settledPromises.forEach((settledPromise) => { switch (settledPromise.status) { case 'rejected': @@ -133,7 +139,12 @@ export const ModalAddMembers = ({ + } @@ -144,7 +155,7 @@ export const ModalAddMembers = ({ } @@ -71,7 +77,7 @@ export const ModalRole = ({ accessId: access.id, }); }} - disabled={isNotAllowed} + disabled={isNotAllowed || isPending} > {t('Validate')} diff --git a/src/frontend/apps/desk/src/features/teams/components/CardCreateTeam.tsx b/src/frontend/apps/desk/src/features/teams/components/CardCreateTeam.tsx index 9cb0210..b9ae887 100644 --- a/src/frontend/apps/desk/src/features/teams/components/CardCreateTeam.tsx +++ b/src/frontend/apps/desk/src/features/teams/components/CardCreateTeam.tsx @@ -57,7 +57,10 @@ export const CardCreateTeam = () => { -