diff --git a/src/components/AddressEdit/AddressEdit.tsx b/src/components/AddressEdit/AddressEdit.tsx index 8c0aa1d62..8971f4132 100644 --- a/src/components/AddressEdit/AddressEdit.tsx +++ b/src/components/AddressEdit/AddressEdit.tsx @@ -77,7 +77,9 @@ const AddressEdit: React.FC = props => { } = props; const classes = useStyles(props); const intl = useIntl(); - const { areas, isFieldAllowed } = useAddressValidation(data.country); + const { areas, isFieldAllowed, getDisplayValue } = useAddressValidation( + data.country, + ); const formErrors = getFormErrors< keyof AddressTypeInput, @@ -269,7 +271,7 @@ const AddressEdit: React.FC = props => { disabled={disabled} autocomplete="new-password" data-test-id="address-edit-country-area-field" - displayValue={data.countryArea} + displayValue={getDisplayValue(data.countryArea)} error={!!formErrors.countryArea} helperText={getErrorMessage(formErrors.countryArea, intl)} label={intl.formatMessage({ diff --git a/src/components/AddressEdit/useAddressValidation.test.ts b/src/components/AddressEdit/useAddressValidation.test.ts index 728d38afc..38cef81cd 100644 --- a/src/components/AddressEdit/useAddressValidation.test.ts +++ b/src/components/AddressEdit/useAddressValidation.test.ts @@ -51,8 +51,8 @@ describe("useAddressValidation", () => { // Assert expect(current.areas).toEqual([ - { label: "Alabama", value: "Alabama" }, - { label: "Ancona", value: "Ancona" }, + { label: "Alabama", value: "Alabama", raw: "AL" }, + { label: "Ancona", value: "Ancona", raw: "AN" }, ]); expect(current.loading).toBeFalsy(); expect(useAddressValidationRulesQuery).toBeCalledWith({ diff --git a/src/components/AddressEdit/useAddressValidation.ts b/src/components/AddressEdit/useAddressValidation.ts index b352996ce..ca051b745 100644 --- a/src/components/AddressEdit/useAddressValidation.ts +++ b/src/components/AddressEdit/useAddressValidation.ts @@ -5,10 +5,17 @@ import { } from "@saleor/graphql"; import { ChoiceValue } from "@saleor/sdk/dist/apollo/types"; -const prepareChoices = (values: ChoiceValue[]) => +interface AreaChoices { + label: string; + value: string; + raw: string; +} + +const prepareChoices = (values: ChoiceValue[]): AreaChoices[] => values.map(v => ({ label: v.verbose, value: v.verbose, + raw: v.raw, })); const selectRules = (data: AddressValidationRulesQuery) => @@ -45,14 +52,33 @@ const useAllowedFields = (data: AddressValidationRulesQuery) => { return { isAllowed }; }; +const useDisplayValues = (areas: AreaChoices[]) => { + const isProvinceCode = (code: string) => + code.length === 2 && code.toLocaleUpperCase() === code; + + const getDisplayValue = (value: string) => { + if (isProvinceCode(value)) { + const area = areas.find(area => area.raw === value); + + return area.value; + } + + return value; + }; + + return { getDisplayValue }; +}; + export const useAddressValidation = (country?: string) => { const { data, loading } = useValidationRules(country); const areas = useAreas(data); const { isAllowed } = useAllowedFields(data); + const { getDisplayValue } = useDisplayValues(areas); return { areas, isFieldAllowed: isAllowed, + getDisplayValue, loading, }; }; diff --git a/src/components/CompanyAddressInput/CompanyAddressForm.tsx b/src/components/CompanyAddressInput/CompanyAddressForm.tsx index ba307b0ad..aa07a8165 100644 --- a/src/components/CompanyAddressInput/CompanyAddressForm.tsx +++ b/src/components/CompanyAddressInput/CompanyAddressForm.tsx @@ -64,7 +64,9 @@ const CompanyAddressForm: React.FC = props => { onChange, onCountryChange, } = props; - const { areas, isFieldAllowed } = useAddressValidation(data.country); + const { areas, isFieldAllowed, getDisplayValue } = useAddressValidation( + data.country, + ); const classes = useStyles(props); const intl = useIntl(); @@ -200,7 +202,7 @@ const CompanyAddressForm: React.FC = props => { disabled={disabled} autocomplete="new-password" data-test-id="address-edit-country-area-field" - displayValue={data.countryArea} + displayValue={getDisplayValue(data.countryArea)} error={!!formErrors.countryArea} helperText={getErrorMessage(formErrors.countryArea, intl)} label={intl.formatMessage({ diff --git a/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx b/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx index f949dfa37..c07d724d3 100644 --- a/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx +++ b/src/siteSettings/components/SiteSettingsPage/SiteSettingsPage.tsx @@ -87,7 +87,7 @@ const SiteSettingsPage: React.FC = props => { const navigate = useNavigator(); const [displayCountry, setDisplayCountry] = useStateFromProps( - shop?.companyAddress?.country.code || "", + shop?.companyAddress?.country.country || "", ); const {