@onekeyfe/react-native-pager-view 3.0.112 → 3.0.113

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.
@@ -0,0 +1,215 @@
1
+ package com.reactnativepagerview
2
+
3
+ import android.view.View
4
+ import android.view.ViewGroup
5
+ import androidx.viewpager2.widget.ViewPager2
6
+ import com.facebook.react.bridge.ReadableArray
7
+ import com.facebook.react.common.MapBuilder
8
+ import com.facebook.react.module.annotations.ReactModule
9
+ import com.facebook.react.uimanager.PixelUtil
10
+ import com.facebook.react.uimanager.ThemedReactContext
11
+ import com.facebook.react.uimanager.UIManagerHelper
12
+ import com.facebook.react.uimanager.ViewGroupManager
13
+ import com.facebook.react.uimanager.ViewManagerDelegate
14
+ import com.facebook.react.uimanager.annotations.ReactProp
15
+ import com.facebook.react.viewmanagers.RNCCollapsiblePagerViewManagerDelegate
16
+ import com.facebook.react.viewmanagers.RNCCollapsiblePagerViewManagerInterface
17
+ import com.reactnativepagerview.event.CollapsibleStateChangedEvent
18
+ import com.reactnativepagerview.event.PageScrollEvent
19
+ import com.reactnativepagerview.event.PageScrollStateChangedEvent
20
+ import com.reactnativepagerview.event.PageSelectedEvent
21
+ import org.json.JSONArray
22
+
23
+ @ReactModule(name = CollapsiblePagerViewManager.NAME)
24
+ class CollapsiblePagerViewManager : ViewGroupManager<CollapsiblePagerHost>(),
25
+ RNCCollapsiblePagerViewManagerInterface<CollapsiblePagerHost> {
26
+
27
+ private val delegate: ViewManagerDelegate<CollapsiblePagerHost> =
28
+ RNCCollapsiblePagerViewManagerDelegate(this)
29
+
30
+ override fun getDelegate() = delegate
31
+
32
+ override fun getName() = NAME
33
+
34
+ override fun createViewInstance(reactContext: ThemedReactContext): CollapsiblePagerHost {
35
+ val host = CollapsiblePagerHost(reactContext)
36
+ host.id = View.generateViewId()
37
+ host.layoutParams = ViewGroup.LayoutParams(
38
+ ViewGroup.LayoutParams.MATCH_PARENT,
39
+ ViewGroup.LayoutParams.MATCH_PARENT,
40
+ )
41
+ host.pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
42
+ override fun onPageScrolled(position: Int, offset: Float, offsetPixels: Int) {
43
+ dispatch(reactContext, host, PageScrollEvent(host.id, position, offset))
44
+ }
45
+
46
+ override fun onPageSelected(position: Int) {
47
+ host.selectPage(position)
48
+ dispatch(reactContext, host, PageSelectedEvent(host.id, position))
49
+ dispatchDiagnostics(reactContext, host, "page-selected")
50
+ }
51
+
52
+ override fun onPageScrollStateChanged(state: Int) {
53
+ val value = when (state) {
54
+ ViewPager2.SCROLL_STATE_IDLE -> "idle"
55
+ ViewPager2.SCROLL_STATE_DRAGGING -> "dragging"
56
+ ViewPager2.SCROLL_STATE_SETTLING -> "settling"
57
+ else -> return
58
+ }
59
+ dispatch(reactContext, host, PageScrollStateChangedEvent(host.id, value))
60
+ if (state == ViewPager2.SCROLL_STATE_IDLE) {
61
+ dispatchDiagnostics(reactContext, host, "pager-idle")
62
+ }
63
+ }
64
+ })
65
+ host.onHeaderOffsetChanged = {
66
+ if (!host.pager.isFakeDragging && host.pager.scrollState == ViewPager2.SCROLL_STATE_IDLE) {
67
+ dispatchDiagnostics(reactContext, host, "vertical-idle")
68
+ }
69
+ }
70
+ host.post {
71
+ dispatch(reactContext, host, PageSelectedEvent(host.id, host.pager.currentItem))
72
+ dispatchDiagnostics(reactContext, host, "mounted")
73
+ }
74
+ return host
75
+ }
76
+
77
+ private fun dispatch(reactContext: ThemedReactContext, host: CollapsiblePagerHost, event: com.facebook.react.uimanager.events.Event<*>) {
78
+ UIManagerHelper.getEventDispatcherForReactTag(reactContext, host.id)?.dispatchEvent(event)
79
+ }
80
+
81
+ private fun dispatchDiagnostics(
82
+ reactContext: ThemedReactContext,
83
+ host: CollapsiblePagerHost,
84
+ reason: String,
85
+ ) {
86
+ dispatch(
87
+ reactContext,
88
+ host,
89
+ CollapsibleStateChangedEvent(
90
+ host.id,
91
+ host.selectedPage,
92
+ PixelUtil.toDIPFromPixel(host.headerOffsetPx.toFloat()).toDouble(),
93
+ host.adapter.itemCount,
94
+ host.attachedPageCount(),
95
+ host.observedScrollableCount(),
96
+ host.retainedPages,
97
+ reason,
98
+ ),
99
+ )
100
+ }
101
+
102
+ override fun addView(parent: CollapsiblePagerHost, child: View, index: Int) =
103
+ parent.addReactChild(child, index)
104
+
105
+ override fun getChildCount(parent: CollapsiblePagerHost) = parent.reactChildCount()
106
+
107
+ override fun getChildAt(parent: CollapsiblePagerHost, index: Int) = parent.reactChildAt(index)
108
+
109
+ override fun removeView(parent: CollapsiblePagerHost, view: View) = parent.removeReactChild(view)
110
+
111
+ override fun removeViewAt(parent: CollapsiblePagerHost, index: Int) =
112
+ parent.removeReactChild(parent.reactChildAt(index))
113
+
114
+ override fun removeAllViews(parent: CollapsiblePagerHost) = parent.removeAllReactChildren()
115
+
116
+ override fun needsCustomLayoutForChildren() = true
117
+
118
+ @ReactProp(name = "scrollEnabled", defaultBoolean = true)
119
+ override fun setScrollEnabled(view: CollapsiblePagerHost?, value: Boolean) {
120
+ view?.pager?.isUserInputEnabled = value
121
+ }
122
+
123
+ @ReactProp(name = "layoutDirection")
124
+ override fun setLayoutDirection(view: CollapsiblePagerHost?, value: String?) {
125
+ view?.pager?.layoutDirection = if (value == "rtl") {
126
+ View.LAYOUT_DIRECTION_RTL
127
+ } else {
128
+ View.LAYOUT_DIRECTION_LTR
129
+ }
130
+ }
131
+
132
+ @ReactProp(name = "initialPage", defaultInt = 0)
133
+ override fun setInitialPage(view: CollapsiblePagerHost?, value: Int) {
134
+ view ?: return
135
+ view.pendingInitialPage = value
136
+ view.applyPendingInitialPage()
137
+ }
138
+
139
+ @ReactProp(name = "offscreenPageLimit", defaultInt = ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT)
140
+ override fun setOffscreenPageLimit(view: CollapsiblePagerHost?, value: Int) {
141
+ view?.pager?.offscreenPageLimit = if (value == ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT) {
142
+ value
143
+ } else {
144
+ value.coerceAtLeast(1)
145
+ }
146
+ }
147
+
148
+ @ReactProp(name = "headerHeight", defaultInt = 0)
149
+ override fun setHeaderHeight(view: CollapsiblePagerHost?, value: Int) {
150
+ view?.headerHeightPx = PixelUtil.toPixelFromDIP(value.toDouble()).toInt()
151
+ }
152
+
153
+ @ReactProp(name = "stickyHeaderHeight", defaultInt = 0)
154
+ override fun setStickyHeaderHeight(view: CollapsiblePagerHost?, value: Int) {
155
+ view?.stickyHeaderHeightPx = PixelUtil.toPixelFromDIP(value.toDouble()).toInt()
156
+ }
157
+
158
+ @ReactProp(name = "pageKeys")
159
+ override fun setPageKeys(view: CollapsiblePagerHost?, value: String?) {
160
+ view ?: return
161
+ view.pageKeys = parseStringArray(value)
162
+ }
163
+
164
+ @ReactProp(name = "retainedPages")
165
+ override fun setRetainedPages(view: CollapsiblePagerHost?, value: String?) {
166
+ view?.retainedPages = value ?: "[]"
167
+ }
168
+
169
+ private fun parseStringArray(value: String?): List<String> {
170
+ if (value.isNullOrEmpty()) return emptyList()
171
+ return runCatching {
172
+ val json = JSONArray(value)
173
+ List(json.length()) { index -> json.optString(index, "page-$index") }
174
+ }.getOrDefault(emptyList())
175
+ }
176
+
177
+ override fun receiveCommand(root: CollapsiblePagerHost, commandId: String, args: ReadableArray?) {
178
+ delegate.receiveCommand(root, commandId, args)
179
+ }
180
+
181
+ override fun setPage(view: CollapsiblePagerHost?, selectedPage: Int) {
182
+ if (view != null && selectedPage in 0 until view.adapter.itemCount) {
183
+ view.pager.setCurrentItem(selectedPage, true)
184
+ }
185
+ }
186
+
187
+ override fun setPageWithoutAnimation(view: CollapsiblePagerHost?, selectedPage: Int) {
188
+ if (view != null && selectedPage in 0 until view.adapter.itemCount) {
189
+ view.pager.setCurrentItem(selectedPage, false)
190
+ }
191
+ }
192
+
193
+ override fun setScrollEnabledImperatively(view: CollapsiblePagerHost?, scrollEnabled: Boolean) {
194
+ view?.pager?.isUserInputEnabled = scrollEnabled
195
+ }
196
+
197
+ override fun getExportedCustomDirectEventTypeConstants(): MutableMap<String, Map<String, String>> =
198
+ MapBuilder.builder<String, Map<String, String>>()
199
+ .put(PageScrollEvent.EVENT_NAME, MapBuilder.of("registrationName", "onPageScroll"))
200
+ .put(PageSelectedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onPageSelected"))
201
+ .put(
202
+ PageScrollStateChangedEvent.EVENT_NAME,
203
+ MapBuilder.of("registrationName", "onPageScrollStateChanged"),
204
+ )
205
+ .put(
206
+ CollapsibleStateChangedEvent.EVENT_NAME,
207
+ MapBuilder.of("registrationName", "onCollapsibleStateChanged"),
208
+ )
209
+ .build()
210
+ .toMutableMap()
211
+
212
+ companion object {
213
+ const val NAME = "RNCCollapsiblePagerView"
214
+ }
215
+ }
@@ -12,6 +12,6 @@ class PagerViewPackage : ReactPackage {
12
12
  }
13
13
 
14
14
  override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
15
- return listOf(PagerViewViewManager())
15
+ return listOf(PagerViewViewManager(), CollapsiblePagerViewManager())
16
16
  }
17
17
  }
@@ -0,0 +1,39 @@
1
+ package com.reactnativepagerview.event
2
+
3
+ import com.facebook.react.bridge.Arguments
4
+ import com.facebook.react.bridge.WritableMap
5
+ import com.facebook.react.uimanager.events.Event
6
+ import com.facebook.react.uimanager.events.RCTEventEmitter
7
+
8
+ class CollapsibleStateChangedEvent(
9
+ viewTag: Int,
10
+ private val position: Int,
11
+ private val headerOffset: Double,
12
+ private val nativePageCount: Int,
13
+ private val attachedPageCount: Int,
14
+ private val observedScrollableCount: Int,
15
+ private val retainedPages: String,
16
+ private val reason: String,
17
+ ) : Event<CollapsibleStateChangedEvent>(viewTag) {
18
+ override fun getEventName() = EVENT_NAME
19
+
20
+ override fun canCoalesce() = false
21
+
22
+ override fun dispatch(rctEventEmitter: RCTEventEmitter) {
23
+ rctEventEmitter.receiveEvent(viewTag, eventName, serializeEventData())
24
+ }
25
+
26
+ private fun serializeEventData(): WritableMap = Arguments.createMap().apply {
27
+ putInt("position", position)
28
+ putDouble("headerOffset", headerOffset)
29
+ putInt("nativePageCount", nativePageCount)
30
+ putInt("attachedPageCount", attachedPageCount)
31
+ putInt("observedScrollableCount", observedScrollableCount)
32
+ putString("retainedPages", retainedPages)
33
+ putString("reason", reason)
34
+ }
35
+
36
+ companion object {
37
+ const val EVENT_NAME = "topCollapsibleStateChanged"
38
+ }
39
+ }
@@ -0,0 +1,9 @@
1
+ #import <React/RCTViewComponentView.h>
2
+
3
+ NS_ASSUME_NONNULL_BEGIN
4
+
5
+ @interface RNCCollapsiblePagerViewComponentView : RCTViewComponentView
6
+
7
+ @end
8
+
9
+ NS_ASSUME_NONNULL_END