Appearance
Profile
Personal information, identity verification, and work permit management.
Route
/candidate-details/profile
Layout
The profile tab is the default view (activeTab={1}). It is split into two columns: a form and photo section on the left, and verification/work permit cards on the right.
The left column contains the profile photo component (UserPhoto with candidate-details preset) and the ProfileForm inside a SmallCard. The right column shows work permit cards, identity/address verification cards (when a primary nationality is set), additional nationality verification (when conditions are met), and a privacy policy disclaimer link to /std-terms-of-service.
Personal information
- First name (required, 2-56 chars; locked when
profileLockedFromNationalityVerifiedis true) - Last name (required, 2-56 chars; locked when
profileLockedFromNationalityVerifiedis true) - Date of birth (day/month/year dropdowns; locked when identity verification has started or been approved, or when not in edit mode)
- Worker code (read-only, system-generated)
- Organisation code (read-only)
Documentation
- Personal tax number (optional, 3-20 chars)
- Email (required; changing it requires password confirmation via
PasswordInputand triggers automatic logout) - Document type (read-only, from identity verification)
- Document expiration date (read-only, formatted with
formatDateRemundoStandard) - Identification number (read-only)
- Work location ISO (read-only, derived from current engagement's region or country via
currentEngagementstore) - Language (read-only, defaults to "English")
A "Renew password" link below the email field navigates to /renew-password.
Address and residency
- Primary nationality (required, country dropdown; locked when
profileLockedFromNationalityVerifiedis true) - Additional nationalities (read-only list of approved nationalities, displayed via
ComboboxCountrieswithreadonly={true}) - "Add additional nationality" link (visible when
allowAdditionalNationalitiessetting is enabled and primary nationality is verified) - Country of residence (required, country dropdown)
- Address autocomplete (
AddressSuggestionwith Google Places integration, visible in edit mode only; populates address, city, and postal code) - Address line (required, 1-56 chars)
- City (required, 1-56 chars)
- Postal code (required, 1-56 chars, alphanumeric only -- non-alphanumeric characters are stripped on input)
Contact
- Phone number (required, two parts: international dial code selector and number input via
PhoneDetailsMinTermscomponent) - Both dial code and number must be non-empty for validation to pass
Profile photo
- Upload from file (.png, .jpg) or camera capture via
UserPhotocomponent - HEIC files are converted to JPEG automatically
- Max file size: 1MB
- Remove option available
Form validation
The save button is disabled when:
- Any required field fails validation
- The form is currently submitting
- Email has been changed but no password is provided
Validation runs reactively as fields change. Postal code input is sanitized to only allow [a-zA-Z0-9'\- ].
Submission flow
- Click the pencil icon to enter edit mode
- Modify fields; validation errors display inline below each field
- If email is changed, a password input appears and must be filled
- On submit, Firebase user is updated first (display name and/or email), then
updateCandidateProfilesends the profile command - Polling via
pollingGetConditionwaits until theappliestimestamp is newer than the previous value - On success, the form exits edit mode and reloads with updated data
- If the email was changed, the user is automatically logged out
- On error, a notification is shown
Cancel reverts to the last saved state by resetting editingProfile from the profile object.
Identity and address verification
Two verification cards appear on the right side once a primary nationality is set (controlled by showVerificationCards):
- Identity verification via Idenfy KYC service
- Address verification via Idenfy
Each card shows a status via the VerificationCard component: action-required, processing, in-progress, failed, or verified. A "Validate" button launches the Idenfy verification flow with a confirmation modal (IdenfyConfirmationModal). The button is disabled based on the current verification status via Idenfy.disableLink.
Additional nationality verification
Appears after primary nationality is verified (when allowAdditionalNationalities setting is enabled and isNationalityVerified is true). The AdditionalVerificationCards component allows:
- Selecting a country from a dropdown (already-approved nationalities and the primary nationality are disabled in the list)
- Initiating a separate Idenfy verification process for that nationality
- A close button (X) to dismiss the card, unless a verification is already in progress
- The validate button is disabled when no country is selected, or when a verification is in a non-retryable state
Work permits
A WorkPermitCard is shown for each work permit on the profile, displaying:
- Document type
- Expiration date
- An expiry warning indicator:
- Green when more than 45 days remain
- Yellow when 45 days or fewer remain
- Red when expired
Real-time updates
The profile subscribes to WebSocket events via CandidateProfileToken scoped to the user ID. When a candidate-profile-updated event is received, the profile is re-fetched from the API and the page updates automatically. The WebSocket emitter is disposed on component destroy.
Error handling
If the initial profile load fails, a 404 page (pages-404) is shown with the header hidden.