• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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