Files
web/packages/design-system/lib/components/Form/Country/CountrySelect.tsx
Bianca Widstam 5f2e215508 Merged in fix/SW-2188-disable-fields-logged-in-user-enter-details (pull request #2595)
fix(SW-2188): disable enter details fields when logged in

* fix(SW-2188): disable enter details fields when logged in


Approved-by: Anton Gunnarsson
2025-08-05 11:54:41 +00:00

73 lines
1.8 KiB
TypeScript

'use client'
import { useMemo } from 'react'
import { useController } from 'react-hook-form'
import { Select } from '../../Select'
import { ErrorMessage } from '../ErrorMessage'
import type { CountryProps } from './country'
const prioCountryCode = ['DE', 'DK', 'FI', 'NO', 'SE']
export default function CountrySelect({
className = '',
errorMessage,
label,
countries,
lang = 'en',
name = 'country',
disabled = false,
registerOptions = {},
}: CountryProps) {
const { field, formState, fieldState } = useController({
name,
rules: registerOptions,
})
const items = useMemo(() => {
function mapCountry(country: (typeof countries)[number]) {
return {
value: country.code,
label: country.displayName || country.name,
}
}
const collator = new Intl.Collator(lang)
const prioCountries = countries
.filter((c) => prioCountryCode.includes(c.code))
.map(mapCountry)
.sort((a, b) => collator.compare(a.label, b.label))
const restCountries = countries
.filter((c) => !prioCountryCode.includes(c.code))
.map(mapCountry)
.sort((a, b) => collator.compare(a.label, b.label))
return [...prioCountries, ...restCountries]
}, [lang, countries])
return (
<div className={className}>
<Select
items={items}
label={label}
isDisabled={disabled}
isRequired={Boolean(registerOptions?.required)}
isInvalid={fieldState.invalid}
name={name}
onBlur={field.onBlur}
onSelectionChange={(c) => field.onChange(c ?? '')}
selectedKey={field.value}
data-testid={name}
/>
<ErrorMessage
errors={formState.errors}
name={name}
messageLabel={errorMessage}
/>
</div>
)
}