From 922ff2884aed3f22428a8bb84efb2c93b733184e Mon Sep 17 00:00:00 2001
From: Tore Brede <Tore.Brede@uib.no>
Date: Wed, 20 Oct 2021 15:37:53 +0200
Subject: [PATCH] GREG-85: Adding passport nationality field

---
 frontend/public/locales/en/common.json        |  3 +-
 frontend/public/locales/nb/common.json        |  3 +-
 frontend/public/locales/nn/common.json        |  3 +-
 .../routes/guest/register/guestDataForm.ts    |  1 +
 frontend/src/routes/guest/register/index.tsx  | 50 +++++++++++--------
 .../routes/guest/register/registerPage.tsx    | 44 ++++++++++++----
 6 files changed, 72 insertions(+), 32 deletions(-)

diff --git a/frontend/public/locales/en/common.json b/frontend/public/locales/en/common.json
index 2a0162f9..26c3f0a8 100644
--- a/frontend/public/locales/en/common.json
+++ b/frontend/public/locales/en/common.json
@@ -21,7 +21,8 @@
     "fullName": "Full name",
     "mobilePhone": "Mobile phone",
     "passportNumber": "Passport number",
-    "passportNationality": "Passport nationality"
+    "passportNationality": "Passport nationality",
+    "countryCallingCode": "Country code"
   },
   "sponsor": {
     "contactInfo": "Contact information",
diff --git a/frontend/public/locales/nb/common.json b/frontend/public/locales/nb/common.json
index 7a29b865..fe54d8b1 100644
--- a/frontend/public/locales/nb/common.json
+++ b/frontend/public/locales/nb/common.json
@@ -21,7 +21,8 @@
     "fullName": "Fullt navn",
     "mobilePhone": "Mobilnummer",
     "passportNumber": "Passnummer",
-    "passportNationality": "Passnasjonalitet"
+    "passportNationality": "Passnasjonalitet",
+    "countryCallingCode": "Landkode"
   },
   "sponsor": {
     "contactInfo": "Kontaktinformasjon",
diff --git a/frontend/public/locales/nn/common.json b/frontend/public/locales/nn/common.json
index a288d819..d6a2d116 100644
--- a/frontend/public/locales/nn/common.json
+++ b/frontend/public/locales/nn/common.json
@@ -23,7 +23,8 @@
     "mobilePhone": "Mobilnummer",
     "passportNumber": "Passnummer",
     "passportNationality": "Passnasjonalitet",
-    "mobilePhoneRequired": "Mobilnummer er obligaorisk"
+    "mobilePhoneRequired": "Mobilnummer er obligaorisk",
+    "countryCallingCode": "Landkode"
   },
   "sponsor": {
     "contactInfo": "Kontaktinformasjon",
diff --git a/frontend/src/routes/guest/register/guestDataForm.ts b/frontend/src/routes/guest/register/guestDataForm.ts
index 44ab9823..cb52a87b 100644
--- a/frontend/src/routes/guest/register/guestDataForm.ts
+++ b/frontend/src/routes/guest/register/guestDataForm.ts
@@ -21,6 +21,7 @@ export type ContactInformationBySponsor = {
   mobile_phone?: string
   fnr?: string
   passport?: string
+  passportNationality?: string
 
   authentication_method: AuthenticationMethod
 }
diff --git a/frontend/src/routes/guest/register/index.tsx b/frontend/src/routes/guest/register/index.tsx
index 2d9ea27d..c0f75c28 100644
--- a/frontend/src/routes/guest/register/index.tsx
+++ b/frontend/src/routes/guest/register/index.tsx
@@ -51,6 +51,7 @@ export default function GuestRegister() {
       mobile_phone: '',
       fnr: '',
       passport: '',
+      passportNationality: '',
       authentication_method: AuthenticationMethod.Invite,
     })
 
@@ -84,6 +85,8 @@ export default function GuestRegister() {
             mobile_phone: jsonResponse.person.mobile_phone,
             fnr: jsonResponse.fnr,
             passport: jsonResponse.passport,
+            // TODO Separate out nationality based on what is in the server response
+            passportNationality: '',
 
             authentication_method: authenticationMethod,
           })
@@ -114,27 +117,34 @@ export default function GuestRegister() {
   const handleForwardFromRegister = (
     updateFormData: EnteredGuestData
   ): void => {
-    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
+    const payload: any = {}
+    payload.person = {}
+    payload.person.mobile_phone = updateFormData.mobilePhone
+
+    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}`
     }
-    setErrorState('')
-
-    const passIdentity = `${updateFormData.passportNationality}-${updateFormData.passportNumber}`
-    const payload = {
-      person: {
-        mobile_phone: updateFormData.mobilePhone,
-        fnr: updateFormData.nationalIdNumber,
-        passport: passIdentity,
-      },
+
+    if (updateFormData.nationalIdNumber) {
+      payload.person.fnr = updateFormData.nationalIdNumber
     }
 
+    // TODO Remove after development
+    console.log(`Payload: ${JSON.stringify(payload)}`)
+
     fetch('/api/ui/v1/invited/', submitJsonOpts('POST', payload))
       .then((response) => {
         if (response.ok) {
@@ -145,8 +155,8 @@ export default function GuestRegister() {
         }
       })
       .catch((error) => {
-        console.error(error)
         setSubmitState(SubmitState.SubmittedError)
+        console.error(error)
       })
   }
 
@@ -193,7 +203,7 @@ export default function GuestRegister() {
         <Button onClick={handleSave}>{t('button.save')}</Button>
       </Box>
 
-      {/*TODO Give better feedback to user*/}
+      {/* 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 b7728a7a..a8f05d5e 100644
--- a/frontend/src/routes/guest/register/registerPage.tsx
+++ b/frontend/src/routes/guest/register/registerPage.tsx
@@ -12,6 +12,7 @@ import React, { forwardRef, Ref, useImperativeHandle, useState } from 'react'
 import { useTranslation } from 'react-i18next'
 import {
   CountryCallingCode,
+  CountryCode,
   getCountries,
   getCountryCallingCode,
 } from 'libphonenumber-js'
@@ -65,7 +66,7 @@ const GuestRegisterStep = forwardRef(
       setValue,
       trigger,
       formState: { errors },
-    } = useForm()
+    } = useForm<EnteredGuestData>()
     const onSubmit = handleSubmit<EnteredGuestData>(submit)
 
     function doSubmit() {
@@ -112,7 +113,7 @@ const GuestRegisterStep = forwardRef(
               <TextField
                 id="email"
                 label={t('input.email')}
-                value={guestData.email}
+                value={!guestData.email ? '' : guestData.email}
                 disabled
               />
 
@@ -120,7 +121,6 @@ const GuestRegisterStep = forwardRef(
                 sx={{
                   display: 'flex',
                   flexDirection: 'row',
-                  paddingBottom: '2rem',
                 }}
               >
                 <Select
@@ -131,12 +131,26 @@ const GuestRegisterStep = forwardRef(
                   }}
                   labelId="phone-number-select"
                   id="phone-number-select"
+                  displayEmpty
+                  defaultValue=""
                   onChange={handleCountryCodeChange}
+                  renderValue={(selected: any) => {
+                    if (selected.length === 0 || selected === '') {
+                      return t('input.countryCallingCode')
+                    }
+                    return `${getName(
+                      selected,
+                      i18n.language
+                    )} (${getCountryCallingCode(selected as CountryCode)})`
+                  }}
                 >
+                  <MenuItem disabled value="">
+                    {t('input.countryCallingCode')}
+                  </MenuItem>
                   {getCountries().map((country) => (
                     <MenuItem key={country} value={country}>
-                      {getName(country, i18n.language)} +
-                      {getCountryCallingCode(country)}
+                      {getName(country, i18n.language)} (
+                      {getCountryCallingCode(country)})
                     </MenuItem>
                   ))}
                 </Select>
@@ -167,7 +181,7 @@ const GuestRegisterStep = forwardRef(
                   <TextField
                     id="national_id_number"
                     label={t('input.nationalIdNumber')}
-                    error={!!errors.national_id_number}
+                    error={!!errors.nationalIdNumber}
                     helperText={
                       errors.nationalIdNumber && errors.nationalIdNumber.message
                     }
@@ -182,21 +196,33 @@ const GuestRegisterStep = forwardRef(
                     id="passport-number-id"
                     data-testid="passport_number_input"
                     label={t('input.passportNumber')}
-                    {...(register('passportNumber'),
-                    {
+                    {...register('passportNumber', {
                       required: false,
                     })}
                   />
 
                   <Select
+                    sx={{
+                      maxHeight: '2.5rem',
+                    }}
                     id="passport-nationality-id"
                     labelId="passport-nationality-label"
                     label={t('input.passportNationality')}
-                    value=""
+                    displayEmpty
+                    defaultValue=""
                     {...register('passportNationality', {
                       required: false,
                     })}
+                    renderValue={(selected: any) => {
+                      if (!selected || selected.length === 0) {
+                        return t('input.passportNationality')
+                      }
+                      return getName(selected, i18n.language)
+                    }}
                   >
+                    <MenuItem disabled value="">
+                      {t('input.passportNationality')}
+                    </MenuItem>
                     {Object.keys(getAlpha2Codes()).map((countryAlpha2Code) => (
                       <MenuItem
                         key={countryAlpha2Code}
-- 
GitLab