import React, { useCallback, useState } from "react"; import { Platform, Text, View } from "react-native"; import { Meta } from "@storybook/react"; import { useSharedValue } from "react-native-reanimated"; import { HeaderTabView } from "./index"; import { TabInfiniteScrollList } from "./index"; import { Route } from "./index"; const LIST_LENGTH = 24; const ITEM_HEIGHT = 60; const HEADER_HEIGHT = 300; export default { component: HeaderTabView, title: "Components/HeaderTabView", } as Meta; const TabScene = ({ route }: any) => { return ( { return ( {`${route.title}-Item-${index}`} ); }} estimatedItemSize={ITEM_HEIGHT} overscan={{ main: ITEM_HEIGHT, reverse: ITEM_HEIGHT, }} /> ); }; export const Basic: React.FC = () => { const [isRefreshing, setIsRefreshing] = useState(false); const [routes] = useState([ { key: "like", title: "Like", index: 0 }, { key: "owner", title: "Owner", index: 1 }, { key: "created", title: "Created", index: 2 }, ]); const [index, setIndex] = useState(0); const animationHeaderPosition = useSharedValue(0); const animationHeaderHeight = useSharedValue(0); const renderScene = useCallback(({ route }: any) => { switch (route.key) { case "like": return ; case "owner": return ; case "created": return ; default: return null; } }, []); const onStartRefresh = async () => { setIsRefreshing(true); setTimeout(() => { console.log("onStartRefresh"); setIsRefreshing(false); }, 300); }; const renderHeader = () => ( Features Header: support any custom touch or gesture event. List: use react-virtuoso on web, use FlashList on native. Tabbar: support sticky on web. ); return ( ); };