{"mappings":"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","sources":["src/Components/Form/TenantEmailInput.tsx","src/Components/Form/useFormWithNestedErrors.tsx","src/Components/Form/TenantPhoneInput.tsx","src/Components/Form/TenantGrossIncomeInput.tsx","src/utils/validateCurrency.ts","src/Components/Form/TenantEmploymentInput.tsx","src/RentalServiceRequest/apiModels.ts","src/Components/Form/SelectFieldset.tsx"],"sourcesContent":["import React from 'react';\nimport { useResource } from '../ResourceText';\nimport { isValidEmail } from '../../InputValidators';\nimport { TextInput } from '@kojamo/lumo-dls';\nimport { FieldValues, Path, useFormContext } from 'react-hook-form';\nimport { useFormWithNestedErrors } from './useFormWithNestedErrors';\n\nexport function TenantEmailInput<T extends FieldValues>({\n\tfieldName,\n\tlabelResourceKey,\n\trequiredErrorResourceKey,\n\tformatErrorResourceKey,\n}: {\n\tfieldName: Path<T>;\n\tlabelResourceKey: string;\n\trequiredErrorResourceKey: string;\n\tformatErrorResourceKey: string;\n}) {\n\tconst { register } = useFormContext<T>();\n\tconst { hasErrors, hasErrorKey } = useFormWithNestedErrors(fieldName);\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<fieldset className=\"search-filters__fieldset\">\n\t\t\t<TextInput\n\t\t\t\ttype=\"email\"\n\t\t\t\tlabel={getResourceText(labelResourceKey)}\n\t\t\t\trequired\n\t\t\t\t{...register(fieldName, { required: true, validate: isValidEmail })}\n\t\t\t\terror={hasErrors}\n\t\t\t\tfootnote={\n\t\t\t\t\t(hasErrorKey(fieldName, 'required') && getResourceText(requiredErrorResourceKey)) ||\n\t\t\t\t\t(hasErrorKey(fieldName, 'validate') && getResourceText(formatErrorResourceKey))\n\t\t\t\t}\n\t\t\t/>\n\t\t</fieldset>\n\t);\n}\n","import { useMemo } from 'react';\nimport { FieldValues, Path, useFormContext } from 'react-hook-form';\n\nexport function useFormWithNestedErrors<T extends FieldValues>(fieldName: Path<T>) {\n\tconst {\n\t\t// @ts-expect-error FormState must be imported in order to subscribe to getFieldState() error handling.\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tformState: { errors },\n\t\tgetFieldState,\n\t} = useFormContext<T>();\n\n\tconst hasErrors = Boolean(getFieldState(fieldName).invalid);\n\n\tconst hasErrorKey = (fieldName: Path<T>, errorKey: string) => {\n\t\tconst error = getFieldState(fieldName).error;\n\t\treturn error?.type === errorKey;\n\t};\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\thasErrors,\n\t\t\thasErrorKey,\n\t\t}),\n\t\t[fieldName, getFieldState, hasErrors],\n\t);\n}\n\nexport function useFormFieldsHaveErrors<T extends FieldValues>(fieldNames: Path<T>[]) {\n\tconst {\n\t\t// @ts-expect-error FormState must be imported in order to subscribe to getFieldState() error handling.\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tformState: { errors },\n\t\tgetFieldState,\n\t} = useFormContext<T>();\n\n\treturn fieldNames.some((fieldName) => Boolean(getFieldState(fieldName).invalid));\n}\n","import React from 'react';\nimport { isValidPhoneNumber } from '../../InputValidators';\nimport { FieldValues, Path, useFormContext } from 'react-hook-form';\nimport { TextInput } from '@kojamo/lumo-dls';\nimport { useResource } from '../ResourceText';\nimport { useFormWithNestedErrors } from './useFormWithNestedErrors';\n\nexport function TenantPhoneInput<T extends FieldValues>({\n\tfieldName,\n\tlabelResourceKey,\n\trequiredErrorResourceKey,\n\tformatErrorResourceKey,\n}: {\n\tfieldName: Path<T>;\n\tlabelResourceKey: string;\n\trequiredErrorResourceKey: string;\n\tformatErrorResourceKey: string;\n}) {\n\tconst { register } = useFormContext<T>();\n\tconst { hasErrors, hasErrorKey } = useFormWithNestedErrors(fieldName);\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<fieldset className=\"search-filters__fieldset\">\n\t\t\t<TextInput\n\t\t\t\ttype=\"tel\"\n\t\t\t\tlabel={getResourceText(labelResourceKey)}\n\t\t\t\trequired\n\t\t\t\t{...register(fieldName, { required: true, validate: isValidPhoneNumber })}\n\t\t\t\terror={hasErrors}\n\t\t\t\tfootnote={\n\t\t\t\t\t(hasErrorKey(fieldName, 'required') && getResourceText(requiredErrorResourceKey)) ||\n\t\t\t\t\t(hasErrorKey(fieldName, 'validate') && getResourceText(formatErrorResourceKey))\n\t\t\t\t}\n\t\t\t/>\n\t\t</fieldset>\n\t);\n}\n","import React from 'react';\nimport { useResource } from '../ResourceText';\nimport { TextInput } from '@kojamo/lumo-dls';\nimport { FieldValues, Path, useFormContext } from 'react-hook-form';\nimport { useFormWithNestedErrors } from './useFormWithNestedErrors';\nimport { validateCurrency } from '../../utils/validateCurrency';\n\nexport function TenantGrossIncomeInput<T extends FieldValues>({\n\tfieldName,\n\tlabelResourceKey,\n\trequiredErrorResourceKey,\n\tcurrencyErrorResourceKey,\n}: {\n\tfieldName: Path<T>;\n\tlabelResourceKey: string;\n\trequiredErrorResourceKey: string;\n\tcurrencyErrorResourceKey: string;\n}) {\n\tconst { register } = useFormContext<T>();\n\tconst { hasErrors, hasErrorKey } = useFormWithNestedErrors(fieldName);\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<fieldset className=\"search-filters__fieldset\">\n\t\t\t<TextInput\n\t\t\t\ttype=\"text\"\n\t\t\t\tlabel={getResourceText(labelResourceKey)}\n\t\t\t\trequired\n\t\t\t\t{...register(fieldName, { required: true, validate: validateCurrency })}\n\t\t\t\terror={hasErrors}\n\t\t\t\tfootnote={\n\t\t\t\t\t(hasErrorKey(fieldName, 'required') && getResourceText(requiredErrorResourceKey)) ||\n\t\t\t\t\t(hasErrorKey(fieldName, 'validate') && getResourceText(currencyErrorResourceKey))\n\t\t\t\t}\n\t\t\t/>\n\t\t</fieldset>\n\t);\n}\n","export function validateCurrency(controlValue: string) {\n\t// The pattern accepts typical currency formats, such as:\n\t// 100 000,00\n\t// 1 000\n\t// 1000\n\t// 1000,00\n\tconst currencyPattern = /^\\d{0,3}[ ]?\\d{1,3}(,\\d{1,2})?$/;\n\n\tif (!controlValue) {\n\t\treturn false;\n\t}\n\n\tconst matches = controlValue.match(currencyPattern);\n\n\tif (!matches) {\n\t\treturn false;\n\t}\n\n\treturn matches.length > 0;\n}\n","import React from 'react';\nimport { useResource } from '../ResourceText';\nimport { FieldValues, Path } from 'react-hook-form';\nimport { EmploymentStatus } from '../../RentalServiceRequest/apiModels';\nimport { SelectField } from './SelectFieldset';\n\nconst employmentStatusOptions = [\n\t{ value: EmploymentStatus.Employed, label: 'ApartmentSearch_HouseholdDetails_Employment_EmployedOption' },\n\t{ value: EmploymentStatus.Unemployed, label: 'ApartmentSearch_HouseholdDetails_Employment_UnemployedOption' },\n\t{ value: EmploymentStatus.Student, label: 'ApartmentSearch_HouseholdDetails_Employment_StudentOption' },\n\t{ value: EmploymentStatus.Retired, label: 'ApartmentSearch_HouseholdDetails_Employment_RetiredOption' },\n];\n\nexport function TenantEmploymentInput<T extends FieldValues>({\n\tfieldName,\n\tlabelResourceKey,\n\trequiredErrorResourceKey,\n}: {\n\tfieldName: Path<T>;\n\tlabelResourceKey: string;\n\trequiredErrorResourceKey: string;\n}) {\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<fieldset className=\"search-filters__fieldset\">\n\t\t\t<SelectField<T>\n\t\t\t\tfieldName={fieldName}\n\t\t\t\tlabelResourceKey={labelResourceKey}\n\t\t\t\trequiredErrorResourceKey={requiredErrorResourceKey}\n\t\t\t\tregisterOptions={{ required: true }}\n\t\t\t>\n\t\t\t\t<option value=\"\"></option>\n\t\t\t\t{employmentStatusOptions.map((option, index) => (\n\t\t\t\t\t<option key={index} value={option.value}>\n\t\t\t\t\t\t{getResourceText(option.label)}\n\t\t\t\t\t</option>\n\t\t\t\t))}\n\t\t\t</SelectField>\n\t\t</fieldset>\n\t);\n}\n","import { ApartmentSearchCriteriaBodyAM } from '../Apartments/Api/ApartmentSearchCriteriaAM';\nimport { SearchWatchIdentificationResult } from '../SearchWatch/searchWatchState';\nimport { RentalServiceRequestTenantInfoAIM } from './Components/Api/RentalServiceRequestTenantInfoAIM';\n\nexport interface RentalServiceRequestPhase1Info {\n\tcriteria?: ApartmentSearchCriteriaBodyAM;\n\testimatedContractDuration: EstimatedContractDuration;\n\timmediateApartmentNeed?: boolean;\n\tapartmentNeededFrom?: Date;\n\tadditionalInformation?: string;\n}\n\nexport type RentalServiceRequestAIM = RentalServiceRequestPhase1Info &\n\tRentalServiceRequestTenantInfoAIM & {\n\t\tisIdentified: boolean;\n\t};\n\nexport type RentalServiceRequestIdentificationRequest = RentalServiceRequestPhase1Info & { language: 'fi' | 'en' };\n\nexport type RentalServiceRequestIdentificationResponse = RentalServiceRequestIdentificationRequest & {\n\tidentificationResult: SearchWatchIdentificationResult;\n};\n\nexport const enum EmploymentStatus {\n\tEmployed = 'Employed',\n\tUnemployed = 'Unemployed',\n\tStudent = 'Student',\n\tRetired = 'Retired',\n}\n\nexport const enum EstimatedContractDuration {\n\tNotSet = 'NotSet',\n\tUnderOneYear = 'UnderOneYear',\n\tOneToThreeYears = 'OneToThreeYears',\n\tThreeToFiveYears = 'ThreeToFiveYears',\n\tOverFiveYears = 'OverFiveYears',\n}\n","import React from 'react';\nimport { useResource } from '../ResourceText';\nimport { Select } from '@kojamo/lumo-dls';\nimport { FieldValues, Path, RegisterOptions, useFormContext } from 'react-hook-form';\nimport { useFormWithNestedErrors } from './useFormWithNestedErrors';\n\nexport function SelectField<T extends FieldValues>({\n\tfieldName,\n\tlabelResourceKey,\n\trequiredErrorResourceKey,\n\tregisterOptions,\n\tchildren,\n}: {\n\tfieldName: Path<T>;\n\tlabelResourceKey: string;\n\trequiredErrorResourceKey: string;\n\tregisterOptions?: RegisterOptions<T, Path<T>>;\n\tchildren: React.ReactNode;\n}) {\n\tconst { register } = useFormContext<T>();\n\tconst { hasErrors, hasErrorKey } = useFormWithNestedErrors(fieldName);\n\tconst { getResourceText } = useResource();\n\n\treturn (\n\t\t<Select\n\t\t\tlabel={getResourceText(labelResourceKey)}\n\t\t\trequired\n\t\t\t{...register(fieldName, registerOptions)}\n\t\t\terror={hasErrors}\n\t\t\tfootnote={hasErrorKey(fieldName, 'required') && getResourceText(requiredErrorResourceKey)}\n\t\t>\n\t\t\t{children}\n\t\t</Select>\n\t);\n}\n"],"names":["$ed3kz","parcelRequire","TenantEmailInput","fieldName","labelResourceKey","requiredErrorResourceKey","formatErrorResourceKey","register","useFormContext","hasErrors","hasErrorKey","useFormWithNestedErrors","getResourceText","useResource","jsx","className","$icxVu","TextInput","type","label","required","validate","isValidEmail","error","footnote","$iU6fI","formState","errors","getFieldState","Boolean","invalid","errorKey","useMemo","useFormFieldsHaveErrors","fieldNames","some","TenantPhoneInput","isValidPhoneNumber","TenantGrossIncomeInput","currencyErrorResourceKey","validateCurrency","controlValue","matches","match","length","employmentStatusOptions","value","EmploymentStatus","Employed","Unemployed","Student","Retired","TenantEmploymentInput","jsxs","$kvIoY","SelectField","registerOptions","map","option","index","$db665cd6e7848237$export$978d240f447d4ef2","$db665cd6e7848237$export$cd96b390cbd0bf41","EstimatedContractDuration","NotSet","UnderOneYear","OneToThreeYears","ThreeToFiveYears","OverFiveYears","children","Select"],"version":3,"file":"DirectRental.910c6e07.js.map"}