133 lines
4.6 KiB
React
133 lines
4.6 KiB
React
// Metro module 5469 (f5470).
|
|
import { useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from "react";
|
|
import { CompatAnimatedView } from "./Module5466";
|
|
import { ViewHolder } from "./Module5470";
|
|
import { PlatformConfig } from "./Module5431";
|
|
export const StickyHeaders = ({ stickyHeaderIndices, stickyHeaderOffset, renderItem, stickyHeaderRef, recyclerViewManager, scrollY, data, extraData, onChangeStickyIndex, inverted, stickyHeaderZIndex = 2 }) => {
|
|
let c14868_14, callback, current, translateY, opacity;
|
|
const zIndex = stickyHeaderZIndex;
|
|
c14868_14 = void 0;
|
|
callback = void 0;
|
|
current = void 0;
|
|
translateY = void 0;
|
|
opacity = void 0;
|
|
const [state, setState] = useState({
|
|
currentStickyIndex: -1,
|
|
pushStartsAt: Number.MAX_SAFE_INTEGER
|
|
});
|
|
const { currentStickyIndex, pushStartsAt } = state;
|
|
const memo = useMemo(() => [...stickyHeaderIndices].sort((a, b) => a - b), [stickyHeaderIndices]);
|
|
const r2 = memo.length === 0 || recyclerViewManager.getDataLength() <= memo[memo.length - 1];
|
|
c14868_14 = r2;
|
|
callback = useCallback(() => {
|
|
let r34, MAX_SAFE_INTEGER;
|
|
if (!c14868_14) {
|
|
const r19 = recyclerViewManager.getLastScrollOffset() + stickyHeaderOffset;
|
|
let r1 = memo.length - 1;
|
|
let r18 = -1;
|
|
let r26 = 0;
|
|
let r14 = -1;
|
|
while (r26 <= r1) {
|
|
const r23 = Math.floor((r26 + r1) / 2);
|
|
const r31 = recyclerViewManager.getLayout(memo[r23]).y;
|
|
let r32 = r18;
|
|
const r3 = r1;
|
|
let r33 = r26;
|
|
if (r31 <= r19) {
|
|
r33 = r23 + 1;
|
|
r32 = r23;
|
|
r34 = r3;
|
|
} else {
|
|
r34 = r23 - 1;
|
|
}
|
|
r18 = r32;
|
|
r1 = r34;
|
|
r26 = r33;
|
|
r14 = r18;
|
|
}
|
|
let currentStickyIndex2 = memo[r14];
|
|
if (currentStickyIndex2 == null) {
|
|
currentStickyIndex2 = -1;
|
|
}
|
|
let r37 = memo[r14 + 1];
|
|
if (r37 == null) {
|
|
r37 = -1;
|
|
}
|
|
if (r37 > recyclerViewManager.getEngagedIndices().endIndex) {
|
|
r37 = -1;
|
|
}
|
|
if (r37 === -1) {
|
|
MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER;
|
|
} else {
|
|
let r44 = recyclerViewManager.tryGetLayout(r37)?.y;
|
|
if (r44 == null) {
|
|
r44 = 0;
|
|
}
|
|
MAX_SAFE_INTEGER = r44 + recyclerViewManager.firstItemOffset;
|
|
}
|
|
let r51 = recyclerViewManager.tryGetLayout(currentStickyIndex2)?.height;
|
|
if (r51 == null) {
|
|
r51 = 0;
|
|
}
|
|
const r52 = MAX_SAFE_INTEGER - r51;
|
|
if (!(currentStickyIndex2 === currentStickyIndex && r52 === pushStartsAt)) {
|
|
setState({
|
|
currentStickyIndex: currentStickyIndex2,
|
|
pushStartsAt: r52 - stickyHeaderOffset
|
|
});
|
|
}
|
|
if (currentStickyIndex2 !== currentStickyIndex && onChangeStickyIndex != null) {
|
|
onChangeStickyIndex(currentStickyIndex2);
|
|
}
|
|
}
|
|
}, [r2, recyclerViewManager, memo, currentStickyIndex, pushStartsAt, onChangeStickyIndex, stickyHeaderOffset]);
|
|
useEffect(() => {
|
|
callback();
|
|
}, [callback]);
|
|
useImperativeHandle(stickyHeaderRef, () => ({
|
|
reportScrollEvent: () => {
|
|
callback();
|
|
}
|
|
}), [callback]);
|
|
current = useRef(new Map()).current;
|
|
const memo2 = useMemo(() => {
|
|
let r10 = recyclerViewManager.tryGetLayout(currentStickyIndex)?.height;
|
|
if (r10 == null) {
|
|
r10 = 0;
|
|
}
|
|
return {
|
|
translateY: scrollY.interpolate({
|
|
inputRange: [pushStartsAt, pushStartsAt + r10],
|
|
outputRange: [0, -r10],
|
|
extrapolate: "clamp"
|
|
}),
|
|
opacity: stickyHeaderOffset > 0 ? scrollY.interpolate({
|
|
inputRange: [pushStartsAt, pushStartsAt + r10],
|
|
outputRange: [1, 0],
|
|
extrapolate: "clamp"
|
|
}) : void 0
|
|
};
|
|
}, [recyclerViewManager, currentStickyIndex, scrollY, pushStartsAt, stickyHeaderOffset]);
|
|
translateY = memo2.translateY;
|
|
opacity = memo2.opacity;
|
|
const memo3 = useMemo(() => <CompatAnimatedView style={{
|
|
position: "absolute",
|
|
top: stickyHeaderOffset,
|
|
left: 0,
|
|
right: 0,
|
|
zIndex,
|
|
transform: [{
|
|
translateY
|
|
}],
|
|
opacity
|
|
}}>
|
|
{currentStickyIndex !== -1 ? currentStickyIndex < data.length ? <ViewHolder index={currentStickyIndex} item={data[currentStickyIndex]} renderItem={renderItem} layout={{
|
|
x: 0,
|
|
y: 0,
|
|
width: 0,
|
|
height: 0
|
|
}} refHolder={current} extraData={extraData} trailingItem={void 0} target="StickyHeader" hidden={false} inverted={inverted} /> : null : null}
|
|
</CompatAnimatedView>, [translateY, opacity, currentStickyIndex, data, renderItem, current, extraData, stickyHeaderOffset, zIndex, inverted]);
|
|
return PlatformConfig.isRN083OrAbove ? currentStickyIndex !== -1 ? memo3 : null : memo3;
|
|
};
|