import React, {
forwardRef,
useImperativeHandle,
useMemo,
useState,
} from "react";
import { ViewStyle } from "react-native";
import { SceneMap, TabView } from "react-native-tab-view";
import { CollapsibleHeaderTabView } from "react-native-tab-view-collapsible-header";
import { vs } from "../commons";
import { Spinner, View } from "../components";
export type TabProps = {
children: Array<{
component: any;
[key: string]: any;
}>;
disableLazy?: boolean;
enableSwipe?: boolean;
isRefreshing?: boolean;
initialPositon?: number;
containerStyle?: ViewStyle;
onRefreshing?: () => void;
onChangeIndex?: (i: number) => void;
renderHeader?: (i: number) => any;
renderTabBar?: () => any;
renderScrollHeader?: () => any;
};
export const Tab = forwardRef((props: TabProps, ref?: any) => {
const {
children,
disableLazy,
enableSwipe,
isRefreshing,
initialPositon,
containerStyle,
onRefreshing,
onChangeIndex,
renderHeader,
renderScrollHeader,
} = props;
const [index, setIndex] = useState(initialPositon || 0);
const routes = useMemo(() => {
return children.map((item, index) => ({
key: `tab_${index}`,
component:
typeof item.component === "function"
? item.component
: () => item.component,
}));
}, [children]);
const onIndexChange = (i: number) => {
if (i < 0 || i >= routes.length) return;
onChangeIndex?.(i);
setIndex(i);
};
useImperativeHandle(ref, () => ({
set: onIndexChange,
prev: () => onIndexChange(index - 1),
next: () => onIndexChange(index + 1),
}));
const renderScene = useMemo(() => {
return SceneMap(
routes.reduce(
(result, item) => ({
...result,
[item.key]: item.component,
}),
{}
)
);
}, [routes]);
const renderRefreshControl = () => {
return ;
};
const MyTab = renderScrollHeader ? CollapsibleHeaderTabView : TabView;
return (
{/* tabbar */}
{renderHeader?.(index)}
{/* tabview */}
null}
{...props}
{...(typeof isRefreshing === "boolean"
? {
isRefreshing,
onStartRefresh: onRefreshing,
renderRefreshControl,
}
: {})}
/>
);
});