1 /*
2 * Copyright (c) 2025 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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_stepper_bridge.h"
16
17 namespace OHOS::Ace::NG {
18 constexpr int32_t NUM_0 = 0;
19 constexpr int32_t NUM_1 = 1;
20 constexpr int32_t NUM_2 = 2;
SetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)21 ArkUINativeModuleValue StepperBridge::SetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
22 {
23 EcmaVM* vm = runtimeCallInfo->GetVM();
24 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
25 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
26 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
27 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
28 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
29 auto nodeModifiers = GetArkUINodeModifiers();
30 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
31 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
32 nodeModifiers->getStepperModifier()->resetStepperOnFinish(nativeNode);
33 return panda::JSValueRef::Undefined(vm);
34 }
35 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
36 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
37 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
38 std::function<void()> OnFinish = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
39 panda::LocalScope pandaScope(vm);
40 panda::TryCatch trycatch(vm);
41 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
42 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
43 };
44 nodeModifiers->getStepperModifier()->setStepperOnFinish(nativeNode, reinterpret_cast<void*>(&OnFinish));
45 return panda::JSValueRef::Undefined(vm);
46 }
ResetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)47 ArkUINativeModuleValue StepperBridge::ResetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
48 {
49 EcmaVM* vm = runtimeCallInfo->GetVM();
50 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
51 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
52 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
53 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
54 auto nodeModifiers = GetArkUINodeModifiers();
55 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
56 nodeModifiers->getStepperModifier()->resetStepperOnFinish(nativeNode);
57 return panda::JSValueRef::Undefined(vm);
58 }
SetOnSkip(ArkUIRuntimeCallInfo * runtimeCallInfo)59 ArkUINativeModuleValue StepperBridge::SetOnSkip(ArkUIRuntimeCallInfo* runtimeCallInfo)
60 {
61 EcmaVM* vm = runtimeCallInfo->GetVM();
62 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
63 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
64 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
65 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
66 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
67 auto nodeModifiers = GetArkUINodeModifiers();
68 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
69 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
70 nodeModifiers->getStepperModifier()->resetStepperOnSkip(nativeNode);
71 return panda::JSValueRef::Undefined(vm);
72 }
73 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
74 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
75 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
76 std::function<void()> OnSkip = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
77 panda::LocalScope pandaScope(vm);
78 panda::TryCatch trycatch(vm);
79 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
80 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
81 };
82 nodeModifiers->getStepperModifier()->setStepperOnSkip(nativeNode, reinterpret_cast<void*>(&OnSkip));
83 return panda::JSValueRef::Undefined(vm);
84 }
ResetOnSkip(ArkUIRuntimeCallInfo * runtimeCallInfo)85 ArkUINativeModuleValue StepperBridge::ResetOnSkip(ArkUIRuntimeCallInfo* runtimeCallInfo)
86 {
87 EcmaVM* vm = runtimeCallInfo->GetVM();
88 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
89 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
90 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
91 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
92 auto nodeModifiers = GetArkUINodeModifiers();
93 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
94 nodeModifiers->getStepperModifier()->resetStepperOnSkip(nativeNode);
95 return panda::JSValueRef::Undefined(vm);
96 }
97
SetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)98 ArkUINativeModuleValue StepperBridge::SetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
99 {
100 EcmaVM* vm = runtimeCallInfo->GetVM();
101 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
102 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
103 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
105 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
106 auto nodeModifiers = GetArkUINodeModifiers();
107 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
108 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
109 nodeModifiers->getStepperModifier()->resetStepperOnChange(nativeNode);
110 return panda::JSValueRef::Undefined(vm);
111 }
112 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
113 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
114 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
115 std::function<void(int32_t, int32_t)> OnChange = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
116 int32_t prevIndex, int32_t index) {
117 panda::LocalScope pandaScope(vm);
118 panda::TryCatch trycatch(vm);
119 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
120
121 panda::Local<panda::NumberRef> prevIndexParam = panda::NumberRef::New(vm, prevIndex);
122 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
123 panda::Local<panda::JSValueRef> params[NUM_2] = { prevIndexParam, indexParam };
124 func->Call(vm, func.ToLocal(), params, NUM_2);
125 };
126 nodeModifiers->getStepperModifier()->setStepperOnChange(nativeNode, reinterpret_cast<void*>(&OnChange));
127 return panda::JSValueRef::Undefined(vm);
128 }
129
ResetOnChange(ArkUIRuntimeCallInfo * runtimeCallInfo)130 ArkUINativeModuleValue StepperBridge::ResetOnChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
131 {
132 EcmaVM* vm = runtimeCallInfo->GetVM();
133 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
134 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
135 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
136 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
137 auto nodeModifiers = GetArkUINodeModifiers();
138 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
139 nodeModifiers->getStepperModifier()->resetStepperOnChange(nativeNode);
140 return panda::JSValueRef::Undefined(vm);
141 }
142
SetOnNext(ArkUIRuntimeCallInfo * runtimeCallInfo)143 ArkUINativeModuleValue StepperBridge::SetOnNext(ArkUIRuntimeCallInfo* runtimeCallInfo)
144 {
145 EcmaVM* vm = runtimeCallInfo->GetVM();
146 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
147 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
148 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
149 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
150 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
151 auto nodeModifiers = GetArkUINodeModifiers();
152 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
153 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
154 nodeModifiers->getStepperModifier()->resetStepperOnNext(nativeNode);
155 return panda::JSValueRef::Undefined(vm);
156 }
157 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
158 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
159 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
160 std::function<void(int32_t, int32_t)> OnNext = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
161 int32_t index, int32_t pendingIndex) {
162 panda::LocalScope pandaScope(vm);
163 panda::TryCatch trycatch(vm);
164 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
165
166 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
167 panda::Local<panda::NumberRef> pendingIndexPram = panda::NumberRef::New(vm, pendingIndex);
168 panda::Local<panda::JSValueRef> params[NUM_2] = { indexParam, pendingIndexPram };
169 func->Call(vm, func.ToLocal(), params, NUM_2);
170 };
171 nodeModifiers->getStepperModifier()->setStepperOnNext(nativeNode, reinterpret_cast<void*>(&OnNext));
172 return panda::JSValueRef::Undefined(vm);
173 }
174
ResetOnNext(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue StepperBridge::ResetOnNext(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177 EcmaVM* vm = runtimeCallInfo->GetVM();
178 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
179 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
180 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
181 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
182 auto nodeModifiers = GetArkUINodeModifiers();
183 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
184 nodeModifiers->getStepperModifier()->resetStepperOnNext(nativeNode);
185 return panda::JSValueRef::Undefined(vm);
186 }
187
SetOnPrevious(ArkUIRuntimeCallInfo * runtimeCallInfo)188 ArkUINativeModuleValue StepperBridge::SetOnPrevious(ArkUIRuntimeCallInfo* runtimeCallInfo)
189 {
190 EcmaVM* vm = runtimeCallInfo->GetVM();
191 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
192 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
193 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
194 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
195 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
196 auto nodeModifiers = GetArkUINodeModifiers();
197 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
198 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
199 nodeModifiers->getStepperModifier()->resetStepperOnPrevious(nativeNode);
200 return panda::JSValueRef::Undefined(vm);
201 }
202 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
203 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
204 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
205 std::function<void(int32_t, int32_t)> OnPrevious = [vm, func = panda::CopyableGlobal(vm, func), frameNode](
206 int32_t index, int32_t pendingIndex) {
207 panda::LocalScope pandaScope(vm);
208 panda::TryCatch trycatch(vm);
209 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
210
211 panda::Local<panda::NumberRef> indexParam = panda::NumberRef::New(vm, index);
212 panda::Local<panda::NumberRef> pendingIndexPram = panda::NumberRef::New(vm, pendingIndex);
213 panda::Local<panda::JSValueRef> params[NUM_2] = { indexParam, pendingIndexPram };
214 func->Call(vm, func.ToLocal(), params, NUM_2);
215 };
216 nodeModifiers->getStepperModifier()->setStepperOnPrevious(
217 nativeNode, reinterpret_cast<void*>(&OnPrevious));
218 return panda::JSValueRef::Undefined(vm);
219 }
220
ResetOnPrevious(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue StepperBridge::ResetOnPrevious(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223 EcmaVM* vm = runtimeCallInfo->GetVM();
224 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
225 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
226 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
227 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228 auto nodeModifiers = GetArkUINodeModifiers();
229 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
230 nodeModifiers->getStepperModifier()->resetStepperOnPrevious(nativeNode);
231 return panda::JSValueRef::Undefined(vm);
232 }
233 } // namespace OHOS::Ace::NG