From 311a6ba5b90caedfe61b1dc4b6cf6a53dc635537 Mon Sep 17 00:00:00 2001
From: Tore Brede <Tore.Brede@uib.no>
Date: Tue, 16 Nov 2021 15:06:40 +0100
Subject: [PATCH] Moving error text closer to where the error is

---
 frontend/public/locales/en/common.json        |  4 ++-
 frontend/public/locales/nb/common.json        |  4 ++-
 frontend/public/locales/nn/common.json        |  4 ++-
 frontend/src/routes/guest/register/index.tsx  | 20 ++-------------
 .../routes/guest/register/registerPage.tsx    | 25 +++++++++++++++++++
 5 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json
index 0df2f8ab..b9adc250 100644
--- a/frontend/public/locales/en/common.json
+++ b/frontend/public/locales/en/common.json
@@ -94,7 +94,9 @@
     "passportNumberRequired": "Passport number required",
     "mobilePhoneRequired": "Mobile phone is required",
     "startDateMustBeSet": "Start date must be set",
-    "startDateMustBeBeforeEndDate": "Start date has to be before end date"
+    "startDateMustBeBeforeEndDate": "Start date has to be before end date",
+    "passportNationalityAndNumber": "Both passport nationality and number need to be set",
+    "nationalIdOrPassport": "National ID or passport information need to be entered"
   },
   "button": {
     "back": "Back",
diff --git a/frontend/public/locales/nb/common.json b/frontend/public/locales/nb/common.json
index a4859e3d..f9172a82 100644
--- a/frontend/public/locales/nb/common.json
+++ b/frontend/public/locales/nb/common.json
@@ -93,7 +93,9 @@
     "passportNumberRequired": "Passnummer er obligatorisk",
     "mobilePhoneRequired": "Mobilnummer er obligatorisk",
     "startDateMustBeSet": "Startdato må være satt",
-    "startDateMustBeBeforeEndDate": "Startdato må være før sluttdato"
+    "startDateMustBeBeforeEndDate": "Startdato må være før sluttdato",
+    "passportNationalityAndNumber": "Både passnasjonalitet og nummer må være satt",
+    "nationalIdOrPassport": "Fødselsnummer eller passinformasjon må oppgis"
   },
   "button": {
     "back": "Tilbake",
diff --git a/frontend/public/locales/nn/common.json b/frontend/public/locales/nn/common.json
index 966a2aba..8f13f7c9 100644
--- a/frontend/public/locales/nn/common.json
+++ b/frontend/public/locales/nn/common.json
@@ -94,7 +94,9 @@
     "passportNumberRequired": "Passnummer er obligatorisk",
     "mobilePhoneRequired": "Mobilnummer er obligatorisk",
     "startDateMustBeSet": "Startdato må vere satt",
-    "startDateMustBeBeforeEndDate": "Startdato må vere før sluttdato"
+    "startDateMustBeBeforeEndDate": "Startdato må vere før sluttdato",
+    "passportNationalityAndNumber": "Både passnasjonalitet og nummer må vere satt",
+    "nationalIdOrPassport": "Fødselsnummer eller passinformasjon må oppgjevast"
   },
   "button": {
     "back": "Tilbake",
diff --git a/frontend/src/routes/guest/register/index.tsx b/frontend/src/routes/guest/register/index.tsx
index 9c360840..a1d6809a 100644
--- a/frontend/src/routes/guest/register/index.tsx
+++ b/frontend/src/routes/guest/register/index.tsx
@@ -65,8 +65,6 @@ export default function GuestRegister() {
     authentication_method: AuthenticationMethod.Invite,
   })
 
-  const [errorState, setErrorState] = useState<string>('')
-
   const guestContactInfo = async () => {
     try {
       const response = await fetch('/api/ui/v1/invited')
@@ -152,24 +150,13 @@ export default function GuestRegister() {
     )}${updateFormData.mobilePhone}`
 
     if (guestFormData.authentication_method === AuthenticationMethod.Invite) {
+      // The authentication method is Invite, so the name does not come from a
+      // trusted third-party source, and the user can update it
       payload.person.first_name = updateFormData.firstName
       payload.person.last_name = updateFormData.lastName
     }
 
     if (updateFormData.passportNumber && updateFormData.passportNationality) {
-      // The user has entered some passport information, check that both nationality and number are present
-      if (
-        (updateFormData.passportNumber &&
-          !updateFormData.passportNationality) ||
-        (!updateFormData.passportNumber && updateFormData.passportNationality)
-      ) {
-        // TODO Make better text and use translation
-        setErrorState(
-          'Both passport nationality and passport number need to be set'
-        )
-        return
-      }
-      setErrorState('')
       payload.person.passport = `${updateFormData.passportNationality}-${updateFormData.passportNumber}`
     }
 
@@ -241,9 +228,6 @@ export default function GuestRegister() {
       </Box>
 
       {activeStep === Step.SubmitSuccessStep && <StepSubmitSuccessGuest />}
-
-      {/* TODO Give better feedback to user */}
-      {errorState && <h2>{errorState}</h2>}
     </Page>
   )
 }
diff --git a/frontend/src/routes/guest/register/registerPage.tsx b/frontend/src/routes/guest/register/registerPage.tsx
index 356e497c..fc99bda0 100644
--- a/frontend/src/routes/guest/register/registerPage.tsx
+++ b/frontend/src/routes/guest/register/registerPage.tsx
@@ -49,8 +49,30 @@ const GuestRegisterStep = forwardRef(
       CountryCallingCode | undefined
     >(undefined)
     const [mobilePhone, setMobilePhone] = useState<string>('')
+    const [idErrorState, setIdErrorState] = useState<string>('')
 
     const submit: SubmitHandler<EnteredGuestData> = (data) => {
+      if (
+        !data.nationalIdNumber &&
+        !data.passportNumber &&
+        !data.passportNationality
+      ) {
+        // The user has not entered a national ID number nor passport information.
+        // In this case the user should not be allowed to send in the registration
+        setIdErrorState(t('validation.nationalIdOrPassport'))
+        return
+      }
+
+      // The user has entered some passport information, check that both nationality and number are present
+      if (
+        (data.passportNumber && !data.passportNationality) ||
+        (!data.passportNumber && data.passportNationality)
+      ) {
+        setIdErrorState(t('validation.passportNationalityAndNumber'))
+        return
+      }
+      setIdErrorState('')
+
       nextHandler(data)
     }
 
@@ -361,6 +383,9 @@ const GuestRegisterStep = forwardRef(
                         </MenuItem>
                       ))}
                   </Select>
+                  {idErrorState && (
+                    <Typography color="error">{idErrorState}</Typography>
+                  )}
                 </>
               )}
 
-- 
GitLab