import { ScrollView, View, Animated, LayoutAnimation } from "react-native"; import React, { useEffect, useMemo, useState, useLayoutEffect } from "react"; import { NativeViewGestureHandler } from "react-native-gesture-handler"; import { AS } from "../storageControl"; export const DynamicHeaderScrollView = (props) => { const { children, actionSheetRef = {}, containerProps = {}, shortHeader = <>, longHeader = <>, topStickyContent, styles, from, scrollHandlers, } = props; const [headerSize, setHeaderSize] = useState("default"); useLayoutEffect(() => { AS.getItem("headerSize") .then((res) => { if (res) setHeaderSize(res); }) .catch((e) => { AS.setItem("headerSize", "default"); }); }, []); useEffect(() => { switch (headerSize) { case "small": setHeaderVisible(true); return; case "big": case "default": default: setHeaderVisible(false); break; } }, [headerSize]); const viewHeader = useMemo(() => { switch (from) { case "AllTrainIDList": case "NearTrainDiagramView": case "LED2": return true; default: return false; } }, [from]); const Max_Header_Height = headerSize == "small" ? 0 : viewHeader ? 0 : 200; const Min_Header_Height = viewHeader ? 0 : 80; const Scroll_Distance = Max_Header_Height - Min_Header_Height; const shotHeaderStyle = { on: { height: Min_Header_Height, backgroundColor: "#0099CC", margin: 0, top: 0, opacity: 1, }, off: { height: Max_Header_Height, backgroundColor: "#0099CC", margin: 0, top: 0, opacity: 0, }, }; const longHeaderStyle = { on: { height: Max_Header_Height, backgroundColor: "#0099CC", margin: 0, top: 0, opacity: 1, }, off: { height: 0, backgroundColor: "#0099CC", margin: 0, top: 0, opacity: 0, }, }; const StickyStyle = { on: { position: "absolute", width: "100%", flex: 1, top: Max_Header_Height, zIndex: 1, }, off: { position: "absolute", width: "100%", flex: 1, top: Min_Header_Height, zIndex: 1, }, }; const [headerVisible, setHeaderVisible] = useState(false); const onScroll = (event) => { scrollHandlers.onScroll(event); switch (headerSize) { case "big": setHeaderVisible(false); return; case "small": setHeaderVisible(true); return; case "default": default: const scrollY = event.nativeEvent.contentOffset.y; if (Scroll_Distance < scrollY == headerVisible) return; LayoutAnimation.configureNext({ duration: 100, update: { type: "easeOut" }, }); setHeaderVisible(Scroll_Distance < scrollY); break; } }; return ( {viewHeader ? <> : shortHeader} {viewHeader ? <> : longHeader} {topStickyContent} {topStickyContent && ( )} {children} ); };