react-native-header-motion 0.3.0 → 1.0.0-alpha.0
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/README.md +75 -25
- package/lib/module/components/FlatList.js +2 -0
- package/lib/module/components/FlatList.js.map +1 -1
- package/lib/module/components/HeaderBase.js +53 -5
- package/lib/module/components/HeaderBase.js.map +1 -1
- package/lib/module/components/HeaderMotion.js +66 -24
- package/lib/module/components/HeaderMotion.js.map +1 -1
- package/lib/module/components/ScrollManager.js.map +1 -1
- package/lib/module/components/ScrollView.js +2 -0
- package/lib/module/components/ScrollView.js.map +1 -1
- package/lib/module/context.js.map +1 -1
- package/lib/module/hooks/useMotionProgress.js +6 -2
- package/lib/module/hooks/useMotionProgress.js.map +1 -1
- package/lib/module/hooks/useScrollManager.js +79 -29
- package/lib/module/hooks/useScrollManager.js.map +1 -1
- package/lib/module/utils/index.js +1 -0
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/refreshControl.js +93 -0
- package/lib/module/utils/refreshControl.js.map +1 -0
- package/lib/module/utils/values.js +36 -0
- package/lib/module/utils/values.js.map +1 -1
- package/lib/typescript/src/components/FlatList.d.ts +1 -1
- package/lib/typescript/src/components/FlatList.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderBase.d.ts +9 -2
- package/lib/typescript/src/components/HeaderBase.d.ts.map +1 -1
- package/lib/typescript/src/components/HeaderMotion.d.ts +5 -1
- package/lib/typescript/src/components/HeaderMotion.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollManager.d.ts +6 -16
- package/lib/typescript/src/components/ScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/components/ScrollView.d.ts +2 -2
- package/lib/typescript/src/components/ScrollView.d.ts.map +1 -1
- package/lib/typescript/src/context.d.ts +7 -3
- package/lib/typescript/src/context.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useMotionProgress.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useScrollManager.d.ts +5 -4
- package/lib/typescript/src/hooks/useScrollManager.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +20 -6
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +1 -0
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/refreshControl.d.ts +150 -0
- package/lib/typescript/src/utils/refreshControl.d.ts.map +1 -0
- package/lib/typescript/src/utils/values.d.ts +4 -1
- package/lib/typescript/src/utils/values.d.ts.map +1 -1
- package/package.json +7 -5
- package/src/components/FlatList.tsx +9 -3
- package/src/components/HeaderBase.tsx +93 -4
- package/src/components/HeaderMotion.tsx +102 -26
- package/src/components/ScrollManager.tsx +23 -28
- package/src/components/ScrollView.tsx +9 -3
- package/src/context.ts +9 -2
- package/src/hooks/useMotionProgress.ts +10 -2
- package/src/hooks/useScrollManager.ts +105 -36
- package/src/types.ts +22 -10
- package/src/utils/index.ts +1 -0
- package/src/utils/refreshControl.tsx +118 -0
- package/src/utils/values.ts +57 -1
- package/lib/module/hooks/refreshControl.js +0 -31
- package/lib/module/hooks/refreshControl.js.map +0 -1
- package/lib/typescript/src/hooks/refreshControl.d.ts +0 -13
- package/lib/typescript/src/hooks/refreshControl.d.ts.map +0 -1
- package/src/hooks/refreshControl.ts +0 -55
package/src/types.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import type { ReactElement } from 'react';
|
|
2
|
-
import type {
|
|
3
|
-
LayoutChangeEvent,
|
|
4
|
-
RefreshControlProps,
|
|
5
|
-
ScrollViewProps,
|
|
6
|
-
} from 'react-native';
|
|
2
|
+
import type { LayoutChangeEvent, ScrollViewProps } from 'react-native';
|
|
7
3
|
import type { AnimatedRef, SharedValue } from 'react-native-reanimated';
|
|
8
4
|
import { DEFAULT_SCROLL_ID } from './utils/defaults';
|
|
5
|
+
import type { InstanceOrElement } from 'react-native-reanimated/lib/typescript/commonTypes';
|
|
9
6
|
|
|
10
7
|
export type Progress = SharedValue<number>;
|
|
11
8
|
|
|
@@ -43,13 +40,21 @@ export type WithCollapsiblePagedHeaderProps<
|
|
|
43
40
|
|
|
44
41
|
export interface MotionProgress {
|
|
45
42
|
progress: Progress;
|
|
46
|
-
progressThreshold: number
|
|
43
|
+
progressThreshold: SharedValue<number>;
|
|
47
44
|
measureTotalHeight: MeasureAnimatedHeaderAndSet;
|
|
48
45
|
measureDynamic: MeasureAnimatedHeaderAndSet;
|
|
46
|
+
animatedHeaderBaseProps: AnimatedHeaderBaseMotionProps;
|
|
47
|
+
activeScrollId: SharedValue<string> | undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface AnimatedHeaderBaseMotionProps {
|
|
51
|
+
enableHeaderPan: boolean;
|
|
52
|
+
scrollToRef: React.RefObject<ScrollTo | null>;
|
|
53
|
+
headerPanMomentumOffset: SharedValue<number | null>;
|
|
49
54
|
}
|
|
50
55
|
|
|
51
56
|
export interface ScrollManagerHeaderMotionContext {
|
|
52
|
-
originalHeaderHeight: number
|
|
57
|
+
originalHeaderHeight: SharedValue<number>;
|
|
53
58
|
minHeightContentContainerStyle:
|
|
54
59
|
| {}
|
|
55
60
|
| {
|
|
@@ -57,12 +62,19 @@ export interface ScrollManagerHeaderMotionContext {
|
|
|
57
62
|
};
|
|
58
63
|
}
|
|
59
64
|
|
|
60
|
-
export interface ScrollManagerConfig {
|
|
65
|
+
export interface ScrollManagerConfig<TRef extends InstanceOrElement = any> {
|
|
61
66
|
scrollableProps: Required<
|
|
62
67
|
Pick<ScrollViewProps, 'onScroll' | 'scrollEventThrottle'>
|
|
63
68
|
> & {
|
|
64
|
-
refreshControl?: ReactElement
|
|
65
|
-
ref: AnimatedRef<
|
|
69
|
+
refreshControl?: ReactElement;
|
|
70
|
+
ref: AnimatedRef<TRef>;
|
|
66
71
|
};
|
|
67
72
|
headerMotionContext: ScrollManagerHeaderMotionContext;
|
|
68
73
|
}
|
|
74
|
+
|
|
75
|
+
export type ScrollTo = (y: number, options?: ScrollToOptions) => void;
|
|
76
|
+
|
|
77
|
+
interface ScrollToOptions {
|
|
78
|
+
isValueDelta?: boolean;
|
|
79
|
+
animated?: boolean;
|
|
80
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cloneElement,
|
|
3
|
+
createElement,
|
|
4
|
+
isValidElement,
|
|
5
|
+
type ReactElement,
|
|
6
|
+
} from 'react';
|
|
7
|
+
import { RefreshControl, type RefreshControlProps } from 'react-native';
|
|
8
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
9
|
+
import Animated, { useAnimatedProps } from 'react-native-reanimated';
|
|
10
|
+
|
|
11
|
+
// FIXME: Types are a mess here
|
|
12
|
+
|
|
13
|
+
const AnimatedRefreshControl = Animated.createAnimatedComponent(RefreshControl);
|
|
14
|
+
|
|
15
|
+
type MaybeShared<T> = T | SharedValue<T | undefined>;
|
|
16
|
+
|
|
17
|
+
export interface ResolveRefreshControlOptions {
|
|
18
|
+
refreshControl?: MaybeShared<ReactElement<RefreshControlProps>>;
|
|
19
|
+
refreshing?: MaybeShared<boolean>;
|
|
20
|
+
onRefresh?: MaybeShared<() => void>;
|
|
21
|
+
progressViewOffset: MaybeShared<number> | SharedValue<number>;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function resolveRefreshControl({
|
|
25
|
+
refreshControl,
|
|
26
|
+
refreshing,
|
|
27
|
+
onRefresh,
|
|
28
|
+
progressViewOffset,
|
|
29
|
+
}: ResolveRefreshControlOptions):
|
|
30
|
+
| ReactElement<
|
|
31
|
+
RefreshControlProps | React.ComponentProps<typeof AnimatedRefreshControl>
|
|
32
|
+
>
|
|
33
|
+
| undefined {
|
|
34
|
+
if (!refreshControl) {
|
|
35
|
+
return createRefreshControlWithOffset({
|
|
36
|
+
refreshing,
|
|
37
|
+
onRefresh,
|
|
38
|
+
progressViewOffset,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return isValidElement<RefreshControlProps>(refreshControl)
|
|
43
|
+
? injectProgressViewOffset(refreshControl, progressViewOffset)
|
|
44
|
+
: undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function createRefreshControlWithOffset({
|
|
48
|
+
refreshing,
|
|
49
|
+
onRefresh,
|
|
50
|
+
progressViewOffset,
|
|
51
|
+
}: Omit<ResolveRefreshControlOptions, 'refreshControl'>) {
|
|
52
|
+
if (!onRefresh) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return createElement(ResolvedRefreshControl, {
|
|
57
|
+
refreshing: (refreshing as boolean) ?? false,
|
|
58
|
+
onRefresh: onRefresh as () => void,
|
|
59
|
+
progressViewOffset: progressViewOffset as number,
|
|
60
|
+
}) as ReactElement<RefreshControlProps>;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function injectProgressViewOffset(
|
|
64
|
+
refreshControl: ReactElement<RefreshControlProps>,
|
|
65
|
+
progressViewOffset: MaybeShared<number> | SharedValue<number>
|
|
66
|
+
) {
|
|
67
|
+
const offset = refreshControl.props.progressViewOffset ?? progressViewOffset;
|
|
68
|
+
|
|
69
|
+
if (!isSharedValue<number>(offset)) {
|
|
70
|
+
return cloneElement(refreshControl, {
|
|
71
|
+
progressViewOffset: offset as number,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return createElement(ResolvedRefreshControl, {
|
|
76
|
+
...refreshControl.props,
|
|
77
|
+
progressViewOffset: progressViewOffset as number,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function ResolvedRefreshControl({
|
|
82
|
+
refreshing,
|
|
83
|
+
onRefresh,
|
|
84
|
+
progressViewOffset,
|
|
85
|
+
...props
|
|
86
|
+
}: React.ComponentProps<typeof AnimatedRefreshControl>) {
|
|
87
|
+
const animatedProps = useAnimatedProps<RefreshControlProps>(() => {
|
|
88
|
+
return {
|
|
89
|
+
...(isSharedValue(refreshing) ? { refreshing: refreshing.value } : {}),
|
|
90
|
+
...(isSharedValue(onRefresh) ? { onRefresh: onRefresh.value } : {}),
|
|
91
|
+
...(isSharedValue(progressViewOffset)
|
|
92
|
+
? { progressViewOffset: progressViewOffset.value }
|
|
93
|
+
: {}),
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const nonAnimatedProps = {
|
|
98
|
+
...(isSharedValue(refreshing) ? {} : { refreshing }),
|
|
99
|
+
...(isSharedValue(onRefresh) ? {} : { onRefresh }),
|
|
100
|
+
...(isSharedValue(progressViewOffset) ? {} : { progressViewOffset }),
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return (
|
|
104
|
+
<AnimatedRefreshControl
|
|
105
|
+
{...props}
|
|
106
|
+
{...nonAnimatedProps}
|
|
107
|
+
refreshing={nonAnimatedProps.refreshing as boolean}
|
|
108
|
+
animatedProps={animatedProps}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function isSharedValue<T>(
|
|
114
|
+
value: MaybeShared<T> | SharedValue<T>
|
|
115
|
+
): value is SharedValue<T> {
|
|
116
|
+
'worklet';
|
|
117
|
+
return typeof value === 'object' && value !== null && 'value' in value;
|
|
118
|
+
}
|
package/src/utils/values.ts
CHANGED
|
@@ -1,6 +1,62 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { SharedValue } from 'react-native-reanimated';
|
|
2
|
+
import type { ScrollValue, ScrollValues } from '../types';
|
|
3
|
+
import { DEFAULT_SCROLL_ID } from './defaults';
|
|
2
4
|
|
|
3
5
|
export function getInitialScrollValue(): ScrollValue {
|
|
4
6
|
'worklet';
|
|
5
7
|
return { min: 0, current: 0 };
|
|
6
8
|
}
|
|
9
|
+
|
|
10
|
+
export function ensureScrollValueRegistered(
|
|
11
|
+
scrollValues: SharedValue<ScrollValues>,
|
|
12
|
+
id: string
|
|
13
|
+
): ScrollValues {
|
|
14
|
+
'worklet';
|
|
15
|
+
|
|
16
|
+
const values = scrollValues.get();
|
|
17
|
+
if (values[id]) {
|
|
18
|
+
return values;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
scrollValues.modify((value) => {
|
|
22
|
+
if (!value[id]) {
|
|
23
|
+
(value as ScrollValues)[id] = getInitialScrollValue();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return value;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return scrollValues.get();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function warnIfMissingActiveScrollId(
|
|
33
|
+
scrollValues: ScrollValues,
|
|
34
|
+
id: string,
|
|
35
|
+
activeScrollId: string | undefined
|
|
36
|
+
): void {
|
|
37
|
+
'worklet';
|
|
38
|
+
|
|
39
|
+
if (!__DEV__ || activeScrollId || id === DEFAULT_SCROLL_ID) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
let nonDefaultCount = 0;
|
|
44
|
+
let nonDefaultIds = '';
|
|
45
|
+
|
|
46
|
+
for (const key in scrollValues) {
|
|
47
|
+
if (key === DEFAULT_SCROLL_ID) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
nonDefaultCount += 1;
|
|
52
|
+
nonDefaultIds = nonDefaultIds ? `${nonDefaultIds}, ${key}` : key;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (nonDefaultCount < 1) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.warn(
|
|
60
|
+
`[react-native-header-motion] Explicit scrollIds (${nonDefaultIds}) are registered but no activeScrollId was provided. Pass useActiveScrollId(...).sv to <HeaderMotion activeScrollId={...}> to keep header motion deterministic.`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { cloneElement, createElement, isValidElement } from 'react';
|
|
4
|
-
import { RefreshControl } from 'react-native';
|
|
5
|
-
function injectProgressViewOffset(refreshControl, progressViewOffset) {
|
|
6
|
-
if (refreshControl.props.progressViewOffset !== undefined) {
|
|
7
|
-
return refreshControl;
|
|
8
|
-
}
|
|
9
|
-
return /*#__PURE__*/cloneElement(refreshControl, {
|
|
10
|
-
progressViewOffset: progressViewOffset
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
export function resolveRefreshControl({
|
|
14
|
-
refreshControl,
|
|
15
|
-
refreshing,
|
|
16
|
-
onRefresh,
|
|
17
|
-
progressViewOffset
|
|
18
|
-
}) {
|
|
19
|
-
if (refreshControl) {
|
|
20
|
-
return /*#__PURE__*/isValidElement(refreshControl) ? injectProgressViewOffset(refreshControl, progressViewOffset) : undefined;
|
|
21
|
-
}
|
|
22
|
-
if (!onRefresh) {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
return /*#__PURE__*/createElement(RefreshControl, {
|
|
26
|
-
refreshing: refreshing ?? false,
|
|
27
|
-
onRefresh: onRefresh,
|
|
28
|
-
progressViewOffset: progressViewOffset
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=refreshControl.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["cloneElement","createElement","isValidElement","RefreshControl","injectProgressViewOffset","refreshControl","progressViewOffset","props","undefined","resolveRefreshControl","refreshing","onRefresh"],"sourceRoot":"../../../src","sources":["hooks/refreshControl.ts"],"mappings":";;AAAA,SACEA,YAAY,EACZC,aAAa,EACbC,cAAc,QAET,OAAO;AACd,SAASC,cAAc,QAAkC,cAAc;AAYvE,SAASC,wBAAwBA,CAC/BC,cAAiD,EACjDC,kBAAuC,EACvC;EACA,IAAID,cAAc,CAACE,KAAK,CAACD,kBAAkB,KAAKE,SAAS,EAAE;IACzD,OAAOH,cAAc;EACvB;EAEA,oBAAOL,YAAY,CAACK,cAAc,EAAE;IAClCC,kBAAkB,EAAEA;EACtB,CAAC,CAAC;AACJ;AAEA,OAAO,SAASG,qBAAqBA,CAAC;EACpCJ,cAAc;EACdK,UAAU;EACVC,SAAS;EACTL;AAC4B,CAAC,EAEjB;EACZ,IAAID,cAAc,EAAE;IAClB,OAAO,aAAAH,cAAc,CAAsBG,cAAc,CAAC,GACtDD,wBAAwB,CAACC,cAAc,EAAEC,kBAAkB,CAAC,GAC5DE,SAAS;EACf;EAEA,IAAI,CAACG,SAAS,EAAE;IACd,OAAOH,SAAS;EAClB;EAEA,oBAAOP,aAAa,CAACE,cAAc,EAAE;IACnCO,UAAU,EAAGA,UAAU,IAAgB,KAAK;IAC5CC,SAAS,EAAEA,SAAuB;IAClCL,kBAAkB,EAAEA;EACtB,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { type ReactElement } from 'react';
|
|
2
|
-
import { type RefreshControlProps } from 'react-native';
|
|
3
|
-
import type { SharedValue } from 'react-native-reanimated';
|
|
4
|
-
type MaybeShared<T> = T | SharedValue<T | undefined>;
|
|
5
|
-
export interface ResolveRefreshControlOptions {
|
|
6
|
-
refreshControl?: MaybeShared<ReactElement<RefreshControlProps>>;
|
|
7
|
-
refreshing?: MaybeShared<boolean>;
|
|
8
|
-
onRefresh?: MaybeShared<() => void>;
|
|
9
|
-
progressViewOffset: MaybeShared<number>;
|
|
10
|
-
}
|
|
11
|
-
export declare function resolveRefreshControl({ refreshControl, refreshing, onRefresh, progressViewOffset, }: ResolveRefreshControlOptions): ReactElement<RefreshControlProps> | undefined;
|
|
12
|
-
export {};
|
|
13
|
-
//# sourceMappingURL=refreshControl.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"refreshControl.d.ts","sourceRoot":"","sources":["../../../../src/hooks/refreshControl.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,OAAO,CAAC;AACf,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAErD,MAAM,WAAW,4BAA4B;IAC3C,cAAc,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAChE,UAAU,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC;IACpC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACzC;AAeD,wBAAgB,qBAAqB,CAAC,EACpC,cAAc,EACd,UAAU,EACV,SAAS,EACT,kBAAkB,GACnB,EAAE,4BAA4B,GAC3B,YAAY,CAAC,mBAAmB,CAAC,GACjC,SAAS,CAgBZ"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
cloneElement,
|
|
3
|
-
createElement,
|
|
4
|
-
isValidElement,
|
|
5
|
-
type ReactElement,
|
|
6
|
-
} from 'react';
|
|
7
|
-
import { RefreshControl, type RefreshControlProps } from 'react-native';
|
|
8
|
-
import type { SharedValue } from 'react-native-reanimated';
|
|
9
|
-
|
|
10
|
-
type MaybeShared<T> = T | SharedValue<T | undefined>;
|
|
11
|
-
|
|
12
|
-
export interface ResolveRefreshControlOptions {
|
|
13
|
-
refreshControl?: MaybeShared<ReactElement<RefreshControlProps>>;
|
|
14
|
-
refreshing?: MaybeShared<boolean>;
|
|
15
|
-
onRefresh?: MaybeShared<() => void>;
|
|
16
|
-
progressViewOffset: MaybeShared<number>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function injectProgressViewOffset(
|
|
20
|
-
refreshControl: ReactElement<RefreshControlProps>,
|
|
21
|
-
progressViewOffset: MaybeShared<number>
|
|
22
|
-
) {
|
|
23
|
-
if (refreshControl.props.progressViewOffset !== undefined) {
|
|
24
|
-
return refreshControl;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return cloneElement(refreshControl, {
|
|
28
|
-
progressViewOffset: progressViewOffset as number,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function resolveRefreshControl({
|
|
33
|
-
refreshControl,
|
|
34
|
-
refreshing,
|
|
35
|
-
onRefresh,
|
|
36
|
-
progressViewOffset,
|
|
37
|
-
}: ResolveRefreshControlOptions):
|
|
38
|
-
| ReactElement<RefreshControlProps>
|
|
39
|
-
| undefined {
|
|
40
|
-
if (refreshControl) {
|
|
41
|
-
return isValidElement<RefreshControlProps>(refreshControl)
|
|
42
|
-
? injectProgressViewOffset(refreshControl, progressViewOffset)
|
|
43
|
-
: undefined;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (!onRefresh) {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return createElement(RefreshControl, {
|
|
51
|
-
refreshing: (refreshing as boolean) ?? false,
|
|
52
|
-
onRefresh: onRefresh as () => void,
|
|
53
|
-
progressViewOffset: progressViewOffset as number,
|
|
54
|
-
}) as unknown as ReactElement<RefreshControlProps>;
|
|
55
|
-
}
|