{"version":3,"file":"registerWithMask.cjs","sources":["../../../../../src/utilities/formatters/util/registerWithMask.ts"],"sourcesContent":["import type { ChangeEvent, KeyboardEventHandler } from \"react\";\nimport type {\n    FieldValues,\n    Path,\n    PathValue,\n    RegisterOptions,\n    UseFormRegisterReturn,\n    UseFormReturn,\n} from \"react-hook-form\";\nimport { formatDateString } from \"../date/formatDate.js\";\nimport { formatFodselsnummer } from \"../fodselsnummer/formatFodselsnummer.js\";\nimport { formatKontonummer } from \"../kontonummer/formatKontonummer.js\";\nimport { formatKortnummer } from \"../kortnummer/formatKortnummer.js\";\nimport { formatOrganisasjonsnummer } from \"../organisasjonsnummer/formatOrganisasjonsnummer.js\";\nimport { formatTelefonnummer } from \"../telefonnummer/formatTelefonnummer.js\";\nimport { formatNumber } from \"./formatNumber.js\";\n\nconst formatters = {\n    date: formatDateString,\n    fodselsnummer: formatFodselsnummer,\n    kortnummer: formatKortnummer,\n    kontonummer: formatKontonummer,\n    telefonnummer: formatTelefonnummer,\n    number: formatNumber,\n    organisasjonsnummer: formatOrganisasjonsnummer,\n};\nexport type Formatter = keyof typeof formatters;\n\nexport type RegisterWithMaskOptions<T extends FieldValues> = Omit<\n    RegisterOptions<T>,\n    \"setValueAs\"\n>;\n\nconst registerWithMask =\n    (formatter: Formatter) =>\n    <T extends FieldValues>(\n        form: UseFormReturn<T>,\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ) => {\n        let onKeyDownCaretPosition = 0;\n        let onKeyDownKeyPressed = \"\";\n\n        const setValueAs = (value: string) => value.replace(/\\s/g, \"\");\n        const onChange = (event: ChangeEvent<HTMLInputElement>) => {\n            options?.onChange?.(event);\n\n            // save some values before event.target.value change\n            let onChangeCaretPosition = 0;\n            const inputLength = event.target.value.length;\n\n            // type checking formalities\n            if (event.target.selectionStart !== null) {\n                onChangeCaretPosition = event.target.selectionStart;\n            }\n\n            form.setValue(\n                name,\n                formatters[formatter](event.target.value, {\n                    partial: true,\n                }) as PathValue<T, Path<T>>,\n            );\n\n            let newPosition: number | null = null;\n\n            if ([\"Delete\", \"Backspace\"].includes(onKeyDownKeyPressed)) {\n                // handle removing content\n                // calculate how much to move the caret, this also accounts for removing sections of text\n                const delta = onKeyDownCaretPosition - onChangeCaretPosition;\n\n                // calculate new caret position (- because we move backwards)\n                newPosition = onKeyDownCaretPosition - delta;\n            } else if (onChangeCaretPosition < event.target.value.length) {\n                // handle adding content from inside the string\n                // calculate how much to move the caret forwards\n                const delta = event.target.value.length - inputLength;\n\n                // calculate new caret position (+ because we move forwards)\n                newPosition = onChangeCaretPosition + delta;\n            }\n\n            if (newPosition !== null) {\n                event.target.setSelectionRange(\n                    newPosition,\n                    newPosition,\n                    undefined,\n                );\n            }\n        };\n\n        const registerOptions: RegisterOptions<T, Path<T>> = {\n            setValueAs,\n            onChange,\n        };\n        if (options) {\n            Object.assign(registerOptions, options);\n        }\n        const register = form.register(name, registerOptions);\n\n        // save the caret position before the change occured\n        const onKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n            if ((event.target as HTMLInputElement).selectionStart !== null) {\n                onKeyDownCaretPosition = (event.target as HTMLInputElement)\n                    .selectionStart as number;\n            }\n            onKeyDownKeyPressed = event.key;\n        };\n\n        // add onKeyDown event handler to the registered input\n        const extra: Record<string, unknown> = {\n            onKeyDown,\n        };\n\n        if (formatter === \"number\") {\n            extra.align = \"right\"; // Se https://github.com/fremtind/jokul/pull/2898\n        }\n\n        return Object.assign(register, extra);\n    };\n\n/** @deprecated Bruk `registerWithMasks` i stedet */\nexport const registerWithFodselsnummerMask = registerWithMask(\"fodselsnummer\");\n/** @deprecated Bruk `registerWithMasks` i stedet */\nexport const registerWithKortnummerMask = registerWithMask(\"kortnummer\");\n/** @deprecated Bruk `registerWithMasks` i stedet */\nexport const registerWithKontonummerMask = registerWithMask(\"kontonummer\");\n/** @deprecated Bruk `registerWithMasks` i stedet */\nexport const registerWithTelefonnummerMask = registerWithMask(\"telefonnummer\");\n\n/**\n * Hjelpefunksjon for React Hook Form som lar deg bruke formateringsfunksjonene i denne pakken som inputmasker.\n */\nexport const registerWithMasks = <T extends FieldValues>(\n    form: UseFormReturn<T>,\n) => ({\n    registerWithFodselsnummerMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"fodselsnummer\")<T>(form, name, options),\n    registerWithKortnummerMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"kortnummer\")<T>(form, name, options),\n    registerWithKontonummerMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"kontonummer\")<T>(form, name, options),\n    registerWithTelefonnummerMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"telefonnummer\")<T>(form, name, options),\n    registerWithOrganisasjonsnummerMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"organisasjonsnummer\")<T>(form, name, options),\n    registerWithDateMask: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn =>\n        registerWithMask(\"date\")<T>(form, name, options),\n    registerWithNumber: (\n        name: Path<T>,\n        options?: RegisterWithMaskOptions<T>,\n    ): UseFormRegisterReturn & { align: \"right\" } =>\n        registerWithMask(\"number\")<T>(\n            form,\n            name,\n            options,\n        ) as unknown as UseFormRegisterReturn & {\n            align: \"right\";\n        },\n});\n"],"names":["formatters","date","formatDateString","fodselsnummer","formatFodselsnummer","kortnummer","formatKortnummer","kontonummer","formatKontonummer","telefonnummer","formatTelefonnummer","number","formatNumber","organisasjonsnummer","formatOrganisasjonsnummer","registerWithMask","formatter","form","name","options","onKeyDownCaretPosition","onKeyDownKeyPressed","registerOptions","setValueAs","value","replace","onChange","event","onChangeCaretPosition","inputLength","target","length","selectionStart","setValue","partial","newPosition","includes","setSelectionRange","Object","assign","register","extra","onKeyDown","key","align","registerWithFodselsnummerMask","registerWithKortnummerMask","registerWithKontonummerMask","registerWithTelefonnummerMask","registerWithOrganisasjonsnummerMask","registerWithDateMask","registerWithNumber"],"mappings":"0aAiBMA,EAAa,CACfC,KAAMC,EAAAA,iBACNC,cAAeC,EAAAA,oBACfC,WAAYC,EAAAA,iBACZC,YAAaC,EAAAA,kBACbC,cAAeC,EAAAA,oBACfC,OAAQC,EAAAA,aACRC,oBAAqBC,EAAAA,2BASnBC,EACDC,GACD,CACIC,EACAC,EACAC,KAEA,IAAIC,EAAyB,EACzBC,EAAsB,GAiD1B,MAAMC,EAA+C,CACjDC,WAhDgBC,GAAkBA,EAAMC,QAAQ,MAAO,IAiDvDC,SAhDcC,IACdR,GAASO,WAAWC,GAGpB,IAAIC,EAAwB,EAC5B,MAAMC,EAAcF,EAAMG,OAAON,MAAMO,OAGH,OAAhCJ,EAAMG,OAAOE,iBACbJ,EAAwBD,EAAMG,OAAOE,gBAGzCf,EAAKgB,SACDf,EACAlB,EAAWgB,GAAWW,EAAMG,OAAON,MAAO,CACtCU,SAAS,KAIjB,IAAIC,EAA6B,KAEjC,GAAI,CAAC,SAAU,aAAaC,SAASf,GAAsB,CAMvDc,EAAcf,GAHAA,EAAyBQ,EAI3C,MAAA,GAAWA,EAAwBD,EAAMG,OAAON,MAAMO,OAAQ,CAM1DI,EAAcP,GAHAD,EAAMG,OAAON,MAAMO,OAASF,EAI9C,CAEoB,OAAhBM,GACAR,EAAMG,OAAOO,kBACTF,EACAA,OACA,KASRhB,GACAmB,OAAOC,OAAOjB,EAAiBH,GAEnC,MAAMqB,EAAWvB,EAAKuB,SAAStB,EAAMI,GAY/BmB,EAAiC,CACnCC,UAVuDf,IACG,OAArDA,EAAMG,OAA4BE,iBACnCZ,EAA0BO,EAAMG,OAC3BE,gBAETX,EAAsBM,EAAMgB,MAQhC,MAAkB,WAAd3B,IACAyB,EAAMG,MAAQ,SAGXN,OAAOC,OAAOC,EAAUC,IAI1BI,EAAgC9B,EAAiB,iBAEjD+B,EAA6B/B,EAAiB,cAE9CgC,EAA8BhC,EAAiB,eAE/CiC,EAAgCjC,EAAiB,8JAM1DE,IAAAA,CAEA4B,8BAA+B,CAC3B3B,EACAC,IAEAJ,EAAiB,gBAAjBA,CAAqCE,EAAMC,EAAMC,GACrD2B,2BAA4B,CACxB5B,EACAC,IAEAJ,EAAiB,aAAjBA,CAAkCE,EAAMC,EAAMC,GAClD4B,4BAA6B,CACzB7B,EACAC,IAEAJ,EAAiB,cAAjBA,CAAmCE,EAAMC,EAAMC,GACnD6B,8BAA+B,CAC3B9B,EACAC,IAEAJ,EAAiB,gBAAjBA,CAAqCE,EAAMC,EAAMC,GACrD8B,oCAAqC,CACjC/B,EACAC,IAEAJ,EAAiB,sBAAjBA,CAA2CE,EAAMC,EAAMC,GAC3D+B,qBAAsB,CAClBhC,EACAC,IAEAJ,EAAiB,OAAjBA,CAA4BE,EAAMC,EAAMC,GAC5CgC,mBAAoB,CAChBjC,EACAC,IAEAJ,EAAiB,SAAjBA,CACIE,EACAC,EACAC"}