@onekeyfe/react-native-pager-view 6.7.0-1 → 6.7.0-12

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.
Files changed (43) hide show
  1. package/README.md +9 -0
  2. package/android/src/main/java/com/reactnativepagerview/CollapsiblePagerViewManager.kt +2 -2
  3. package/android/src/main/java/com/reactnativepagerview/NativeScrollerViewManager.kt +2 -2
  4. package/docs/SPEC.md +108 -7
  5. package/ios/RNCCollapsiblePagerViewComponentView.mm +341 -23
  6. package/ios/RNCNativeScrollerComponentView.mm +30 -5
  7. package/ios/tests/RNCCollapsiblePagerFirstFrameTests.mm +124 -0
  8. package/ios/tests/RNCCollapsiblePagerHitTestTests.mm +186 -1
  9. package/ios/tests/RNCCollapsiblePagerRefreshControlTests.mm +50 -0
  10. package/ios/tests/RNCNativeScrollerTests.mm +39 -0
  11. package/lib/module/CollapsiblePagerView.js +16 -7
  12. package/lib/module/CollapsiblePagerView.web.js +428 -37
  13. package/lib/module/CollapsiblePagerViewNativeComponent.ts +1 -1
  14. package/lib/module/NativeScroller.js +2 -2
  15. package/lib/module/NativeScroller.web.js +16 -3
  16. package/lib/module/NativeScrollerNativeComponent.ts +1 -1
  17. package/lib/module/ScrollEdgeEffect.js +8 -0
  18. package/lib/module/WebCollapsiblePagerPage.js +182 -0
  19. package/lib/module/index.js +3 -0
  20. package/lib/module/index.native.js +9 -0
  21. package/lib/module/index.web.js +3 -0
  22. package/lib/typescript/src/CollapsiblePagerView.d.ts +8 -5
  23. package/lib/typescript/src/CollapsiblePagerView.web.d.ts +66 -4
  24. package/lib/typescript/src/CollapsiblePagerViewNativeComponent.d.ts +1 -1
  25. package/lib/typescript/src/NativeScroller.d.ts +3 -2
  26. package/lib/typescript/src/NativeScrollerNativeComponent.d.ts +1 -1
  27. package/lib/typescript/src/ScrollEdgeEffect.d.ts +5 -0
  28. package/lib/typescript/src/WebCollapsiblePagerPage.d.ts +42 -0
  29. package/lib/typescript/src/index.d.ts +5 -0
  30. package/lib/typescript/src/index.native.d.ts +13 -0
  31. package/lib/typescript/src/index.web.d.ts +5 -0
  32. package/package.json +6 -4
  33. package/src/CollapsiblePagerView.tsx +43 -11
  34. package/src/CollapsiblePagerView.web.tsx +640 -50
  35. package/src/CollapsiblePagerViewNativeComponent.ts +1 -1
  36. package/src/NativeScroller.tsx +6 -4
  37. package/src/NativeScroller.web.tsx +24 -2
  38. package/src/NativeScrollerNativeComponent.ts +1 -1
  39. package/src/ScrollEdgeEffect.ts +4 -0
  40. package/src/WebCollapsiblePagerPage.tsx +258 -0
  41. package/src/index.native.tsx +30 -0
  42. package/src/index.tsx +6 -0
  43. package/src/index.web.tsx +6 -0
@@ -1,3 +1,4 @@
1
+ import type { ScrollEdgeEffect } from "./ScrollEdgeEffect";
1
2
  import React from "react";
2
3
  import { I18nManager, Platform, StyleSheet, View } from "react-native";
3
4
  import type * as ReactNative from "react-native";
@@ -86,7 +87,7 @@ export interface CollapsiblePagerViewProps
86
87
  | "children"
87
88
  | "headerHeight"
88
89
  | "stickyHeaderHeight"
89
- | "topScrollEdgeHard"
90
+ | "topScrollEdgeEffect"
90
91
  | "topOverlayHeight"
91
92
  | "externalTopOverlayTag"
92
93
  | "pageKeys"
@@ -119,10 +120,12 @@ export interface CollapsiblePagerViewProps
119
120
  stickyHeaderHeight: number;
120
121
  /** Fixed content above the collapsible header on iOS 26 and newer. */
121
122
  topOverlay?: React.ReactNode;
123
+ /** Known overlay height to reserve until its first layout measurement. */
124
+ topOverlayHeightHint?: number;
122
125
  /** Existing fixed header shared with a parent pager on iOS 26 and newer. */
123
126
  externalTopOverlayTag?: number;
124
- /** Enables UIKit's hard top scroll-edge effect on iOS 26 and newer. */
125
- topScrollEdgeEffect?: "hard";
127
+ /** Selects UIKit's top scroll-edge effect on iOS 26 and newer. */
128
+ topScrollEdgeEffect?: `${ScrollEdgeEffect}`;
126
129
  /** Effective appearance of the fixed overlay or pinned sticky bar. */
127
130
  topOverlayColorScheme?: "light" | "dark";
128
131
  /**
@@ -157,7 +160,7 @@ export interface CollapsiblePagerViewProps
157
160
  type State = {
158
161
  selectedPage: number;
159
162
  transientRetainedPages: readonly number[];
160
- topOverlayHeight: number;
163
+ topOverlayHeight: number | null;
161
164
  };
162
165
 
163
166
  const pageIndex = (value: number) => {
@@ -185,7 +188,7 @@ export class CollapsiblePagerView extends React.PureComponent<
185
188
  State
186
189
  > {
187
190
  state: State = {
188
- topOverlayHeight: 0,
191
+ topOverlayHeight: null,
189
192
  selectedPage: clampedPageIndex(
190
193
  this.props.initialPage ?? 0,
191
194
  React.Children.toArray(this.props.children).length
@@ -218,7 +221,22 @@ export class CollapsiblePagerView extends React.PureComponent<
218
221
  this.notifyMountedPagesChanged();
219
222
  }
220
223
 
221
- componentDidUpdate() {
224
+ componentDidUpdate(previousProps: CollapsiblePagerViewProps) {
225
+ const previousOverlayEnabled =
226
+ previousProps.topOverlay != null &&
227
+ (previousProps.topScrollEdgeEffect === "hard" ||
228
+ previousProps.topScrollEdgeEffect === "soft");
229
+ const overlayEnabled =
230
+ this.props.topOverlay != null &&
231
+ (this.props.topScrollEdgeEffect === "hard" ||
232
+ this.props.topScrollEdgeEffect === "soft");
233
+ if (
234
+ previousOverlayEnabled &&
235
+ !overlayEnabled &&
236
+ this.state.topOverlayHeight !== null
237
+ ) {
238
+ this.setState({ topOverlayHeight: null });
239
+ }
222
240
  const pageCount = this.pages().length;
223
241
  const selectedPage = clampedPageIndex(this.state.selectedPage, pageCount);
224
242
  if (selectedPage !== this.state.selectedPage) {
@@ -472,6 +490,7 @@ export class CollapsiblePagerView extends React.PureComponent<
472
490
  headerHeight,
473
491
  stickyHeaderHeight,
474
492
  topOverlay,
493
+ topOverlayHeightHint,
475
494
  externalTopOverlayTag,
476
495
  topScrollEdgeEffect,
477
496
  topOverlayColorScheme,
@@ -493,8 +512,15 @@ export class CollapsiblePagerView extends React.PureComponent<
493
512
  const pages = this.pages();
494
513
  const supportsTopScrollEdge =
495
514
  Platform.OS === "ios" && parseInt(String(Platform.Version), 10) >= 26;
496
- const hardScrollEdge = supportsTopScrollEdge && topScrollEdgeEffect === "hard";
497
- const hasTopOverlay = hardScrollEdge && topOverlay != null;
515
+ const scrollEdgeEnabled =
516
+ supportsTopScrollEdge &&
517
+ (topScrollEdgeEffect === "hard" || topScrollEdgeEffect === "soft");
518
+ const hasTopOverlay = scrollEdgeEnabled && topOverlay != null;
519
+ const initialTopOverlayHeight =
520
+ typeof topOverlayHeightHint === "number" &&
521
+ Number.isFinite(topOverlayHeightHint)
522
+ ? Math.max(0, Math.ceil(topOverlayHeightHint))
523
+ : 0;
498
524
  const pageKeys = pages.map(pageKey);
499
525
  const retained = new Set(this.mountedPages(pages.length));
500
526
  const deducedLayoutDirection =
@@ -535,9 +561,15 @@ export class CollapsiblePagerView extends React.PureComponent<
535
561
  offscreenPageLimit={Math.max(1, offscreenPageLimit ?? 1)}
536
562
  headerHeight={Math.max(0, Math.round(headerHeight))}
537
563
  stickyHeaderHeight={Math.max(0, Math.round(stickyHeaderHeight))}
538
- topScrollEdgeHard={hardScrollEdge}
539
- topOverlayColorScheme={hardScrollEdge ? topOverlayColorScheme : undefined}
540
- topOverlayHeight={hasTopOverlay ? this.state.topOverlayHeight : 0}
564
+ topScrollEdgeEffect={scrollEdgeEnabled ? topScrollEdgeEffect : "none"}
565
+ topOverlayColorScheme={
566
+ scrollEdgeEnabled ? topOverlayColorScheme : undefined
567
+ }
568
+ topOverlayHeight={
569
+ hasTopOverlay
570
+ ? this.state.topOverlayHeight ?? initialTopOverlayHeight
571
+ : 0
572
+ }
541
573
  externalTopOverlayTag={
542
574
  supportsTopScrollEdge && !hasTopOverlay
543
575
  ? externalTopOverlayTag ?? 0