@react-native-ohos/react-native-pager-view 6.2.4-rc.4
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.
- package/LICENSE +21 -0
- package/README.md +15 -0
- package/harmony/pager_view/LICENSE +21 -0
- package/harmony/pager_view/NOTICE +33 -0
- package/harmony/pager_view/README.OpenSource +11 -0
- package/harmony/pager_view/build-profile.json5 +9 -0
- package/harmony/pager_view/consumer-rules.txt +0 -0
- package/harmony/pager_view/hvigorfile.ts +6 -0
- package/harmony/pager_view/index.ets +26 -0
- package/harmony/pager_view/obfuscation-rules.txt +18 -0
- package/harmony/pager_view/oh-package.json5 +14 -0
- package/harmony/pager_view/src/main/cpp/CMakeLists.txt +9 -0
- package/harmony/pager_view/src/main/cpp/RNCViewPagerTurbomodule.cpp +42 -0
- package/harmony/pager_view/src/main/cpp/RNCViewPagerTurbomodule.h +37 -0
- package/harmony/pager_view/src/main/cpp/SwiperNode.cpp +403 -0
- package/harmony/pager_view/src/main/cpp/SwiperNode.h +120 -0
- package/harmony/pager_view/src/main/cpp/ViewPagerComponentInstance.cpp +247 -0
- package/harmony/pager_view/src/main/cpp/ViewPagerComponentInstance.h +106 -0
- package/harmony/pager_view/src/main/cpp/ViewPagerPackage.h +64 -0
- package/harmony/pager_view/src/main/cpp/generated/RNOH/generated/BaseReactNativePagerViewPackage.h +70 -0
- package/harmony/pager_view/src/main/cpp/generated/RNOH/generated/components/BaseRNCViewPagerComponentInstance.h +16 -0
- package/harmony/pager_view/src/main/cpp/generated/RNOH/generated/components/RNCViewPagerJSIBinder.h +41 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/ComponentDescriptors.h +22 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/EventEmitters.cpp +43 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/EventEmitters.h +47 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/Props.cpp +38 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/Props.h +139 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/ShadowNodes.cpp +19 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/ShadowNodes.h +34 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/States.cpp +16 -0
- package/harmony/pager_view/src/main/cpp/generated/react/renderer/components/react_native_pager_view/States.h +38 -0
- package/harmony/pager_view/src/main/ets/Logger.ets +64 -0
- package/harmony/pager_view/src/main/ets/RNCViewPager.ets +281 -0
- package/harmony/pager_view/src/main/ets/RNCViewPagerManager.ets +58 -0
- package/harmony/pager_view/src/main/ets/ViewPagerModule.ts +34 -0
- package/harmony/pager_view/src/main/ets/ViewPagerPackage.ets +57 -0
- package/harmony/pager_view/src/main/module.json5 +7 -0
- package/harmony/pager_view/src/main/resources/base/element/string.json +8 -0
- package/harmony/pager_view/src/main/resources/en_US/element/string.json +8 -0
- package/harmony/pager_view/src/main/resources/zh_CN/element/string.json +8 -0
- package/harmony/pager_view/ts.ets +26 -0
- package/harmony/pager_view.har +0 -0
- package/lib/commonjs/PagerView.js +145 -0
- package/lib/commonjs/PagerView.js.map +1 -0
- package/lib/commonjs/PagerViewNativeComponent.js +14 -0
- package/lib/commonjs/PagerViewNativeComponent.js.map +1 -0
- package/lib/commonjs/index.js +9 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/utils.js +28 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/module/PagerView.js +138 -0
- package/lib/module/PagerView.js.map +1 -0
- package/lib/module/PagerViewNativeComponent.js +7 -0
- package/lib/module/PagerViewNativeComponent.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/utils.js +20 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/typescript/PagerView.d.ts +70 -0
- package/lib/typescript/PagerViewNativeComponent.d.ts +36 -0
- package/lib/typescript/index.d.ts +8 -0
- package/lib/typescript/utils.d.ts +2 -0
- package/package.json +142 -0
- package/src/PagerView.tsx +163 -0
- package/src/PagerViewNativeComponent.ts +67 -0
- package/src/index.tsx +26 -0
- package/src/utils.tsx +19 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIT License
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2024 Huawei Device Co., Ltd.
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
* copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
#include "ViewPagerComponentInstance.h"
|
|
26
|
+
#include <arkui/native_gesture.h>
|
|
27
|
+
#include <arkui/native_interface.h>
|
|
28
|
+
#define DURATION_MILLISECONDS 400
|
|
29
|
+
|
|
30
|
+
namespace rnoh {
|
|
31
|
+
|
|
32
|
+
ViewPagerComponentInstance::ViewPagerComponentInstance(Context context)
|
|
33
|
+
: BaseRNCViewPagerComponentInstance(std::move(context))
|
|
34
|
+
{
|
|
35
|
+
m_swiperNode.setSwiperNodeDelegate(this);
|
|
36
|
+
this->regsiterGestureEvent();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void ViewPagerComponentInstance::onChildInserted(ComponentInstance::Shared const &childComponentInstance,
|
|
40
|
+
std::size_t index)
|
|
41
|
+
{
|
|
42
|
+
super::onChildInserted(childComponentInstance, index);
|
|
43
|
+
m_swiperNode.insertChild(childComponentInstance->getLocalRootArkUINode(), index);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
SwiperNode &ViewPagerComponentInstance::getLocalRootArkUINode() { return m_swiperNode; }
|
|
47
|
+
|
|
48
|
+
void ViewPagerComponentInstance::onChildRemoved(ComponentInstance::Shared const &childComponentInstance)
|
|
49
|
+
{
|
|
50
|
+
super::onChildRemoved(childComponentInstance);
|
|
51
|
+
m_swiperNode.removeChild(childComponentInstance->getLocalRootArkUINode());
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
void ViewPagerComponentInstance::onPropsChanged(SharedConcreteProps const &props)
|
|
55
|
+
{
|
|
56
|
+
super::onPropsChanged(props);
|
|
57
|
+
DLOG(INFO) << "ViewPagerComponentInstance::onPropsChanged: initialPage:" << props->initialPage
|
|
58
|
+
<< " scrollEnabled:" << props->scrollEnabled << " orientation:" << facebook::react::toString(props->orientation)
|
|
59
|
+
<< " keyboardDismissMode:" << facebook::react::toString(props->keyboardDismissMode)
|
|
60
|
+
<< " layoutDirection:" << facebook::react::toString(props->layoutDirection)
|
|
61
|
+
<< " pageMargin:" << props->pageMargin << " offscreenPageLimit:" << props->offscreenPageLimit
|
|
62
|
+
<< " overdrag:" << props->overdrag << " overScrollMode:" << facebook::react::toString(props->overScrollMode);
|
|
63
|
+
this->m_scrollEnabled = props->scrollEnabled;
|
|
64
|
+
if (this->m_isInitialPage) this->m_pageIndex = props->initialPage;
|
|
65
|
+
this->m_keyboardDismissMode = facebook::react::toString(props->keyboardDismissMode);
|
|
66
|
+
this->getLocalRootArkUINode().setVertical(facebook::react::toString(props->orientation));
|
|
67
|
+
this->getLocalRootArkUINode().setDirection(facebook::react::toString(props->layoutDirection));
|
|
68
|
+
this->getLocalRootArkUINode().setItemSpace(props->pageMargin);
|
|
69
|
+
this->getLocalRootArkUINode().setDisableSwipe(!props->scrollEnabled);
|
|
70
|
+
this->getLocalRootArkUINode().setLoop(false);
|
|
71
|
+
this->getLocalRootArkUINode().setIndicator(false);
|
|
72
|
+
this->getLocalRootArkUINode().setCachedCount(props->offscreenPageLimit);
|
|
73
|
+
this->getLocalRootArkUINode().setCurve(ARKUI_CURVE_SMOOTH);
|
|
74
|
+
this->getLocalRootArkUINode().setDuration(DURATION_MILLISECONDS);
|
|
75
|
+
if (props->overdrag) {
|
|
76
|
+
this->getLocalRootArkUINode().setEffectMode("SPRING");
|
|
77
|
+
} else {
|
|
78
|
+
if (facebook::react::toString(props->overScrollMode) == "never") {
|
|
79
|
+
this->getLocalRootArkUINode().setEffectMode("NONE");
|
|
80
|
+
} else {
|
|
81
|
+
this->getLocalRootArkUINode().setEffectMode("FADE");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void ViewPagerComponentInstance::onPageSelected(double pageIndex)
|
|
87
|
+
{
|
|
88
|
+
this->m_pageIndex = pageIndex;
|
|
89
|
+
DLOG(INFO) << "ViewPagerComponentInstance::onPageSelected:" << pageIndex;
|
|
90
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageSelected event = {pageIndex};
|
|
91
|
+
m_eventEmitter->onPageSelected(event);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void ViewPagerComponentInstance::onPageScroll(
|
|
95
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScroll pageScroll)
|
|
96
|
+
{
|
|
97
|
+
DLOG(INFO) << "ViewPagerComponentInstance::onPageScroll";
|
|
98
|
+
m_eventEmitter->onPageScroll(pageScroll);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
void ViewPagerComponentInstance::onPageScrollStateChanged(
|
|
102
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChanged value)
|
|
103
|
+
{
|
|
104
|
+
DLOG(INFO) << "ViewPagerComponentInstance::onPageScrollStateChanged";
|
|
105
|
+
m_eventEmitter->onPageScrollStateChanged(value);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
void ViewPagerComponentInstance::handleCommand(std::string const &commandName,
|
|
109
|
+
folly::dynamic const &args)
|
|
110
|
+
{
|
|
111
|
+
DLOG(INFO) << "handleCommand-->commandName: " << commandName;
|
|
112
|
+
if (commandName == "setScrollEnabledImperatively" && args.isArray() && args.size() == 1) {
|
|
113
|
+
DLOG(INFO) << "handleCommand-->setScrollEnabledImperatively: " << args[0];
|
|
114
|
+
this->m_scrollEnabled = args[0].asBool();
|
|
115
|
+
this->getLocalRootArkUINode().setDisableSwipe(!args[0].asBool());
|
|
116
|
+
if (!args[0].asBool()) {
|
|
117
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChanged event = {
|
|
118
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChangedPageScrollState::IDLE};
|
|
119
|
+
m_eventEmitter->onPageScrollStateChanged(event);
|
|
120
|
+
}
|
|
121
|
+
} else if (commandName == "setPage" && args.isArray() && args.size() == 1) {
|
|
122
|
+
this->m_clickTap = true;
|
|
123
|
+
DLOG(INFO) << "handleCommand-->setPage: " << args[0];
|
|
124
|
+
this->getLocalRootArkUINode().setIndex(args[0].asInt());
|
|
125
|
+
} else if (commandName == "setPageWithoutAnimation" && args.isArray() && args.size() == 1) {
|
|
126
|
+
DLOG(INFO) << "handleCommand-->setPageWithoutAnimation: " << args[0];
|
|
127
|
+
this->m_clickTap = true;
|
|
128
|
+
this->getLocalRootArkUINode().setIndexNoAnimation(args[0].asInt());
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
bool ViewPagerComponentInstance::getScrollEnabled() { return this->m_scrollEnabled; }
|
|
133
|
+
|
|
134
|
+
bool ViewPagerComponentInstance::getNativeLock() { return this->m_nativeLock; }
|
|
135
|
+
|
|
136
|
+
std::vector<TouchTarget::Shared> ViewPagerComponentInstance::getTouchTargetChildren()
|
|
137
|
+
{
|
|
138
|
+
auto children = getChildren();
|
|
139
|
+
std::vector<TouchTarget::Shared> result;
|
|
140
|
+
result.push_back(children.at(m_pageIndex));
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
void ViewPagerComponentInstance::setKeyboardDismiss()
|
|
145
|
+
{
|
|
146
|
+
DLOG(INFO) << "ViewPagerComponentInstance::setKeyboardDismiss: " << this->m_keyboardDismissMode;
|
|
147
|
+
if (this->m_keyboardDismissMode != "on-drag") {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
auto rnInstancePtr = this->m_deps->rnInstance.lock();
|
|
151
|
+
if (rnInstancePtr != nullptr) {
|
|
152
|
+
auto turboModule = rnInstancePtr->getTurboModule("RNCViewPagerContext");
|
|
153
|
+
auto arkTsTurboModule = std::dynamic_pointer_cast<rnoh::ArkTSTurboModule>(turboModule);
|
|
154
|
+
arkTsTurboModule->callSync("keyboardDismiss", {});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
void ViewPagerComponentInstance::onNativeResponderBlockChange(bool isBlocked)
|
|
159
|
+
{
|
|
160
|
+
DLOG(INFO) << "ViewPagerComponentInstance::setNativeResponderBlocked:" << isBlocked;
|
|
161
|
+
if (isBlocked) {
|
|
162
|
+
this->m_nativeLock = true;
|
|
163
|
+
this->getLocalRootArkUINode().setDisableSwipe(true);
|
|
164
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChanged event = {
|
|
165
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChangedPageScrollState::IDLE};
|
|
166
|
+
m_eventEmitter->onPageScrollStateChanged(event);
|
|
167
|
+
} else {
|
|
168
|
+
this->m_nativeLock = false;
|
|
169
|
+
if (!this->m_scrollEnabled) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
this->getLocalRootArkUINode().setDisableSwipe(false);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
void ViewPagerComponentInstance::setGestureStatus(bool gestureStatus)
|
|
177
|
+
{
|
|
178
|
+
this->m_gestureStatus = gestureStatus;
|
|
179
|
+
DLOG(INFO) << "ViewPagerComponentInstance::setGestureStatus:" << gestureStatus;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
bool ViewPagerComponentInstance::isHandlingTouches() const
|
|
183
|
+
{
|
|
184
|
+
DLOG(INFO) << "ViewPagerComponentInstance::isHandlingTouches:" << this->m_gestureStatus;
|
|
185
|
+
return this->m_gestureStatus;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
void ViewPagerComponentInstance::regsiterGestureEvent()
|
|
189
|
+
{
|
|
190
|
+
DLOG(INFO) << "ViewPagerComponentInstance::regsiterGestureEvent";
|
|
191
|
+
auto gestureApi = OH_ArkUI_QueryModuleInterfaceByName(ARKUI_NATIVE_GESTURE, "ArkUI_NativeGestureAPI_1");
|
|
192
|
+
auto swiperGestureApi = reinterpret_cast<ArkUI_NativeGestureAPI_1 *>(gestureApi);
|
|
193
|
+
auto swiperGestureRecognizer = swiperGestureApi->createPanGesture(1, GESTURE_DIRECTION_ALL, 50);
|
|
194
|
+
auto onPanActionCallBack = [](ArkUI_GestureEvent *event, void *extraParam) {
|
|
195
|
+
PanActionCallBack *panActionCallBack = (PanActionCallBack *)extraParam;
|
|
196
|
+
ArkUI_GestureEventActionType actionType = OH_ArkUI_GestureEvent_GetActionType(event);
|
|
197
|
+
if (actionType == GESTURE_EVENT_ACTION_END) {
|
|
198
|
+
DLOG(INFO) << "ViewPagerComponentInstance::regsiterGestureEvent GESTURE_EVENT_ACTION_END";
|
|
199
|
+
panActionCallBack->swiperNodeDelegate->setGestureStatus(false);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
PanActionCallBack *panActionCallBack = new PanActionCallBack{
|
|
203
|
+
.swiperNodeDelegate = this,
|
|
204
|
+
};
|
|
205
|
+
swiperGestureApi->setGestureEventTarget(
|
|
206
|
+
swiperGestureRecognizer, GESTURE_EVENT_ACTION_ACCEPT | GESTURE_EVENT_ACTION_UPDATE | GESTURE_EVENT_ACTION_END,
|
|
207
|
+
panActionCallBack, onPanActionCallBack);
|
|
208
|
+
swiperGestureApi->addGestureToNode(this->getLocalRootArkUINode().getArkUINodeHandle(), swiperGestureRecognizer,
|
|
209
|
+
PARALLEL, NORMAL_GESTURE_MASK);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
bool ViewPagerComponentInstance::getClickTap() { return this->m_clickTap; }
|
|
213
|
+
|
|
214
|
+
void ViewPagerComponentInstance::setClickTap(bool clickTap) { this->m_clickTap = clickTap; }
|
|
215
|
+
|
|
216
|
+
void ViewPagerComponentInstance::sendEventAnimationsPageScroll(
|
|
217
|
+
facebook::react::RNCViewPagerEventEmitter::OnPageScroll pageScroll)
|
|
218
|
+
{
|
|
219
|
+
auto nativeAnimatedTurboModule = m_swiperNativeAnimatedTurboModule.lock();
|
|
220
|
+
if (nativeAnimatedTurboModule == nullptr) {
|
|
221
|
+
auto instance = m_deps->rnInstance.lock();
|
|
222
|
+
if (instance == nullptr) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
nativeAnimatedTurboModule = instance->getTurboModule<NativeAnimatedTurboModule>("NativeAnimatedTurboModule");
|
|
226
|
+
m_swiperNativeAnimatedTurboModule = nativeAnimatedTurboModule;
|
|
227
|
+
}
|
|
228
|
+
if (nativeAnimatedTurboModule != nullptr) {
|
|
229
|
+
using folly::dynamic;
|
|
230
|
+
dynamic payload = dynamic::object("position", pageScroll.position)("offset", pageScroll.offset);
|
|
231
|
+
nativeAnimatedTurboModule->handleComponentEvent(m_tag, "onPageScroll", payload);
|
|
232
|
+
DLOG(INFO) << "ViewPagerComponentInstance::sendEventAnimationsPageScroll position "
|
|
233
|
+
<< pageScroll.position
|
|
234
|
+
<< " offset " << pageScroll.offset;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
void ViewPagerComponentInstance::onSwiperAppear()
|
|
239
|
+
{
|
|
240
|
+
DLOG(INFO) << "ViewPagerComponentInstance onSwiperAppear m_isInitialPage:"
|
|
241
|
+
<< this->m_isInitialPage << " m_pageIndex:" << this->m_pageIndex;
|
|
242
|
+
if (this->m_isInitialPage) {
|
|
243
|
+
this->m_isInitialPage = false;
|
|
244
|
+
this->getLocalRootArkUINode().setIndexNoAnimation(this->m_pageIndex);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
} // namespace rnoh
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIT License
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2024 Huawei Device Co., Ltd.
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
* copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
#ifndef VIEWPAGERCOMPONENTINSTANCE_H
|
|
25
|
+
#define VIEWPAGERCOMPONENTINSTANCE_H
|
|
26
|
+
#pragma once
|
|
27
|
+
#include "SwiperNode.h"
|
|
28
|
+
#include <folly/dynamic.h>
|
|
29
|
+
#include "RNOHCorePackage/TurboModules/Animated/NativeAnimatedTurboModule.h"
|
|
30
|
+
#include "generated/RNOH/generated/components/BaseRNCViewPagerComponentInstance.h"
|
|
31
|
+
|
|
32
|
+
namespace rnoh {
|
|
33
|
+
class ViewPagerComponentInstance : public BaseRNCViewPagerComponentInstance, public SwiperNodeDelegate {
|
|
34
|
+
|
|
35
|
+
using super = BaseRNCViewPagerComponentInstance;
|
|
36
|
+
|
|
37
|
+
private:
|
|
38
|
+
SwiperNode m_swiperNode;
|
|
39
|
+
|
|
40
|
+
double m_pageIndex;
|
|
41
|
+
|
|
42
|
+
bool m_scrollEnabled = false;
|
|
43
|
+
|
|
44
|
+
bool m_nativeLock = false;
|
|
45
|
+
|
|
46
|
+
std::string m_keyboardDismissMode;
|
|
47
|
+
|
|
48
|
+
bool m_gestureStatus = false;
|
|
49
|
+
|
|
50
|
+
bool m_clickTap = false;
|
|
51
|
+
|
|
52
|
+
bool m_gestureSwipe = false;
|
|
53
|
+
|
|
54
|
+
bool m_isInitialPage = true;
|
|
55
|
+
|
|
56
|
+
struct PanActionCallBack {
|
|
57
|
+
SwiperNodeDelegate *swiperNodeDelegate;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
std::weak_ptr<NativeAnimatedTurboModule> m_swiperNativeAnimatedTurboModule{};
|
|
61
|
+
|
|
62
|
+
public:
|
|
63
|
+
explicit ViewPagerComponentInstance(Context context);
|
|
64
|
+
|
|
65
|
+
void onChildInserted(ComponentInstance::Shared const &childComponentInstance, std::size_t index) override;
|
|
66
|
+
|
|
67
|
+
void onChildRemoved(ComponentInstance::Shared const &childComponentInstance) override;
|
|
68
|
+
|
|
69
|
+
SwiperNode &getLocalRootArkUINode() override;
|
|
70
|
+
|
|
71
|
+
void onPropsChanged(SharedConcreteProps const &props) override;
|
|
72
|
+
|
|
73
|
+
void onPageSelected(double pageIndex) override;
|
|
74
|
+
|
|
75
|
+
void onPageScroll(facebook::react::RNCViewPagerEventEmitter::OnPageScroll pageScroll) override;
|
|
76
|
+
|
|
77
|
+
void onPageScrollStateChanged(facebook::react::RNCViewPagerEventEmitter::OnPageScrollStateChanged value) override;
|
|
78
|
+
|
|
79
|
+
void handleCommand(std::string const &commandName, folly::dynamic const &args) override;
|
|
80
|
+
|
|
81
|
+
std::vector<TouchTarget::Shared> getTouchTargetChildren() override;
|
|
82
|
+
|
|
83
|
+
bool getScrollEnabled() override;
|
|
84
|
+
|
|
85
|
+
bool getNativeLock() override;
|
|
86
|
+
|
|
87
|
+
void setKeyboardDismiss() override;
|
|
88
|
+
|
|
89
|
+
void onNativeResponderBlockChange(bool isBlocked) override;
|
|
90
|
+
|
|
91
|
+
void setGestureStatus(bool gestureStatus) override;
|
|
92
|
+
|
|
93
|
+
bool isHandlingTouches() const override;
|
|
94
|
+
|
|
95
|
+
bool getClickTap() override;
|
|
96
|
+
|
|
97
|
+
void setClickTap(bool clickTap) override;
|
|
98
|
+
|
|
99
|
+
void regsiterGestureEvent();
|
|
100
|
+
|
|
101
|
+
void sendEventAnimationsPageScroll(facebook::react::RNCViewPagerEventEmitter::OnPageScroll pageScroll) override;
|
|
102
|
+
|
|
103
|
+
void onSwiperAppear() override;
|
|
104
|
+
};
|
|
105
|
+
} // namespace rnoh
|
|
106
|
+
#endif
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MIT License
|
|
3
|
+
*
|
|
4
|
+
* Copyright (C) 2023 Huawei Device Co., Ltd.
|
|
5
|
+
*
|
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
* furnished to do so, subject to the following conditions:
|
|
12
|
+
*
|
|
13
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
* copies or substantial portions of the Software.
|
|
15
|
+
*
|
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
* SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
#ifndef HARMONY_PAGERVIEW_SRC_MAIN_CPP_VIEWPAGERPACKAGE_H
|
|
25
|
+
#define HARMONY_PAGERVIEW_SRC_MAIN_CPP_VIEWPAGERPACKAGE_H
|
|
26
|
+
#include "ViewPagerComponentInstance.h"
|
|
27
|
+
#include "RNCViewPagerTurbomodule.h"
|
|
28
|
+
#include "generated/RNOH/generated/BaseReactNativePagerViewPackage.h"
|
|
29
|
+
using namespace rnoh;
|
|
30
|
+
using namespace facebook;
|
|
31
|
+
namespace rnoh {
|
|
32
|
+
|
|
33
|
+
class RNCViewPagerContextFactoryDelegate : public TurboModuleFactoryDelegate {
|
|
34
|
+
public:
|
|
35
|
+
SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override
|
|
36
|
+
{
|
|
37
|
+
if (name == "RNCViewPagerContext") {
|
|
38
|
+
return std::make_shared<RNCViewPagerTurbomodule>(ctx, name);
|
|
39
|
+
}
|
|
40
|
+
return nullptr;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
class ViewPagerPackage : public BaseReactNativePagerViewPackage {
|
|
45
|
+
using Super = BaseReactNativePagerViewPackage;
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
ViewPagerPackage(Package::Context ctx) : Super(ctx) {}
|
|
49
|
+
|
|
50
|
+
ComponentInstance::Shared createComponentInstance(const ComponentInstance::Context &ctx)
|
|
51
|
+
{
|
|
52
|
+
if (ctx.componentName == "RNCViewPager") {
|
|
53
|
+
return std::make_shared<ViewPagerComponentInstance>(ctx);
|
|
54
|
+
}
|
|
55
|
+
return nullptr;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
std::unique_ptr<TurboModuleFactoryDelegate> createTurboModuleFactoryDelegate() override
|
|
59
|
+
{
|
|
60
|
+
return std::make_unique<RNCViewPagerContextFactoryDelegate>();
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
} // namespace rnoh
|
|
64
|
+
#endif
|
package/harmony/pager_view/src/main/cpp/generated/RNOH/generated/BaseReactNativePagerViewPackage.h
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by "react-native codegen-lib-harmony"
|
|
3
|
+
*/
|
|
4
|
+
#pragma once
|
|
5
|
+
|
|
6
|
+
#include <react/renderer/components/react_native_pager_view/ComponentDescriptors.h>
|
|
7
|
+
#include "RNOH/Package.h"
|
|
8
|
+
#include "RNOH/ArkTSTurboModule.h"
|
|
9
|
+
#include "RNOH/generated/components/RNCViewPagerJSIBinder.h"
|
|
10
|
+
|
|
11
|
+
namespace rnoh {
|
|
12
|
+
|
|
13
|
+
class BaseReactNativePagerViewPackageTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
|
|
14
|
+
public:
|
|
15
|
+
SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override
|
|
16
|
+
{
|
|
17
|
+
return nullptr;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
class BaseReactNativePagerViewPackageEventEmitRequestHandler : public EventEmitRequestHandler {
|
|
22
|
+
public:
|
|
23
|
+
void handleEvent(Context const &ctx) override
|
|
24
|
+
{
|
|
25
|
+
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<facebook::react::EventEmitter>(ctx.tag);
|
|
26
|
+
if (eventEmitter == nullptr) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
std::vector<std::string> supportedEventNames = {
|
|
30
|
+
};
|
|
31
|
+
if (std::find(supportedEventNames.begin(),
|
|
32
|
+
supportedEventNames.end(), ctx.eventName) != supportedEventNames.end()) {
|
|
33
|
+
eventEmitter->dispatchEvent(ctx.eventName, ArkJS(ctx.env).getDynamic(ctx.payload));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class BaseReactNativePagerViewPackage : public Package {
|
|
40
|
+
public:
|
|
41
|
+
BaseReactNativePagerViewPackage(Package::Context ctx) : Package(ctx){};
|
|
42
|
+
|
|
43
|
+
std::unique_ptr<TurboModuleFactoryDelegate> createTurboModuleFactoryDelegate() override
|
|
44
|
+
{
|
|
45
|
+
return std::make_unique<BaseReactNativePagerViewPackageTurboModuleFactoryDelegate>();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
std::vector<facebook::react::ComponentDescriptorProvider> createComponentDescriptorProviders() override
|
|
49
|
+
{
|
|
50
|
+
return {
|
|
51
|
+
facebook::react::concreteComponentDescriptorProvider<facebook::react::RNCViewPagerComponentDescriptor>(),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
ComponentJSIBinderByString createComponentJSIBinderByName() override
|
|
56
|
+
{
|
|
57
|
+
return {
|
|
58
|
+
{"RNCViewPager", std::make_shared<RNCViewPagerJSIBinder>()},
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
EventEmitRequestHandlers createEventEmitRequestHandlers() override
|
|
63
|
+
{
|
|
64
|
+
return {
|
|
65
|
+
std::make_shared<BaseReactNativePagerViewPackageEventEmitRequestHandler>(),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
} // namespace rnoh
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by "react-native codegen-lib-harmony"
|
|
4
|
+
*/
|
|
5
|
+
#pragma once
|
|
6
|
+
|
|
7
|
+
#include "RNOH/CppComponentInstance.h"
|
|
8
|
+
#include <react/renderer/components/react_native_pager_view/ShadowNodes.h>
|
|
9
|
+
|
|
10
|
+
namespace rnoh {
|
|
11
|
+
class BaseRNCViewPagerComponentInstance
|
|
12
|
+
: public CppComponentInstance<facebook::react::RNCViewPagerShadowNode> {
|
|
13
|
+
public:
|
|
14
|
+
using CppComponentInstance::CppComponentInstance;
|
|
15
|
+
};
|
|
16
|
+
} // namespace rnoh
|
package/harmony/pager_view/src/main/cpp/generated/RNOH/generated/components/RNCViewPagerJSIBinder.h
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by "react-native codegen-lib-harmony"
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#pragma once
|
|
6
|
+
#include "RNOHCorePackage/ComponentBinders/ViewComponentJSIBinder.h"
|
|
7
|
+
|
|
8
|
+
namespace rnoh {
|
|
9
|
+
class RNCViewPagerJSIBinder : public ViewComponentJSIBinder {
|
|
10
|
+
protected:
|
|
11
|
+
facebook::jsi::Object createNativeProps(facebook::jsi::Runtime &rt) override
|
|
12
|
+
{
|
|
13
|
+
auto object = ViewComponentJSIBinder::createNativeProps(rt);
|
|
14
|
+
object.setProperty(rt, "scrollEnabled", true);
|
|
15
|
+
object.setProperty(rt, "layoutDirection", true);
|
|
16
|
+
object.setProperty(rt, "initialPage", true);
|
|
17
|
+
object.setProperty(rt, "orientation", true);
|
|
18
|
+
object.setProperty(rt, "offscreenPageLimit", true);
|
|
19
|
+
object.setProperty(rt, "pageMargin", true);
|
|
20
|
+
object.setProperty(rt, "overScrollMode", true);
|
|
21
|
+
object.setProperty(rt, "overdrag", true);
|
|
22
|
+
object.setProperty(rt, "keyboardDismissMode", true);
|
|
23
|
+
return object;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
facebook::jsi::Object createBubblingEventTypes(facebook::jsi::Runtime &rt) override
|
|
27
|
+
{
|
|
28
|
+
facebook::jsi::Object events(rt);
|
|
29
|
+
return events;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override
|
|
33
|
+
{
|
|
34
|
+
facebook::jsi::Object events(rt);
|
|
35
|
+
events.setProperty(rt, "topPageScroll", createDirectEvent(rt, "onPageScroll"));
|
|
36
|
+
events.setProperty(rt, "topPageSelected", createDirectEvent(rt, "onPageSelected"));
|
|
37
|
+
events.setProperty(rt, "topPageScrollStateChanged", createDirectEvent(rt, "onPageScrollStateChanged"));
|
|
38
|
+
return events;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
} // namespace rnoh
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateComponentDescriptorH.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include <react/renderer/components/react_native_pager_view/ShadowNodes.h>
|
|
14
|
+
#include <react/renderer/core/ConcreteComponentDescriptor.h>
|
|
15
|
+
|
|
16
|
+
namespace facebook {
|
|
17
|
+
namespace react {
|
|
18
|
+
|
|
19
|
+
using RNCViewPagerComponentDescriptor = ConcreteComponentDescriptor<RNCViewPagerShadowNode>;
|
|
20
|
+
|
|
21
|
+
} // namespace react
|
|
22
|
+
} // namespace facebook
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateEventEmitterCpp.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include <react/renderer/components/react_native_pager_view/EventEmitters.h>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
namespace facebook {
|
|
15
|
+
namespace react {
|
|
16
|
+
|
|
17
|
+
void RNCViewPagerEventEmitter::onPageScroll(OnPageScroll $event) const
|
|
18
|
+
{
|
|
19
|
+
dispatchEvent("pageScroll", [$event = std::move($event)](jsi::Runtime &runtime) {
|
|
20
|
+
auto $payload = jsi::Object(runtime);
|
|
21
|
+
$payload.setProperty(runtime, "position", $event.position);
|
|
22
|
+
$payload.setProperty(runtime, "offset", $event.offset);
|
|
23
|
+
return $payload;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
void RNCViewPagerEventEmitter::onPageSelected(OnPageSelected $event) const
|
|
27
|
+
{
|
|
28
|
+
dispatchEvent("pageSelected", [$event = std::move($event)](jsi::Runtime &runtime) {
|
|
29
|
+
auto $payload = jsi::Object(runtime);
|
|
30
|
+
$payload.setProperty(runtime, "position", $event.position);
|
|
31
|
+
return $payload;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
void RNCViewPagerEventEmitter::onPageScrollStateChanged(OnPageScrollStateChanged $event) const
|
|
35
|
+
{
|
|
36
|
+
dispatchEvent("pageScrollStateChanged", [$event = std::move($event)](jsi::Runtime &runtime) {
|
|
37
|
+
auto $payload = jsi::Object(runtime);
|
|
38
|
+
$payload.setProperty(runtime, "pageScrollState", toString($event.pageScrollState));
|
|
39
|
+
return $payload;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
} // namespace react
|
|
43
|
+
} // namespace facebook
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateEventEmitterH.js
|
|
9
|
+
*/
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
#include <react/renderer/components/view/ViewEventEmitter.h>
|
|
13
|
+
|
|
14
|
+
namespace facebook {
|
|
15
|
+
namespace react {
|
|
16
|
+
class RNCViewPagerEventEmitter : public ViewEventEmitter {
|
|
17
|
+
public:
|
|
18
|
+
using ViewEventEmitter::ViewEventEmitter;
|
|
19
|
+
struct OnPageScroll {
|
|
20
|
+
double position;
|
|
21
|
+
double offset;
|
|
22
|
+
};
|
|
23
|
+
struct OnPageSelected {
|
|
24
|
+
double position;
|
|
25
|
+
};
|
|
26
|
+
enum class OnPageScrollStateChangedPageScrollState {
|
|
27
|
+
IDLE,
|
|
28
|
+
DRAGGING,
|
|
29
|
+
SETTLING
|
|
30
|
+
};
|
|
31
|
+
static char const *toString(const OnPageScrollStateChangedPageScrollState value)
|
|
32
|
+
{
|
|
33
|
+
switch (value) {
|
|
34
|
+
case OnPageScrollStateChangedPageScrollState::IDLE: return "idle";
|
|
35
|
+
case OnPageScrollStateChangedPageScrollState::DRAGGING: return "dragging";
|
|
36
|
+
case OnPageScrollStateChangedPageScrollState::SETTLING: return "settling";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
struct OnPageScrollStateChanged {
|
|
40
|
+
OnPageScrollStateChangedPageScrollState pageScrollState;
|
|
41
|
+
};
|
|
42
|
+
void onPageScroll(OnPageScroll value) const;
|
|
43
|
+
void onPageSelected(OnPageSelected value) const;
|
|
44
|
+
void onPageScrollStateChanged(OnPageScrollStateChanged value) const;
|
|
45
|
+
};
|
|
46
|
+
} // namespace react
|
|
47
|
+
} // namespace facebook
|