import * as countryCodes from "country-codes-list"; import { Context } from "koa"; import { FieldTypes as SealiousFieldTypes } from "sealious"; import { FormControl } from "../controls/controls.js"; import { Hybrid } from "../controls/hybrid.js"; import { FormDataValue } from "../form-types.js"; import { FieldParseResult, FormField } from "./field.js"; import { PickFromListField } from "./pick-from-list.js"; import { PhoneNumberWithoutCountryCode } from "./phone-number.js"; import { FormControlContext } from "../../index.js"; export class PhoneNumberWithCountryCode< Required extends boolean, > extends FormField { public getEmptyValue(): SealiousFieldTypes.PhoneNumberValue { return new SealiousFieldTypes.PhoneNumberValue("48", "0000000"); } async parse( ctx: Context, raw_value: FormDataValue ): Promise> { try { return { parsable: true, parsed_value: SealiousFieldTypes.PhoneNumberValue.fromInput( ctx.$context, raw_value ), error: null, }; } catch (e) { return { parsable: false, parsed_value: null, // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access error: e.message as string, }; } } getControl(): FormControl { return new Hybrid(this, { country_code: new PickFromListField(this.required, async () => countryCodes .all() .sort((a, b) => a.countryCallingCode < b.countryCallingCode ? -1 : 1 ) .map((code) => ({ value: code.countryCallingCode, label: "+" + code.countryCallingCode + " " + code.flag, })) ).setLabel("Country code"), number: new PhoneNumberWithoutCountryCode(this.required).setLabel( "Phone number" ), }); } async getSealiousCreateValue(fctx: FormControlContext): Promise { const { parsed } = await this.getParsedValue( fctx.ctx, fctx.data.raw_values ); if (!parsed) { return ""; } return parsed.toString(); } async sealiousValueToForm( ctx: Context, sealiousValue: SealiousFieldTypes.PhoneNumberValue | null ): Promise { return sealiousValue ? { country_code: sealiousValue.country_code, number: sealiousValue.number, } : {}; } }