persian-number-input 4.0.7 → 4.0.8
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAmB,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"usePersianNumberInput.d.ts","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAmB,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAMnF,UAAU,0BAA2B,SAAQ,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC;IACtF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,UAAU,2BAA2B;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC/D,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC1D,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,eAAO,MAAM,qBAAqB,GAAI,kIAWnC,0BAA+B,KAAG,2BA0HpC,CAAC"}
|
|
@@ -9,55 +9,52 @@ const react_1 = require("react");
|
|
|
9
9
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
10
10
|
const transformNumber_1 = require("../utils/transformNumber");
|
|
11
11
|
const digitUtils_1 = require("../utils/digitUtils");
|
|
12
|
+
// ۱. تعریف سیگنال منحصر به فرد برای خطای محدوده
|
|
13
|
+
const INVALID_RANGE_SIGNAL = Symbol("INVALID_RANGE");
|
|
12
14
|
const usePersianNumberInput = ({ initialValue, separatorCount = 3, separatorChar = ',', locale = 'fa', showZero = false, onValueChange, min, max, maxDecimals, inputDecimalSeparator = '.', } = {}) => {
|
|
13
|
-
|
|
15
|
+
// اسم تابع برای وضوح بیشتر تغییر کرد
|
|
16
|
+
const getSanitizedRoundedAndCheckedValue = (0, react_1.useCallback)((val) => {
|
|
17
|
+
// ۲. نوع خروجی تابع تغییر کرد
|
|
14
18
|
if (val === null || val === undefined)
|
|
15
19
|
return undefined;
|
|
16
20
|
let sanitized = (0, digitUtils_1.sanitizeNumericInput)(String(val), inputDecimalSeparator);
|
|
17
|
-
//
|
|
21
|
+
// اجازه عبور موقت به مقادیر بینابینی
|
|
18
22
|
if (sanitized === '-' || sanitized === '.' || sanitized === '-.') {
|
|
19
|
-
//
|
|
20
|
-
// در انتها بررسی میشود
|
|
23
|
+
// در انتها بررسی showZero برای اینها انجام میشود
|
|
21
24
|
}
|
|
22
25
|
else if (sanitized) { // اگر رشته خالی یا فقط بینابینی نیست
|
|
23
26
|
try {
|
|
27
|
+
// تبدیل به Decimal فقط برای بررسی محدوده
|
|
24
28
|
const numericValue = new decimal_js_1.default(sanitized);
|
|
25
|
-
//
|
|
29
|
+
// ۳. بررسی محدوده و برگرداندن سیگنال در صورت خطا
|
|
26
30
|
if (min !== undefined && numericValue.lt(min)) {
|
|
27
|
-
console.warn(`Value ${sanitized} is less than min ${min}.
|
|
28
|
-
|
|
29
|
-
const minStr = (0, digitUtils_1.sanitizeNumericInput)(String(min), '.'); // min را با نقطه استاندارد sanitize کن
|
|
30
|
-
sanitized = (0, digitUtils_1.roundToDecimals)(minStr, maxDecimals);
|
|
31
|
+
console.warn(`Value ${sanitized} is less than min ${min}. Input ignored.`);
|
|
32
|
+
return INVALID_RANGE_SIGNAL; // <<< برگرداندن سیگنال
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
console.warn(`Value ${sanitized} exceeds max ${max}.
|
|
34
|
-
|
|
35
|
-
const maxStr = (0, digitUtils_1.sanitizeNumericInput)(String(max), '.'); // max را با نقطه استاندارد sanitize کن
|
|
36
|
-
sanitized = (0, digitUtils_1.roundToDecimals)(maxStr, maxDecimals);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
// اگر در محدوده بود، فقط مقدار اصلی sanitize شده را گرد کن
|
|
40
|
-
sanitized = (0, digitUtils_1.roundToDecimals)(sanitized, maxDecimals);
|
|
34
|
+
if (max !== undefined && numericValue.gt(max)) {
|
|
35
|
+
console.warn(`Value ${sanitized} exceeds max ${max}. Input ignored.`);
|
|
36
|
+
return INVALID_RANGE_SIGNAL; // <<< برگرداندن سیگنال
|
|
41
37
|
}
|
|
38
|
+
// اگر در محدوده بود، گرد کردن را اعمال کن
|
|
39
|
+
sanitized = (0, digitUtils_1.roundToDecimals)(sanitized, maxDecimals);
|
|
42
40
|
}
|
|
43
41
|
catch (error) {
|
|
44
|
-
// اگر در تبدیل به Decimal خطا رخ داد (مثلا برای مقادیر بینابینی نامعتبر)
|
|
45
42
|
console.warn(`Error processing sanitized value: ${sanitized}`, error);
|
|
46
|
-
return undefined; //
|
|
43
|
+
return undefined; // خطای پردازش به معنی نامعتبر بودن است
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
else {
|
|
50
47
|
// اگر sanitizeNumericInput رشته خالی برگرداند
|
|
51
48
|
return undefined;
|
|
52
49
|
}
|
|
53
|
-
// مدیریت showZero برای مقدار نهایی (بعد از
|
|
50
|
+
// مدیریت showZero برای مقدار نهایی (بعد از بررسی محدوده و گرد کردن)
|
|
54
51
|
if (!showZero) {
|
|
55
|
-
//
|
|
52
|
+
// مقادیر بینابینی را حذف کن اگر showZero=false
|
|
56
53
|
if (sanitized === '-' || sanitized === '.' || sanitized === '-.') {
|
|
57
54
|
return undefined;
|
|
58
55
|
}
|
|
59
|
-
// اگر مقدار عددی صفر است (و صرفا نقطه انتهایی ندارد)
|
|
60
56
|
try {
|
|
57
|
+
// مقادیر صفر را حذف کن (مگر اینکه نقطه انتهایی داشته باشد)
|
|
61
58
|
if (sanitized && new decimal_js_1.default(sanitized).isZero() && !sanitized.endsWith('.')) {
|
|
62
59
|
return undefined;
|
|
63
60
|
}
|
|
@@ -67,47 +64,52 @@ const usePersianNumberInput = ({ initialValue, separatorCount = 3, separatorChar
|
|
|
67
64
|
// در نهایت، اگر رشته خالی شده، undefined برگردان
|
|
68
65
|
return sanitized === '' ? undefined : sanitized;
|
|
69
66
|
}, [inputDecimalSeparator, min, max, maxDecimals, showZero]);
|
|
70
|
-
|
|
71
|
-
(0, react_1.
|
|
72
|
-
|
|
73
|
-
//
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// setRawValue(newSanitized); // آیا این لازم است؟ شاید باعث رفتار ناخواسته شود
|
|
78
|
-
}
|
|
79
|
-
// TODO: بررسی دقیق رفتار useEffect با initialValue
|
|
80
|
-
}, [initialValue]); // getSanitizedAndRoundedValue را از وابستگی حذف کردیم تا از لوپ جلوگیری شود
|
|
67
|
+
// ۵. مدیریت سیگنال در مقدار اولیه
|
|
68
|
+
const [rawValue, setRawValue] = (0, react_1.useState)(() => {
|
|
69
|
+
const initialProcessed = getSanitizedRoundedAndCheckedValue(initialValue);
|
|
70
|
+
// اگر مقدار اولیه خارج از محدوده بود، با undefined شروع کن
|
|
71
|
+
return initialProcessed === INVALID_RANGE_SIGNAL ? undefined : initialProcessed;
|
|
72
|
+
});
|
|
73
|
+
// useEffect برای initialValue ممکن است نیاز به بازبینی داشته باشد
|
|
81
74
|
const displayValue = (0, react_1.useMemo)(() => {
|
|
82
75
|
const options = { separatorCount, separatorChar, locale, showZero, maxDecimals };
|
|
83
|
-
// تابع transformNumber حالا باید بتواند rawValue های مختلف را به درستی نمایش دهد
|
|
84
76
|
return (0, transformNumber_1.transformNumber)(rawValue, options);
|
|
85
77
|
}, [rawValue, separatorCount, separatorChar, locale, showZero, maxDecimals]);
|
|
78
|
+
// ۴. اصلاح handleChange برای پردازش سیگنال
|
|
86
79
|
const handleChange = (0, react_1.useCallback)((event) => {
|
|
87
80
|
const inputValue = event.target.value;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
81
|
+
// دریافت مقدار پردازش شده یا سیگنال خطا
|
|
82
|
+
const processedValue = getSanitizedRoundedAndCheckedValue(inputValue);
|
|
83
|
+
// اگر سیگنال خطا دریافت شد، هیچ کاری نکن (مقدار قبلی حفظ میشود)
|
|
84
|
+
if (processedValue === INVALID_RANGE_SIGNAL) {
|
|
85
|
+
// اینجا میتوانید بازخورد بصری به کاربر بدهید (مثلا لرزش input)
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// اگر مقدار معتبر بود (رشته یا undefined) و با مقدار فعلی فرق داشت
|
|
89
|
+
if (processedValue !== rawValue) {
|
|
90
|
+
setRawValue(processedValue);
|
|
92
91
|
if (onValueChange) {
|
|
93
|
-
onValueChange(
|
|
92
|
+
onValueChange(processedValue);
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
|
-
|
|
97
|
-
// newRawValue ممکن است با rawValue قبلی *متفاوت* باشد (برابر با max)،
|
|
98
|
-
// ولی با چیزی که کاربر تایپ کرده متفاوت است. input باید آپدیت شود تا مقدار clamp شده را نشان دهد.
|
|
99
|
-
// منطق فعلی این کار را انجام میدهد.
|
|
100
|
-
}, [rawValue, getSanitizedAndRoundedValue, onValueChange] // getSanitizedAndRoundedValue اینجا لازم است
|
|
95
|
+
}, [rawValue, getSanitizedRoundedAndCheckedValue, onValueChange] // تابع پردازشگر به وابستگیها اضافه شد
|
|
101
96
|
);
|
|
97
|
+
// ۴. اصلاح handleSetValue برای پردازش سیگنال
|
|
102
98
|
const handleSetValue = (0, react_1.useCallback)((newValue) => {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
99
|
+
const processedValue = getSanitizedRoundedAndCheckedValue(newValue);
|
|
100
|
+
// اگر مقدار جدید خارج از محدوده است، درخواست را نادیده بگیر
|
|
101
|
+
if (processedValue === INVALID_RANGE_SIGNAL) {
|
|
102
|
+
console.warn(`setValue ignored: Value ${newValue} is out of range [${min}, ${max}].`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// اگر مقدار معتبر و متفاوت بود، تنظیم کن
|
|
106
|
+
if (processedValue !== rawValue) {
|
|
107
|
+
setRawValue(processedValue);
|
|
106
108
|
if (onValueChange) {
|
|
107
|
-
onValueChange(
|
|
109
|
+
onValueChange(processedValue);
|
|
108
110
|
}
|
|
109
111
|
}
|
|
110
|
-
}, [rawValue,
|
|
112
|
+
}, [rawValue, min, max, getSanitizedRoundedAndCheckedValue, onValueChange] // min/max هم برای پیام هشدار اضافه شد
|
|
111
113
|
);
|
|
112
114
|
return { value: displayValue, onChange: handleChange, setValue: handleSetValue, rawValue };
|
|
113
115
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAiC;AACjC,iCAAyE;AACzE,4DAAiC;AACjC,8DAAmF;AACnF,oDAA4E;
|
|
1
|
+
{"version":3,"file":"usePersianNumberInput.js","sourceRoot":"","sources":["../../src/hooks/usePersianNumberInput.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED