use-mask-input 3.7.2 → 3.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,36 +1,26 @@
1
1
  'use strict';
2
2
 
3
- var chunkNIHSNNRR_cjs = require('./chunk-NIHSNNRR.cjs');
3
+ var chunkVK6LQ75W_cjs = require('./chunk-VK6LQ75W.cjs');
4
4
  var react = require('react');
5
5
 
6
6
  function useMaskInput(props) {
7
7
  const { mask, register, options } = props;
8
8
  const ref = react.useRef(null);
9
- const maskInput = react.useMemo(
10
- () => chunkNIHSNNRR_cjs.isServer_default ? null : chunkNIHSNNRR_cjs.createMaskInstance(mask, options),
11
- [mask, options]
12
- );
9
+ const maskRef = react.useRef(mask);
10
+ const optionsRef = react.useRef(options);
13
11
  const refCallback = react.useCallback((input) => {
14
12
  if (!input) {
15
13
  ref.current = null;
16
14
  return;
17
15
  }
18
- ref.current = chunkNIHSNNRR_cjs.resolveInputRef(input);
16
+ ref.current = chunkVK6LQ75W_cjs.resolveInputRef(input);
17
+ chunkVK6LQ75W_cjs.withMask(maskRef.current, optionsRef.current)(ref.current);
19
18
  }, []);
20
19
  react.useEffect(() => {
21
- if (chunkNIHSNNRR_cjs.isServer_default || !ref.current) return;
22
- if (!chunkNIHSNNRR_cjs.isHTMLElement(ref.current)) {
23
- return;
24
- }
25
- const inputElement = chunkNIHSNNRR_cjs.findInputElement(ref.current);
26
- if (maskInput && inputElement && chunkNIHSNNRR_cjs.isHTMLElement(inputElement)) {
27
- maskInput.mask(inputElement);
28
- }
29
- if (register && chunkNIHSNNRR_cjs.isHTMLElement(ref.current)) {
30
- register(ref.current);
31
- }
32
- }, [mask, register, options, maskInput]);
33
- if (chunkNIHSNNRR_cjs.isServer_default) {
20
+ if (chunkVK6LQ75W_cjs.isServer_default || !ref.current || !register) return;
21
+ register(ref.current);
22
+ }, [register]);
23
+ if (chunkVK6LQ75W_cjs.isServer_default) {
34
24
  return () => {
35
25
  };
36
26
  }
@@ -43,49 +33,27 @@ function useHookFormMask(registerFn) {
43
33
  if (!registerFn) throw new Error("registerFn is required");
44
34
  const registerReturn = registerFn(fieldName, options);
45
35
  const { ref } = registerReturn;
46
- const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey(fieldName, mask);
36
+ const cacheKey = chunkVK6LQ75W_cjs.makeMaskCacheKey(fieldName, mask);
47
37
  if (!refCache2.has(cacheKey)) {
48
38
  const applyMaskToRef = (_ref) => {
49
- if (_ref) chunkNIHSNNRR_cjs.applyMaskToElement(_ref, mask, options);
39
+ if (_ref) chunkVK6LQ75W_cjs.applyMaskToElement(_ref, mask, options);
50
40
  return _ref;
51
41
  };
52
42
  refCache2.set(
53
43
  cacheKey,
54
- ref ? chunkNIHSNNRR_cjs.flow(applyMaskToRef, ref) : applyMaskToRef
44
+ ref ? chunkVK6LQ75W_cjs.flow(applyMaskToRef, ref) : applyMaskToRef
55
45
  );
56
46
  }
57
47
  const result = {
58
48
  ...registerReturn,
59
49
  ref: refCache2.get(cacheKey)
60
50
  };
61
- chunkNIHSNNRR_cjs.setPrevRef(result, ref);
51
+ chunkVK6LQ75W_cjs.setPrevRef(result, ref);
62
52
  return result;
63
53
  };
64
54
  }, [registerFn]);
65
55
  }
66
56
 
67
- // src/api/withMask.ts
68
- var import_inputmask = chunkNIHSNNRR_cjs.__toESM(chunkNIHSNNRR_cjs.require_inputmask(), 1);
69
- var callbackCache = /* @__PURE__ */ new Map();
70
- function withMask(mask, options) {
71
- if (!options) {
72
- const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey("", mask);
73
- if (callbackCache.has(cacheKey)) {
74
- return callbackCache.get(cacheKey);
75
- }
76
- }
77
- const callback = (input) => {
78
- if (chunkNIHSNNRR_cjs.isServer_default || mask === null || !input) return;
79
- const maskInput = chunkNIHSNNRR_cjs.interopDefaultSync(import_inputmask.default)(chunkNIHSNNRR_cjs.getMaskOptions(mask, options));
80
- maskInput.mask(input);
81
- };
82
- if (!options) {
83
- const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey("", mask);
84
- callbackCache.set(cacheKey, callback);
85
- }
86
- return callback;
87
- }
88
-
89
57
  // src/api/withHookFormMask.ts
90
58
  var refCache = /* @__PURE__ */ new WeakMap();
91
59
  function withHookFormMask(register, mask, options) {
@@ -95,35 +63,38 @@ function withHookFormMask(register, mask, options) {
95
63
  ...register,
96
64
  ref: null
97
65
  };
98
- chunkNIHSNNRR_cjs.setPrevRef(result2, ref);
66
+ chunkVK6LQ75W_cjs.setPrevRef(result2, ref);
99
67
  return result2;
100
68
  }
101
69
  if (!refCache.has(ref)) {
102
70
  refCache.set(ref, /* @__PURE__ */ new Map());
103
71
  }
104
72
  const maskCache = refCache.get(ref);
105
- const cacheKey = chunkNIHSNNRR_cjs.makeMaskCacheKey(register.name, mask);
73
+ const cacheKey = chunkVK6LQ75W_cjs.makeMaskCacheKey(register.name, mask);
106
74
  if (!maskCache?.has(cacheKey)) {
107
75
  const applyMaskToRef = (_ref) => {
108
- if (_ref) chunkNIHSNNRR_cjs.applyMaskToElement(_ref, mask, options);
76
+ if (_ref) chunkVK6LQ75W_cjs.applyMaskToElement(_ref, mask, options);
109
77
  return _ref;
110
78
  };
111
79
  maskCache?.set(
112
80
  cacheKey,
113
- chunkNIHSNNRR_cjs.flow(applyMaskToRef, ref)
81
+ chunkVK6LQ75W_cjs.flow(applyMaskToRef, ref)
114
82
  );
115
83
  }
116
84
  const result = {
117
85
  ...register,
118
86
  ref: maskCache?.get(cacheKey)
119
87
  };
120
- chunkNIHSNNRR_cjs.setPrevRef(result, ref);
88
+ chunkVK6LQ75W_cjs.setPrevRef(result, ref);
121
89
  return result;
122
90
  }
123
91
 
92
+ Object.defineProperty(exports, "withMask", {
93
+ enumerable: true,
94
+ get: function () { return chunkVK6LQ75W_cjs.withMask; }
95
+ });
124
96
  exports.useHookFormMask = useHookFormMask;
125
97
  exports.useMaskInput = useMaskInput;
126
98
  exports.withHookFormMask = withHookFormMask;
127
- exports.withMask = withMask;
128
99
  //# sourceMappingURL=index.cjs.map
129
100
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withMask.ts","../src/api/withHookFormMask.ts"],"names":["useRef","useMemo","isServer_default","createMaskInstance","useCallback","resolveInputRef","useEffect","isHTMLElement","findInputElement","refCache","makeMaskCacheKey","applyMaskToElement","flow","setPrevRef","__toESM","require_inputmask","interopDefaultSync","inputmask","getMaskOptions","result"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport {\n createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,\n} from '../core';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskInput = useMemo(\n () => (isServer ? null : createMaskInstance(mask, options)),\n [mask, options],\n );\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current) return;\n\n if (!isHTMLElement(ref.current)) {\n return;\n }\n\n const inputElement = findInputElement(ref.current);\n\n if (maskInput && inputElement && isHTMLElement(inputElement)) {\n maskInput.mask(inputElement);\n }\n\n if (register && isHTMLElement(ref.current)) {\n register(ref.current);\n }\n }, [mask, register, options, maskInput]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","/* eslint-disable import-x/no-extraneous-dependencies */\nimport inputmask from 'inputmask';\n\nimport { getMaskOptions } from '../core/maskConfig';\nimport { makeMaskCacheKey } from '../utils';\nimport isServer from '../utils/isServer';\nimport interopDefaultSync from '../utils/moduleInterop';\n\nimport type { Input, Mask, Options } from '../types';\n\nconst callbackCache = new Map<string, (input: Input | null) => void>();\n\n/**\n * Higher-order function that creates a ref callback for applying input masks.\n * Simple function to apply mask via ref. No hooks, no drama.\n *\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A ref callback function that applies the mask\n */\nexport default function withMask(mask: Mask, options?: Options): ((input: Input | null) => void) {\n // without options, we cant cache, so we always return a fresh callback. :P\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n if (callbackCache.has(cacheKey)) {\n return callbackCache.get(cacheKey) as (input: Input | null) => void;\n }\n }\n\n const callback = (input: Input | null): void => {\n if (isServer || mask === null || !input) return;\n\n const maskInput = interopDefaultSync(inputmask)(getMaskOptions(mask, options));\n maskInput.mask(input as HTMLElement);\n };\n\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n callbackCache.set(cacheKey, callback);\n }\n\n return callback;\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withHookFormMask.ts"],"names":["useRef","useCallback","resolveInputRef","withMask","useEffect","isServer_default","useMemo","refCache","makeMaskCacheKey","applyMaskToElement","flow","setPrevRef","result"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n withMask(maskRef.current, optionsRef.current)(ref.current);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current || !register) return;\n register(ref.current);\n }, [register]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
package/dist/index.js CHANGED
@@ -1,33 +1,24 @@
1
- import { __toESM, require_inputmask, isServer_default, createMaskInstance, resolveInputRef, isHTMLElement, findInputElement, makeMaskCacheKey, flow, setPrevRef, applyMaskToElement, interopDefaultSync, getMaskOptions } from './chunk-FDD3PKBM.js';
2
- import { useRef, useMemo, useCallback, useEffect } from 'react';
1
+ import { resolveInputRef, withMask, isServer_default, makeMaskCacheKey, flow, setPrevRef, applyMaskToElement } from './chunk-QCWLMMDI.js';
2
+ export { withMask } from './chunk-QCWLMMDI.js';
3
+ import { useRef, useCallback, useEffect, useMemo } from 'react';
3
4
 
4
5
  function useMaskInput(props) {
5
6
  const { mask, register, options } = props;
6
7
  const ref = useRef(null);
7
- const maskInput = useMemo(
8
- () => isServer_default ? null : createMaskInstance(mask, options),
9
- [mask, options]
10
- );
8
+ const maskRef = useRef(mask);
9
+ const optionsRef = useRef(options);
11
10
  const refCallback = useCallback((input) => {
12
11
  if (!input) {
13
12
  ref.current = null;
14
13
  return;
15
14
  }
16
15
  ref.current = resolveInputRef(input);
16
+ withMask(maskRef.current, optionsRef.current)(ref.current);
17
17
  }, []);
18
18
  useEffect(() => {
19
- if (isServer_default || !ref.current) return;
20
- if (!isHTMLElement(ref.current)) {
21
- return;
22
- }
23
- const inputElement = findInputElement(ref.current);
24
- if (maskInput && inputElement && isHTMLElement(inputElement)) {
25
- maskInput.mask(inputElement);
26
- }
27
- if (register && isHTMLElement(ref.current)) {
28
- register(ref.current);
29
- }
30
- }, [mask, register, options, maskInput]);
19
+ if (isServer_default || !ref.current || !register) return;
20
+ register(ref.current);
21
+ }, [register]);
31
22
  if (isServer_default) {
32
23
  return () => {
33
24
  };
@@ -62,28 +53,6 @@ function useHookFormMask(registerFn) {
62
53
  }, [registerFn]);
63
54
  }
64
55
 
65
- // src/api/withMask.ts
66
- var import_inputmask = __toESM(require_inputmask(), 1);
67
- var callbackCache = /* @__PURE__ */ new Map();
68
- function withMask(mask, options) {
69
- if (!options) {
70
- const cacheKey = makeMaskCacheKey("", mask);
71
- if (callbackCache.has(cacheKey)) {
72
- return callbackCache.get(cacheKey);
73
- }
74
- }
75
- const callback = (input) => {
76
- if (isServer_default || mask === null || !input) return;
77
- const maskInput = interopDefaultSync(import_inputmask.default)(getMaskOptions(mask, options));
78
- maskInput.mask(input);
79
- };
80
- if (!options) {
81
- const cacheKey = makeMaskCacheKey("", mask);
82
- callbackCache.set(cacheKey, callback);
83
- }
84
- return callback;
85
- }
86
-
87
56
  // src/api/withHookFormMask.ts
88
57
  var refCache = /* @__PURE__ */ new WeakMap();
89
58
  function withHookFormMask(register, mask, options) {
@@ -119,6 +88,6 @@ function withHookFormMask(register, mask, options) {
119
88
  return result;
120
89
  }
121
90
 
122
- export { useHookFormMask, useMaskInput, withHookFormMask, withMask };
91
+ export { useHookFormMask, useMaskInput, withHookFormMask };
123
92
  //# sourceMappingURL=index.js.map
124
93
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withMask.ts","../src/api/withHookFormMask.ts"],"names":["useMemo","refCache","inputmask","result"],"mappings":";;;AA8Be,SAAR,aAA8B,KAAA,EAA6D;AAChG,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA;AACpC,EAAA,MAAM,GAAA,GAAM,OAAgC,IAAI,CAAA;AAChD,EAAA,MAAM,SAAA,GAAY,OAAA;AAAA,IAChB,MAAO,gBAAA,GAAW,IAAA,GAAO,kBAAA,CAAmB,MAAM,OAAO,CAAA;AAAA,IACzD,CAAC,MAAM,OAAO;AAAA,GAChB;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,KAAA,KAA8B;AAC7D,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,GAAA,CAAI,OAAA,GAAU,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,OAAA,GAAU,gBAAgB,KAAK,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAA,IAAY,CAAC,GAAA,CAAI,OAAA,EAAS;AAE9B,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAEjD,IAAA,IAAI,SAAA,IAAa,YAAA,IAAgB,aAAA,CAAc,YAAY,CAAA,EAAG;AAC5D,MAAA,SAAA,CAAU,KAAK,YAAY,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,QAAA,IAAY,aAAA,CAAc,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1C,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAEvC,EAAA,IAAI,gBAAA,EAAU;AACZ,IAAA,OAAO,MAAY;AAAA,IAEnB,CAAA;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;ACjDe,SAAR,gBAEL,UAAA,EACyD;AAEzD,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,MAAMC,SAAAA,uBAAe,GAAA,EAA6C;AAElE,IAAA,OAAO,CAAC,SAAA,EAAoB,IAAA,EAAY,OAAA,KACmB;AACzD,MAAA,IAAI,CAAC,UAAA,EAAY,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAEzD,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,SAAA,EAAW,OAAkB,CAAA;AAC/D,MAAA,MAAM,EAAE,KAAI,GAAI,cAAA;AAEhB,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,SAAA,EAAW,IAAI,CAAA;AAEjD,MAAA,IAAI,CAACA,SAAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC3B,QAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,UAAA,IAAI,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAkB,CAAA;AAC3D,UAAA,OAAO,IAAA;AAAA,QACT,CAAA;AACA,QAAAA,SAAAA,CAAS,GAAA;AAAA,UACP,QAAA;AAAA,UACC,GAAA,GAAM,IAAA,CAAK,cAAA,EAAgB,GAAG,CAAA,GAAI;AAAA,SACrC;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,GAAG,cAAA;AAAA,QACH,GAAA,EAAKA,SAAAA,CAAS,GAAA,CAAI,QAAQ;AAAA,OAC5B;AAEA,MAAA,UAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACjB;;;AC5DA,IAAA,gBAAA,GAAsB,OAAA,CAAA,iBAAA,EAAA,EAAA,CAAA,CAAA;AAStB,IAAM,aAAA,uBAAoB,GAAA,EAA2C;AAUtD,SAAR,QAAA,CAA0B,MAAY,OAAA,EAAoD;AAE/F,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,MAAA,OAAO,aAAA,CAAc,IAAI,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAA8B;AAC9C,IAAA,IAAI,gBAAA,IAAY,IAAA,KAAS,IAAA,IAAQ,CAAC,KAAA,EAAO;AAEzC,IAAA,MAAM,SAAA,GAAY,mBAAmB,gBAAA,CAAAC,OAAS,EAAE,cAAA,CAAe,IAAA,EAAM,OAAO,CAAC,CAAA;AAC7E,IAAA,SAAA,CAAU,KAAK,KAAoB,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,QAAQ,CAAA;AAAA,EACtC;AAEA,EAAA,OAAO,QAAA;AACT;;;AChCA,IAAM,QAAA,uBAAe,OAAA,EAGnB;AAYa,SAAR,gBAAA,CACL,QAAA,EACA,IAAA,EACA,OAAA,EACoC;AACpC,EAAA,MAAM,EAAE,KAAI,GAAI,QAAA;AAGhB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAMC,OAAAA,GAAS;AAAA,MACb,GAAG,QAAA;AAAA,MACH,GAAA,EAAK;AAAA,KACP;AACA,IAAA,UAAA,CAAWA,SAAQ,GAAG,CAAA;AACtB,IAAA,OAAOA,OAAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA,EAAG;AACtB,IAAA,QAAA,CAAS,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,EAC7B;AACA,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAErD,EAAA,IAAI,CAAC,SAAA,EAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KAA6B;AACnD,MAAA,IAAI,IAAA,EAAM,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AACA,IAAA,SAAA,EAAW,GAAA;AAAA,MACT,QAAA;AAAA,MACA,IAAA,CAAK,gBAAgB,GAAG;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,QAAA;AAAA,IACH,GAAA,EAAK,SAAA,EAAW,GAAA,CAAI,QAAQ;AAAA,GAC9B;AAEA,EAAA,UAAA,CAAW,QAAQ,GAAG,CAAA;AAEtB,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport {\n createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,\n} from '../core';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskInput = useMemo(\n () => (isServer ? null : createMaskInstance(mask, options)),\n [mask, options],\n );\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current) return;\n\n if (!isHTMLElement(ref.current)) {\n return;\n }\n\n const inputElement = findInputElement(ref.current);\n\n if (maskInput && inputElement && isHTMLElement(inputElement)) {\n maskInput.mask(inputElement);\n }\n\n if (register && isHTMLElement(ref.current)) {\n register(ref.current);\n }\n }, [mask, register, options, maskInput]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","/* eslint-disable import-x/no-extraneous-dependencies */\nimport inputmask from 'inputmask';\n\nimport { getMaskOptions } from '../core/maskConfig';\nimport { makeMaskCacheKey } from '../utils';\nimport isServer from '../utils/isServer';\nimport interopDefaultSync from '../utils/moduleInterop';\n\nimport type { Input, Mask, Options } from '../types';\n\nconst callbackCache = new Map<string, (input: Input | null) => void>();\n\n/**\n * Higher-order function that creates a ref callback for applying input masks.\n * Simple function to apply mask via ref. No hooks, no drama.\n *\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A ref callback function that applies the mask\n */\nexport default function withMask(mask: Mask, options?: Options): ((input: Input | null) => void) {\n // without options, we cant cache, so we always return a fresh callback. :P\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n if (callbackCache.has(cacheKey)) {\n return callbackCache.get(cacheKey) as (input: Input | null) => void;\n }\n }\n\n const callback = (input: Input | null): void => {\n if (isServer || mask === null || !input) return;\n\n const maskInput = interopDefaultSync(inputmask)(getMaskOptions(mask, options));\n maskInput.mask(input as HTMLElement);\n };\n\n if (!options) {\n const cacheKey = makeMaskCacheKey('', mask);\n callbackCache.set(cacheKey, callback);\n }\n\n return callback;\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../src/api/useMaskInput.ts","../src/api/useHookFormMask.ts","../src/api/withHookFormMask.ts"],"names":["refCache","result"],"mappings":"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","file":"index.js","sourcesContent":["import {\n useCallback, useEffect, useRef,\n} from 'react';\n\nimport { resolveInputRef } from '../core';\nimport withMask from './withMask';\nimport isServer from '../utils/isServer';\n\nimport type { Input, Mask, Options } from '../types';\n\ninterface UseMaskInputOptions {\n mask: Mask;\n register?: (element: HTMLElement) => void;\n options?: Options;\n}\n\n/**\n * React hook for applying input masks to form elements.\n * Works with Ant Design and other wrapped components too.\n *\n * @param props - Configuration object\n * @param props.mask - The mask pattern to apply\n * @param props.register - Optional callback that receives the element\n * @param props.options - Optional mask configuration options\n * @returns A ref callback function to attach to the input element\n */\nexport default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {\n const { mask, register, options } = props;\n const ref = useRef<HTMLInputElement | null>(null);\n const maskRef = useRef(mask);\n const optionsRef = useRef(options);\n\n const refCallback = useCallback((input: Input | null): void => {\n if (!input) {\n ref.current = null;\n return;\n }\n\n ref.current = resolveInputRef(input);\n withMask(maskRef.current, optionsRef.current)(ref.current);\n }, []);\n\n useEffect(() => {\n if (isServer || !ref.current || !register) return;\n register(ref.current);\n }, [register]);\n\n if (isServer) {\n return (): void => {\n // server doesn't have dom, so just do nothing\n };\n }\n\n return refCallback;\n}\n","import { useMemo } from 'react';\n\nimport { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type {\n FieldValues, Path,\n RegisterOptions,\n UseFormRegister,\n} from 'react-hook-form';\n\nimport type { Mask, Options, UseHookFormMaskReturn } from '../types';\n\n/**\n * Creates a masked version of React Hook Form's register function.\n * Takes react-hook-form's register and adds automatic masking. Like an upgrade.\n *\n * @template T - The form data type\n * @template D - The register options type\n * @param registerFn - The register function from useForm hook\n * @returns A function that registers a field with mask support\n */\nexport default function useHookFormMask<\n T extends FieldValues, D extends RegisterOptions,\n>(registerFn: UseFormRegister<T>): ((fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D) => UseHookFormMaskReturn<T>) {\n //\n return useMemo(() => {\n const refCache = new Map<string, RefCallback<HTMLElement | null>>();\n\n return (fieldName: Path<T>, mask: Mask, options?: (\n D & Options) | Options | D): UseHookFormMaskReturn<T> => {\n if (!registerFn) throw new Error('registerFn is required');\n\n const registerReturn = registerFn(fieldName, options as Options);\n const { ref } = registerReturn as UseHookFormMaskReturn<T>;\n\n const cacheKey = makeMaskCacheKey(fieldName, mask);\n\n if (!refCache.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options as Options);\n return _ref;\n };\n refCache.set(\n cacheKey,\n (ref ? flow(applyMaskToRef, ref) : applyMaskToRef) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...registerReturn,\n ref: refCache.get(cacheKey),\n } as UseHookFormMaskReturn<T>;\n\n setPrevRef(result, ref);\n\n return result;\n };\n }, [registerFn]);\n}\n","import { applyMaskToElement } from '../core';\nimport { flow, makeMaskCacheKey, setPrevRef } from '../utils';\n\nimport type { RefCallback } from 'react';\nimport type { FieldValues } from 'react-hook-form';\n\nimport type {\n Mask, Options, UseFormRegisterReturn, UseHookFormMaskReturn,\n} from '../types';\n\nconst refCache = new WeakMap<\n RefCallback<HTMLElement | null>,\n Map<string, RefCallback<HTMLElement | null>>\n>();\n\n/**\n * Enhances a React Hook Form register return object with mask support.\n * Takes an already registered field and adds mask to it.\n * Useful when you registered the field before.\n *\n * @param register - The register return object from React Hook Form\n * @param mask - The mask pattern to apply\n * @param options - Optional mask configuration options\n * @returns A new register return object with mask applied\n */\nexport default function withHookFormMask(\n register: UseFormRegisterReturn,\n mask: Mask,\n options?: Options,\n): UseHookFormMaskReturn<FieldValues> {\n const { ref } = register as UseHookFormMaskReturn<FieldValues>;\n\n // null ref — nothing to cache, return as-is.\n if (!ref) {\n const result = {\n ...register,\n ref: null as unknown as RefCallback<HTMLElement | null>,\n } as UseHookFormMaskReturn<FieldValues>;\n setPrevRef(result, ref);\n return result;\n }\n\n if (!refCache.has(ref)) {\n refCache.set(ref, new Map());\n }\n const maskCache = refCache.get(ref);\n const cacheKey = makeMaskCacheKey(register.name, mask);\n\n if (!maskCache?.has(cacheKey)) {\n const applyMaskToRef = (_ref: HTMLElement | null) => {\n if (_ref) applyMaskToElement(_ref, mask, options);\n return _ref;\n };\n maskCache?.set(\n cacheKey,\n flow(applyMaskToRef, ref) as RefCallback<HTMLElement | null>,\n );\n }\n\n const result = {\n ...register,\n ref: maskCache?.get(cacheKey),\n } as UseHookFormMaskReturn<FieldValues>;\n\n setPrevRef(result, ref);\n\n return result;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "use-mask-input",
3
- "version": "3.7.2",
3
+ "version": "3.7.4",
4
4
  "private": false,
5
5
  "description": "A react Hook for build elegant input masks. Compatible with React Hook Form",
6
6
  "author": "Eduardo Borges<euduardoborges@gmail.com>",
@@ -1,13 +1,7 @@
1
- import {
2
- useCallback,
3
- useEffect,
4
- useMemo,
5
- useRef,
6
- } from 'react';
1
+ import { useCallback, useEffect, useRef } from 'react';
7
2
 
8
- import {
9
- createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,
10
- } from '../core';
3
+ import withMask from '../api/withMask';
4
+ import { resolveInputRef } from '../core';
11
5
  import isServer from '../utils/isServer';
12
6
 
13
7
  import type { InputRef } from 'antd';
@@ -21,51 +15,44 @@ interface UseMaskInputOptions {
21
15
  }
22
16
 
23
17
  /**
24
- * React hook for applying input masks to form elements.
25
- * Works with Ant Design and other wrapped components too.
18
+ * React hook for applying input masks to Ant Design form elements.
26
19
  *
27
20
  * @param props - Configuration object
28
21
  * @param props.mask - The mask pattern to apply
29
22
  * @param props.register - Optional callback that receives the element
30
23
  * @param props.options - Optional mask configuration options
31
- * @returns A ref callback function to attach to the input element
24
+ * @returns A ref callback function to attach to the Ant Design Input element
32
25
  */
33
26
  export default function useMaskInputAntd(props: UseMaskInputOptions): (
34
27
  input: InputRef | null
35
28
  ) => void {
36
29
  const { mask, register, options } = props;
37
- const ref = useRef<InputRef | null>(null);
38
- const maskInput = useMemo(
39
- () => (isServer ? null : createMaskInstance(mask, options)),
40
- [mask, options],
41
- );
30
+ const ref = useRef<HTMLInputElement | null>(null);
31
+ const maskRef = useRef(mask);
32
+ const optionsRef = useRef(options);
33
+ const maskedElementRef = useRef<HTMLInputElement | null>(null);
42
34
 
43
- const refCallback = useCallback((input: InputRef | null) => {
35
+ maskRef.current = mask;
36
+ optionsRef.current = options;
37
+
38
+ const refCallback = useCallback((input: InputRef | null): void => {
44
39
  if (!input) {
45
40
  ref.current = null;
46
41
  return;
47
42
  }
48
43
 
49
- ref.current = resolveInputRef(input.input) as unknown as InputRef;
50
- }, []);
51
-
52
- useEffect(() => {
53
- if (isServer || !ref.current) return;
44
+ ref.current = resolveInputRef(input.input);
54
45
 
55
- if (!isHTMLElement(ref.current)) {
56
- return;
57
- }
58
-
59
- const inputElement = findInputElement(ref.current);
60
-
61
- if (maskInput && inputElement && isHTMLElement(inputElement)) {
62
- maskInput.mask(inputElement);
46
+ if (ref.current && ref.current !== maskedElementRef.current) {
47
+ withMask(maskRef.current, optionsRef.current)(ref.current);
48
+ maskedElementRef.current = ref.current;
63
49
  }
50
+ }, []);
64
51
 
65
- if (register && isHTMLElement(ref.current)) {
66
- register(ref.current);
67
- }
68
- }, [mask, register, options, maskInput]);
52
+ useEffect(() => {
53
+ if (isServer || !ref.current || !register) return;
54
+ register(ref.current);
55
+ }, [register]);
69
56
 
70
57
  if (isServer) {
71
58
  return (): void => {
@@ -1,13 +1,9 @@
1
1
  import {
2
- useCallback,
3
- useEffect,
4
- useMemo,
5
- useRef,
2
+ useCallback, useEffect, useRef,
6
3
  } from 'react';
7
4
 
8
- import {
9
- createMaskInstance, findInputElement, isHTMLElement, resolveInputRef,
10
- } from '../core';
5
+ import { resolveInputRef } from '../core';
6
+ import withMask from './withMask';
11
7
  import isServer from '../utils/isServer';
12
8
 
13
9
  import type { Input, Mask, Options } from '../types';
@@ -31,10 +27,8 @@ interface UseMaskInputOptions {
31
27
  export default function useMaskInput(props: UseMaskInputOptions): ((input: Input | null) => void) {
32
28
  const { mask, register, options } = props;
33
29
  const ref = useRef<HTMLInputElement | null>(null);
34
- const maskInput = useMemo(
35
- () => (isServer ? null : createMaskInstance(mask, options)),
36
- [mask, options],
37
- );
30
+ const maskRef = useRef(mask);
31
+ const optionsRef = useRef(options);
38
32
 
39
33
  const refCallback = useCallback((input: Input | null): void => {
40
34
  if (!input) {
@@ -43,25 +37,13 @@ export default function useMaskInput(props: UseMaskInputOptions): ((input: Input
43
37
  }
44
38
 
45
39
  ref.current = resolveInputRef(input);
40
+ withMask(maskRef.current, optionsRef.current)(ref.current);
46
41
  }, []);
47
42
 
48
43
  useEffect(() => {
49
- if (isServer || !ref.current) return;
50
-
51
- if (!isHTMLElement(ref.current)) {
52
- return;
53
- }
54
-
55
- const inputElement = findInputElement(ref.current);
56
-
57
- if (maskInput && inputElement && isHTMLElement(inputElement)) {
58
- maskInput.mask(inputElement);
59
- }
60
-
61
- if (register && isHTMLElement(ref.current)) {
62
- register(ref.current);
63
- }
64
- }, [mask, register, options, maskInput]);
44
+ if (isServer || !ref.current || !register) return;
45
+ register(ref.current);
46
+ }, [register]);
65
47
 
66
48
  if (isServer) {
67
49
  return (): void => {