1
+ #pragma once
1
2
#include " RNTextInputMask.h"
2
3
#include " RNOH/arkui/TextInputNode.h"
3
4
#include " RNOH/ComponentInstance.h"
@@ -49,19 +50,17 @@ void myEventReceiver(ArkUI_NodeEvent *event) {
49
50
: std::make_shared<CaretString::CaretGravity>(CaretString::Forward (useAutocomplete));
50
51
CaretString text (content, content.length (), caretGravity);
51
52
try {
52
- // if (!isDelete) {
53
- auto maskObj = self->pickMask (text, userData->maskOptions , userData->primaryFormat );
54
- auto result = maskObj->apply (text);
55
- std::string resultString = result.formattedText .string ;
56
- DLOG (INFO) << " mask result complete: " << result.complete ;
57
- userData->lastInputText = resultString;
58
- std::string finalString = isDelete ? content : resultString;
59
- ArkUI_AttributeItem item{.string = finalString.c_str ()};
60
- userData->lastInputText = finalString;
61
- maybeThrow (NativeNodeApi::getInstance ()->setAttribute (userData->data , NODE_TEXT_INPUT_TEXT, &item));
62
- // }
53
+ auto maskObj = self->pickMask (text, userData->maskOptions , userData->primaryFormat );
54
+ auto result = maskObj->apply (text);
55
+ std::string resultString = result.formattedText .string ;
56
+ DLOG (INFO) << " mask result complete: " << result.complete ;
57
+ userData->lastInputText = resultString;
58
+ std::string finalString = isDelete ? content : resultString;
59
+ ArkUI_AttributeItem item{.string = finalString.c_str ()};
60
+ userData->lastInputText = finalString;
61
+ maybeThrow (NativeNodeApi::getInstance ()->setAttribute (userData->data , NODE_TEXT_INPUT_TEXT, &item));
63
62
} catch (FormatError e) {
64
- DLOG (ERROR) << " mask complier error " << e.what ();
63
+ DLOG (ERROR) << " mask compiler error " << e.what ();
65
64
}
66
65
}
67
66
// onFocus 事件
@@ -73,11 +72,11 @@ void myEventReceiver(ArkUI_NodeEvent *event) {
73
72
CaretString string (text, text.length (),
74
73
std::make_shared<CaretString::Forward>(userData->maskOptions .autocomplete .value ()));
75
74
auto maskObj = self->pickMask (string, userData->maskOptions , userData->primaryFormat );
76
- std::string resultString = maskObj->apply (string).formattedText .string ;
75
+ std::string resultString = maskObj. get () ->apply (string).formattedText .string ;
77
76
ArkUI_AttributeItem item{.string = resultString.c_str ()};
78
77
maybeThrow (NativeNodeApi::getInstance ()->setAttribute (userData->data , NODE_TEXT_INPUT_TEXT, &item));
79
78
} catch (FormatError e) {
80
- DLOG (ERROR) << " mask complier error " << e.what ();
79
+ DLOG (ERROR) << " mask compiler error " << e.what ();
81
80
}
82
81
}
83
82
}
@@ -94,7 +93,9 @@ int calculateAffinity(Mask mask, const CaretString &text, std::string affinityCa
94
93
} else {
95
94
strategy = AffinityCalculationStrategy::EXTRACTED_VALUE_CAPACITY;
96
95
}
97
- return AffinityCalculator::calculateAffinityOfMask (strategy, mask, text);
96
+ int affinity = AffinityCalculator::calculateAffinityOfMask (strategy, mask, text);
97
+
98
+ return affinity;
98
99
}
99
100
// 获取或创建 Mask
100
101
std::shared_ptr<Mask> maskGetOrCreate (const std::string &format, const std::vector<Notation> &customNotations,
@@ -109,8 +110,13 @@ std::shared_ptr<Mask> maskGetOrCreate(const std::string &format, const std::vect
109
110
std::shared_ptr<Mask> RNTextInputMask::pickMask (const CaretString &text, MaskOptions maskOptions,
110
111
std::string primaryMask) {
111
112
// 如果 affineFormats 为空,直接返回 primaryMask
112
- if (maskOptions.affineFormats ->size () <= 0 )
113
- return maskGetOrCreate (primaryMask, maskOptions.customNotations .value (), maskOptions.rightToLeft .value ());
113
+ if (maskOptions.affineFormats ->size () <= 0 ) {
114
+ auto mask = maskGetOrCreate (primaryMask, maskOptions.customNotations .value (), maskOptions.rightToLeft .value ());
115
+ int affinity = calculateAffinity (*mask, text, maskOptions.affinityCalculationStrategy .value ());
116
+ DLOG (INFO) << " ======= pickMask calculateAffinity value: " << affinity
117
+ << " \n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy .value ();
118
+ return mask;
119
+ }
114
120
// 定义 MaskAffinity 结构体,用于存储 Mask 和相应的亲和度
115
121
struct MaskAffinity {
116
122
Mask mask; // Mask 对象
@@ -120,7 +126,8 @@ std::shared_ptr<Mask> RNTextInputMask::pickMask(const CaretString &text, MaskOpt
120
126
121
127
// 计算 primaryMask 的亲和度
122
128
int primaryAffinity = calculateAffinity (primaryMask, text, maskOptions.affinityCalculationStrategy .value ());
123
-
129
+ DLOG (INFO) << " ======= pickMask calculateAffinity value: " << primaryAffinity << " \n mask: " << primaryMask
130
+ << " \n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy .value ();
124
131
// 存储所有 mask 和亲和度的列表
125
132
std::vector<MaskAffinity> masksAndAffinities;
126
133
@@ -129,6 +136,8 @@ std::shared_ptr<Mask> RNTextInputMask::pickMask(const CaretString &text, MaskOpt
129
136
std::shared_ptr<Mask> mask =
130
137
maskGetOrCreate (format, maskOptions.customNotations .value (), maskOptions.rightToLeft .value ());
131
138
int affinity = calculateAffinity (*mask, text, maskOptions.affinityCalculationStrategy .value ());
139
+ DLOG (INFO) << " ======= pickMask calculateAffinity value: " << affinity << " \n affineFormat: " << format
140
+ << " \n affinityCalculationStrategy: " << maskOptions.affinityCalculationStrategy .value ();
132
141
masksAndAffinities.emplace_back (*mask, affinity);
133
142
}
134
143
@@ -187,11 +196,13 @@ void RNTextInputMask::setMask(int reactNode, std::string primaryFormat, MaskOpti
187
196
NativeNodeApi::getInstance ()->addNodeEventReceiver (textInputNode->getArkUINodeHandle (), myEventReceiver);
188
197
};
189
198
this ->m_ctx .taskExecutor ->runTask (TaskThread::MAIN, std::move (task));
199
+
190
200
}
191
201
std::string getString (std::string maskValue, std::string value, bool autocomplete, bool isMask) {
192
- Mask maskObj (maskValue);
202
+
203
+ auto maskObj = Mask::MaskFactory::getOrCreate (maskValue, {});
193
204
CaretString text (value, value.length (), std::make_shared<CaretString::Forward>(autocomplete));
194
- auto r = maskObj. apply (text);
205
+ auto r = maskObj-> apply (text);
195
206
std::string result;
196
207
if (isMask) {
197
208
result = r.formattedText .string ;
@@ -208,24 +219,35 @@ static jsi::Value __hostFunction_RNTextInputMask_unmask(jsi::Runtime &rt, react:
208
219
return createPromiseAsJSIValue (
209
220
rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr<facebook::react::Promise> promise) {
210
221
try {
222
+ auto start = std::chrono::high_resolution_clock::now ();
211
223
std::string result = getString (maskValue, value, autocomplete, 0 );
212
224
promise->resolve (jsi::String::createFromUtf8 (rt2, result));
225
+ // 获取结束时间点
226
+ auto end = std::chrono::high_resolution_clock::now ();
227
+ // 计算延迟
228
+ std::chrono::duration<double , std::milli> latency = end - start;
229
+ DLOG (INFO) << " =======unmask 响应时长: " << latency.count () << " 毫秒" << std::endl;
213
230
} catch (FormatError e) {
214
231
promise->reject (e.what ());
215
232
}
216
233
});
217
234
}
218
235
static jsi::Value __hostFunction_RNTextInputMask_mask (jsi::Runtime &rt, react::TurboModule &turboModule,
219
236
const jsi::Value *args, size_t count) {
220
-
221
237
std::string maskValue = args[0 ].getString (rt).utf8 (rt);
222
238
std::string value = args[1 ].getString (rt).utf8 (rt);
223
239
bool autocomplete = args[2 ].getBool ();
224
240
return createPromiseAsJSIValue (
225
241
rt, [maskValue, value, autocomplete](jsi::Runtime &rt2, std::shared_ptr<facebook::react::Promise> promise) {
226
242
try {
243
+ auto start = std::chrono::high_resolution_clock::now ();
227
244
std::string result = getString (maskValue, value, autocomplete, 1 );
228
245
promise->resolve (jsi::String::createFromUtf8 (rt2, result));
246
+ // 获取结束时间点
247
+ auto end = std::chrono::high_resolution_clock::now ();
248
+ // 计算延迟
249
+ std::chrono::duration<double , std::milli> latency = end - start;
250
+ DLOG (INFO) << " =======mask 响应时长: " << latency.count () << " 毫秒" << std::endl;
229
251
} catch (FormatError e) {
230
252
promise->reject (e.what ());
231
253
}
0 commit comments