import Taro, { pxTransform, useState, useEffect } from "@tarojs/taro";
import { ScrollView, View } from "@tarojs/components";
import { IProps } from "../../../@types/verticalTab";
import {
screenPercent,
generateId,
getRectNumber,
isAliPay,
classNames
} from "../../lib";
import "./index.scss";
let scrollTimer: any = undefined;
export default function ClVerticalTab(props: IProps) {
let scrollTab = false;
let id = "";
const [tabsState, setTabsState] = useState(props.tabs || []);
const currentId = props.current ? props.current : props.tabs[0].id;
const [current, setCurrent] = useState(currentId);
const [verticalNavTop, setVerticalNavTop] = useState(
tabsState.findIndex(item => item.name === props.tabs[0].name)
);
const [scrollId, setScrollId] = useState(currentId);
const [scrollContent, setScrollContent] = useState(0);
const [clickTab, setClickTab] = useState(false);
useEffect(() => {
const list = props.tabs || [];
setTabsState(
list.map((item: any) => {
item.cu_vertical_tab_id = generateId();
return item;
})
);
}, [props.tabs]);
const tabs: {
name: string;
id: string;
top?: number;
bottom?: number;
}[] = tabsState || [];
// const [scrollTimer, setScrollTimer] = useState(0);
const isH5 = Taro.getEnv() === Taro.ENV_TYPE.WEB;
const onScroll = e => {
if (clickTab) return;
let tabHeight = 0;
for (let i = 0; i < tabs.length; i++) {
const query = Taro.createSelectorQuery();
const view = query.select("#" + tabs[i].id);
view.boundingClientRect().exec(res => {
const data = res[0];
tabs[i].top = tabHeight;
tabHeight = tabHeight + data.height;
tabs[i].bottom = tabHeight;
});
}
let scrollTop = e.detail.scrollTop + 20;
isH5 && setScrollContent(e.detail.scrollTop);
if (!scrollTab) {
for (let i = 0; i < tabs.length; i++) {
if (
scrollTop > (tabs[i].top || 0) &&
scrollTop < (tabs[i].bottom || 0)
) {
// console.log(i)
setVerticalNavTop(i);
setCurrent(tabs[i].id);
return false;
}
}
}
};
const onH5Scroll = e => {
if (clickTab) return;
if (scrollTimer) clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
onScroll(e);
clearTimeout(scrollTimer);
}, 300);
};
const tabsComponent = tabs.map((item: any) => (
{
id = item.id;
scrollTab = true;
changeTop(id);
setCurrent(item.id);
setVerticalNavTop(tabs.findIndex(tab => tab.name === item.name));
setClickTab(true);
!isH5 && setScrollId(item.id);
setTimeout(() => {
setClickTab(false);
}, 800);
}}
>
{item.name}
));
const changeTop = (id: any) => {
const query = Taro.createSelectorQuery();
const view = query.select("#" + id);
const topView = query.select("#" + tabs[0].id);
let top = 0;
new Promise(resolve => {
topView.boundingClientRect().exec(res => {
const data = res[0];
resolve(data.top);
});
}).then((res: number) => {
top = res;
new Promise(resolve => {
view.boundingClientRect().exec(res => {
const data = res[getRectNumber()];
setTimeout(() => {
const endTop = Math.abs(top - data.top);
setScrollContent(endTop);
scrollTab = false;
resolve();
}, 300);
});
});
});
};
const weappComponent = (
{this.props.children}
);
const h5Component = (
{this.props.children}
);
return (
{tabsComponent}
{isH5 ? h5Component : weappComponent}
);
}
ClVerticalTab.options = {
addGlobalClass: true
};
ClVerticalTab.defaultProps = {
tabs: [{ name: "", id: "" }],
height: 0,
current: "",
backTop: false
} as IProps;