1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_date_picker_bridge.h"
17
18 #include "interfaces/napi/kits/utils/napi_utils.h"
19
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include "core/components_ng/pattern/picker/picker_type_define.h"
23
24 #include "core/components/picker/picker_base_component.h"
25 namespace OHOS::Ace::NG {
26 constexpr int NUM_0 = 0;
27 constexpr int NUM_1 = 1;
28 constexpr int NUM_2 = 2;
29 constexpr int NUM_3 = 3;
30 constexpr int NUM_4 = 4;
31 constexpr int NUM_5 = 5;
32 const std::string FORMAT_FONT = "%s|%s|%s";
33 const std::string DEFAULT_FAMILY = "HarmonyOS Sans";
34 constexpr int PARAM_ARR_LENGTH_1 = 1;
SetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)35 ArkUINativeModuleValue DatePickerBridge::SetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
36 {
37 EcmaVM* vm = runtimeCallInfo->GetVM();
38 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
39 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
40 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
41 Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
42 Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
43 Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
44 Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
45 Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
46
47 if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
48 fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
49 GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
50 }
51
52 CalcDimension fontSizeData;
53 std::string fontSize;
54 if (!ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArgs, fontSizeData, true, false) ||
55 fontSizeData.Unit() == DimensionUnit::PERCENT) {
56 fontSizeData = Dimension(-1);
57 }
58 fontSize = fontSizeData.ToString();
59
60 std::string weight = "FontWeight.Medium";
61 if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
62 weight = fontWeightArgs->ToString(vm)->ToString(vm);
63 }
64
65 std::string fontFamily;
66 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArgs, fontFamily) || fontFamily.empty()) {
67 fontFamily = DEFAULT_FAMILY;
68 }
69 int32_t fontStyle = 0;
70 if (fontStyleArgs->IsNumber()) {
71 fontStyle = fontStyleArgs->Int32Value(vm);
72 }
73 Color color;
74 if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color)) {
75 Color::ParseColorString("#ff0a59f7", color);
76 }
77 std::string fontInfo =
78 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
79 GetArkUINodeModifiers()->getDatePickerModifier()->setSelectedTextStyle(
80 nativeNode, fontInfo.c_str(), color.GetValue(), fontStyle);
81 return panda::JSValueRef::Undefined(vm);
82 }
83
ResetSelectedTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)84 ArkUINativeModuleValue DatePickerBridge::ResetSelectedTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
85 {
86 EcmaVM* vm = runtimeCallInfo->GetVM();
87 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
88 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
89 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
90 GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
91 return panda::JSValueRef::Undefined(vm);
92 }
93
SetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)94 ArkUINativeModuleValue DatePickerBridge::SetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
95 {
96 EcmaVM* vm = runtimeCallInfo->GetVM();
97 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
98 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
99 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
100 Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
101 Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
102 Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
103 Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
104 Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
105
106 if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
107 fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
108 GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
109 }
110 CalcDimension fontSizeData;
111 std::string fontSize;
112 if (!ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArgs, fontSizeData, true, false) ||
113 fontSizeData.Unit() == DimensionUnit::PERCENT) {
114 fontSizeData = Dimension(-1);
115 }
116 fontSize = fontSizeData.ToString();
117
118 std::string weight = "FontWeight.Regular";
119 if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
120 weight = fontWeightArgs->ToString(vm)->ToString(vm);
121 }
122
123 std::string fontFamily;
124 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArgs, fontFamily) || fontFamily.empty()) {
125 fontFamily = DEFAULT_FAMILY;
126 }
127 int32_t fontStyle = 0;
128 if (fontStyleArgs->IsNumber()) {
129 fontStyle = fontStyleArgs->Int32Value(vm);
130 }
131 Color color;
132 if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color)) {
133 Color::ParseColorString("#ff182431", color);
134 }
135 std::string fontInfo =
136 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
137 GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerTextStyle(
138 nativeNode, fontInfo.c_str(), color.GetValue(), fontStyle);
139 return panda::JSValueRef::Undefined(vm);
140 }
141
ResetTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)142 ArkUINativeModuleValue DatePickerBridge::ResetTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
143 {
144 EcmaVM* vm = runtimeCallInfo->GetVM();
145 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
146 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
147 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
148 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerTextStyle(nativeNode);
149 return panda::JSValueRef::Undefined(vm);
150 }
151
SetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)152 ArkUINativeModuleValue DatePickerBridge::SetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
153 {
154 EcmaVM* vm = runtimeCallInfo->GetVM();
155 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
156 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
157 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
158 Local<JSValueRef> textColorArgs = runtimeCallInfo->GetCallArgRef(NUM_1);
159 Local<JSValueRef> fontSizeArgs = runtimeCallInfo->GetCallArgRef(NUM_2);
160 Local<JSValueRef> fontWeightArgs = runtimeCallInfo->GetCallArgRef(NUM_3);
161 Local<JSValueRef> fontFamilyArgs = runtimeCallInfo->GetCallArgRef(NUM_4);
162 Local<JSValueRef> fontStyleArgs = runtimeCallInfo->GetCallArgRef(NUM_5);
163
164 if (textColorArgs->IsUndefined() && fontSizeArgs->IsUndefined() && fontWeightArgs->IsUndefined() &&
165 fontFamilyArgs->IsUndefined() && fontStyleArgs->IsUndefined()) {
166 GetArkUINodeModifiers()->getDatePickerModifier()->resetSelectedTextStyle(nativeNode);
167 }
168 CalcDimension fontSizeData;
169 std::string fontSize;
170 if (!ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArgs, fontSizeData, true, false) ||
171 fontSizeData.Unit() == DimensionUnit::PERCENT) {
172 fontSizeData = Dimension(-1);
173 }
174 fontSize = fontSizeData.ToString();
175
176 std::string weight = "FontWeight.Regular";
177 if (fontWeightArgs->IsString(vm) || fontWeightArgs->IsNumber()) {
178 weight = fontWeightArgs->ToString(vm)->ToString(vm);
179 }
180
181 std::string fontFamily;
182 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArgs, fontFamily) || fontFamily.empty()) {
183 fontFamily = DEFAULT_FAMILY;
184 }
185 int32_t fontStyle = 0;
186 if (fontStyleArgs->IsNumber()) {
187 fontStyle = fontStyleArgs->Int32Value(vm);
188 }
189 Color color;
190 if (!ArkTSUtils::ParseJsColorAlpha(vm, textColorArgs, color)) {
191 Color::ParseColorString("#ff182431", color);
192 }
193 std::string fontInfo =
194 StringUtils::FormatString(FORMAT_FONT.c_str(), fontSize.c_str(), weight.c_str(), fontFamily.c_str());
195 GetArkUINodeModifiers()->getDatePickerModifier()->setDisappearTextStyle(
196 nativeNode, fontInfo.c_str(), color.GetValue(), fontStyle);
197 return panda::JSValueRef::Undefined(vm);
198 }
199
ResetDisappearTextStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)200 ArkUINativeModuleValue DatePickerBridge::ResetDisappearTextStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
201 {
202 EcmaVM* vm = runtimeCallInfo->GetVM();
203 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
204 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
205 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
206 GetArkUINodeModifiers()->getDatePickerModifier()->resetDisappearTextStyle(nativeNode);
207 return panda::JSValueRef::Undefined(vm);
208 }
209
SetLunar(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue DatePickerBridge::SetLunar(ArkUIRuntimeCallInfo* runtimeCallInfo)
211 {
212 EcmaVM* vm = runtimeCallInfo->GetVM();
213 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
214 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
215 Local<JSValueRef> isLunarArg = runtimeCallInfo->GetCallArgRef(NUM_1);
216 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
217 if (isLunarArg->IsUndefined() || !isLunarArg->IsBoolean()) {
218 GetArkUINodeModifiers()->getDatePickerModifier()->resetLunar(nativeNode);
219 return panda::JSValueRef::Undefined(vm);
220 }
221 bool isLunar = isLunarArg->ToBoolean(vm)->Value();
222 GetArkUINodeModifiers()->getDatePickerModifier()->setLunar(nativeNode, isLunar);
223 return panda::JSValueRef::Undefined(vm);
224 }
225
ResetLunar(ArkUIRuntimeCallInfo * runtimeCallInfo)226 ArkUINativeModuleValue DatePickerBridge::ResetLunar(ArkUIRuntimeCallInfo* runtimeCallInfo)
227 {
228 EcmaVM* vm = runtimeCallInfo->GetVM();
229 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
230 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
231 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
232 GetArkUINodeModifiers()->getDatePickerModifier()->resetLunar(nativeNode);
233 return panda::JSValueRef::Undefined(vm);
234 }
235
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)236 ArkUINativeModuleValue DatePickerBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
237 {
238 CommonBridge::SetBackgroundColor(runtimeCallInfo);
239
240 EcmaVM* vm = runtimeCallInfo->GetVM();
241 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
242 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
243 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
244 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
245 Color color;
246 if (!ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
247 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerBackgroundColor(nativeNode);
248 } else {
249 GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerBackgroundColor(nativeNode, color.GetValue());
250 }
251 return panda::JSValueRef::Undefined(vm);
252 }
253
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)254 ArkUINativeModuleValue DatePickerBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
255 {
256 CommonBridge::ResetBackgroundColor(runtimeCallInfo);
257 EcmaVM* vm = runtimeCallInfo->GetVM();
258 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
259 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
260 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
261 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerBackgroundColor(nativeNode);
262 return panda::JSValueRef::Undefined(vm);
263 }
264
SetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue DatePickerBridge::SetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267 EcmaVM* vm = runtimeCallInfo->GetVM();
268 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
269 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
270 Local<JSValueRef> enableHapticFeedbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
271 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
272 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
273 auto nodeModifiers = GetArkUINodeModifiers();
274 CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
275 auto datePickerModifier = nodeModifiers->getDatePickerModifier();
276 CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
277 if (enableHapticFeedbackArg->IsBoolean()) {
278 bool value = enableHapticFeedbackArg->ToBoolean(vm)->Value();
279 datePickerModifier->setEnableHapticFeedback(nativeNode, value);
280 } else {
281 datePickerModifier->resetEnableHapticFeedback(nativeNode);
282 }
283 return panda::JSValueRef::Undefined(vm);
284 }
285
ResetEnableHapticFeedback(ArkUIRuntimeCallInfo * runtimeCallInfo)286 ArkUINativeModuleValue DatePickerBridge::ResetEnableHapticFeedback(ArkUIRuntimeCallInfo* runtimeCallInfo)
287 {
288 EcmaVM* vm = runtimeCallInfo->GetVM();
289 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
290 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
291 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
292 CHECK_NULL_RETURN(nativeNode, panda::NativePointerRef::New(vm, nullptr));
293 auto nodeModifiers = GetArkUINodeModifiers();
294 CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
295 auto datePickerModifier = nodeModifiers->getDatePickerModifier();
296 CHECK_NULL_RETURN(datePickerModifier, panda::NativePointerRef::New(vm, nullptr));
297 datePickerModifier->resetEnableHapticFeedback(nativeNode);
298 return panda::JSValueRef::Undefined(vm);
299 }
300
SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)301 ArkUINativeModuleValue DatePickerBridge::SetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
302 {
303 EcmaVM* vm = runtimeCallInfo->GetVM();
304 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
305 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
306 Local<JSValueRef> crownSensitivityArg =
307 runtimeCallInfo->GetCallArgRef(NUM_1);
308 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
309 uint32_t crownSensitivity = OHOS::Ace::NG::DEFAULT_CROWNSENSITIVITY;
310 if (crownSensitivityArg->IsNumber()) {
311 crownSensitivity = crownSensitivityArg->ToNumber(vm)->Value();
312 }
313 auto modifier = GetArkUINodeModifiers();
314 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
315 modifier->getDatePickerModifier()->setDatePickerDigitalCrownSensitivity(nativeNode, crownSensitivity);
316 return panda::JSValueRef::Undefined(vm);
317 }
318
ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue DatePickerBridge::ResetDigitalCrownSensitivity(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321 EcmaVM* vm = runtimeCallInfo->GetVM();
322 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
324 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
325 auto modifier = GetArkUINodeModifiers();
326 CHECK_NULL_RETURN(modifier, panda::NativePointerRef::New(vm, nullptr));
327 modifier->getDatePickerModifier()->resetDatePickerDigitalCrownSensitivity(nativeNode);
328 return panda::JSValueRef::Undefined(vm);
329 }
330
GetMSByDateToDouble(const std::string & date)331 double GetMSByDateToDouble(const std::string& date)
332 {
333 auto json = JsonUtil::ParseJsonString(date);
334 if (!json || json->IsNull()) {
335 return 0.0f;
336 }
337
338 std::tm dateTime {};
339 auto year = json->GetValue("year");
340 if (year && year->IsNumber()) {
341 dateTime.tm_year = year->GetInt() - 1900; // local date start from 1900
342 }
343 auto month = json->GetValue("month");
344 if (month && month->IsNumber()) {
345 dateTime.tm_mon = month->GetInt();
346 }
347 auto day = json->GetValue("day");
348 if (day && day->IsNumber()) {
349 dateTime.tm_mday = day->GetInt();
350 }
351 auto now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
352 auto local = std::localtime(&now);
353 CHECK_NULL_RETURN(local, 0.0f);
354 dateTime.tm_hour = local->tm_hour;
355 dateTime.tm_min = local->tm_min;
356 dateTime.tm_sec = local->tm_sec;
357 return Date::GetMilliSecondsByDateTime(dateTime);
358 }
CreateOnChange(EcmaVM * vm,const BaseEventInfo * info)359 panda::Local<panda::ObjectRef> CreateOnChange(EcmaVM* vm, const BaseEventInfo* info)
360 {
361 const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
362 Local<JSValueRef> jsonValue =
363 panda::JSON::Parse(vm, panda::StringRef::NewFromUtf8(vm, eventInfo->GetSelectedStr().c_str()));
364 if (jsonValue->IsUndefined()) {
365 return panda::JSValueRef::Undefined(vm);
366 }
367 auto datePickerResultObj = jsonValue->ToObject(vm);
368 return datePickerResultObj;
369 }
SetDatePickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)370 ArkUINativeModuleValue DatePickerBridge::SetDatePickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
371 {
372 EcmaVM* vm = runtimeCallInfo->GetVM();
373 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
374 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
375 if (argsNumber != NUM_2) {
376 return panda::JSValueRef::Undefined(vm);
377 }
378 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
379 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
380 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
381 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
382 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
383 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
384 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnChange(nativeNode);
385 return panda::JSValueRef::Undefined(vm);
386 }
387 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
388 std::function<void(const BaseEventInfo*)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
389 const BaseEventInfo* info) {
390 panda::LocalScope pandaScope(vm);
391 panda::TryCatch trycatch(vm);
392 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
393 auto dateObj = CreateOnChange(vm, info);
394 panda::Local<panda::JSValueRef> params[] = { dateObj };
395 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
396 };
397 GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerOnChange(
398 nativeNode, reinterpret_cast<void*>(&callback));
399 return panda::JSValueRef::Undefined(vm);
400 }
ResetDatePickerOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)401 ArkUINativeModuleValue DatePickerBridge::ResetDatePickerOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
402 {
403 EcmaVM* vm = runtimeCallInfo->GetVM();
404 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
405 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
406 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
407 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnChange(nativeNode);
408 return panda::JSValueRef::Undefined(vm);
409 }
410
SetDatePickerOnDateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)411 ArkUINativeModuleValue DatePickerBridge::SetDatePickerOnDateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
412 {
413 EcmaVM* vm = runtimeCallInfo->GetVM();
414 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
415 int32_t argsNumber = runtimeCallInfo->GetArgsNumber();
416 if (argsNumber != NUM_2) {
417 return panda::JSValueRef::Undefined(vm);
418 }
419 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
420 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
421 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
422 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
423 CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
424 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
425 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnDateChange(nativeNode);
426 return panda::JSValueRef::Undefined(vm);
427 }
428 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
429 std::function<void(const BaseEventInfo*)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
430 const BaseEventInfo* info) {
431 const auto* eventInfo = TypeInfoHelper::DynamicCast<DatePickerChangeEvent>(info);
432 panda::LocalScope pandaScope(vm);
433 panda::TryCatch trycatch(vm);
434 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
435 panda::Local<panda::DateRef> dateObj =
436 panda::DateRef::New(vm, GetMSByDateToDouble(eventInfo->GetSelectedStr()));
437 panda::Local<panda::JSValueRef> params[] = { dateObj };
438 func->Call(vm, func.ToLocal(), params, PARAM_ARR_LENGTH_1);
439 };
440 GetArkUINodeModifiers()->getDatePickerModifier()->setDatePickerOnDateChange(
441 nativeNode, reinterpret_cast<void*>(&callback));
442 return panda::JSValueRef::Undefined(vm);
443 }
444
ResetDatePickerOnDateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)445 ArkUINativeModuleValue DatePickerBridge::ResetDatePickerOnDateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
446 {
447 EcmaVM* vm = runtimeCallInfo->GetVM();
448 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
449 Local<JSValueRef> nativeNodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
450 auto nativeNode = nodePtr(nativeNodeArg->ToNativePointer(vm)->Value());
451 GetArkUINodeModifiers()->getDatePickerModifier()->resetDatePickerOnDateChange(nativeNode);
452 return panda::JSValueRef::Undefined(vm);
453 }
454 } // namespace OHOS::Ace::NG
455