<template>
    <view class="u-wrap">
        <view class="u-menu-wrap">
            <scroll-view scroll-y scroll-with-animation class="u-tab-view menu-scroll-view" :scroll-top="scrollTop"
                :scroll-into-view="itemId">
                <view v-for="(item, index) in tabbar" :key="index" class="u-tab-item"
                    :class="[current == index ? 'u-tab-item-active' : '']" @tap.stop="swichMenu(index)">
                    <text class="u-line-1">{{ item.businessName }}</text>
                </view>
            </scroll-view>
            <scroll-view :scroll-top="scrollRightTop" scroll-y scroll-with-animation class="right-box"
                @scroll="rightScroll">
                <view class="page-view">
                    <view class="class-item" :id="'item' + index" v-for="(item, index) in tabbar" :key="index">
                        <view class="item-title">
                            <text class="item-businessName">{{ item.businessName }}</text>
                            <text class="item-title-text">{{ item.businessDescribe }}</text>

                        </view>
                        <view class="item-container">
                            <view class="thumb-box" v-for="(item1, index1) in (item.children ? item.children : [item])"
                                :key="index1" @click="clickMenu(item, item1)">
                                <image class="item-menu-image" :src="item1.businessIcon"></image>
                                <view class="item-menu-name">{{ item1.businessName }}</view>
                            </view>
                        </view>
                    </view>
                </view>
            </scroll-view>
        </view>
        <CustomTabBar page="class" />
    </view>
</template>
<script>
import { getTreeList } from '@/api/volunteer'
import { volunteerSeachgetTreeList } from "@/api/volunteerDetailsApi/details.js"
import { getVolunteerInfo } from '@/api/volunteer.js'
import CustomTabBar from '@/components/CustomTabBar/index.vue'

export default {
    components: { CustomTabBar },
    data() {
        return {
            scrollTop: 0, //tab标题的滚动条位置
            oldScrollTop: 0,
            current: 0, // 预设当前项的值
            menuHeight: 0, // 左边菜单的高度
            menuItemHeight: 0, // 左边菜单item的高度
            itemId: '', // 栏目右边scroll-view用于滚动的id
            tabbar: [],

            arr: [],
            scrollRightTop: 0, // 右边栏目scroll-view的滚动条高度
            timer: null, // 定时器
            userType: uni.getStorageSync('userType')|| 1,

        }
    },
    onReady() {

    },
    onShow() {
        this.getData();
        this.getMenuItemTop()
    },
    methods: {
        getData() {
            getTreeList({ parentId: '0' }).then(res => {
                this.tabbar = res.data;
            })
        },
        // 点击左边的栏目切换
        async swichMenu(index) {
            if (this.arr.length == 0) {
                await this.getMenuItemTop();
            }
            if (index == this.current) return;
            this.scrollRightTop = this.oldScrollTop;
            this.$nextTick(() => {
                this.scrollRightTop = this.arr[index];
                this.current = index;
                this.leftMenuStatus(index);
            })
        },
        // 获取一个目标元素的高度
        getElRect(elClass, dataVal) {
            new Promise((resolve, reject) => {
                const query = uni.createSelectorQuery().in(this);
                query.select('.' + elClass).fields({
                    size: true
                }, res => {
                    // 如果节点尚未生成，res值为null，循环调用执行
                    if (!res) {
                        setTimeout(() => {
                            this.getElRect(elClass);
                        }, 10);
                        return;
                    }
                    this[dataVal] = res.height;
                    resolve();
                }).exec();
            })
        },
        // 观测元素相交状态
        async observer() {
            this.tabbar.map((val, index) => {
                let observer = uni.createIntersectionObserver(this);
                // 检测右边scroll-view的id为itemxx的元素与right-box的相交状态
                // 如果跟.right-box底部相交，就动态设置左边栏目的活动状态
                observer.relativeTo('.right-box', {
                    top: 0
                }).observe('#item' + index, res => {
                    if (res.intersectionRatio > 0) {
                        let id = res.id.substring(4);
                        this.leftMenuStatus(id);
                    }
                })
            })
        },
        // 设置左边菜单的滚动状态
        async leftMenuStatus(index) {
            this.current = index;
            // 如果为0，意味着尚未初始化
            if (this.menuHeight == 0 || this.menuItemHeight == 0) {
                await this.getElRect('menu-scroll-view', 'menuHeight');
                await this.getElRect('u-tab-item', 'menuItemHeight');
            }
            // 将菜单活动item垂直居中
            this.scrollTop = index * this.menuItemHeight + this.menuItemHeight / 2 - this.menuHeight / 2;
        },
        // 获取右边菜单每个item到顶部的距离
        getMenuItemTop() {
            new Promise(resolve => {
                let selectorQuery = uni.createSelectorQuery();
                selectorQuery.selectAll('.class-item').boundingClientRect((rects) => {
                    // 如果节点尚未生成，rects值为[](因为用selectAll，所以返回的是数组)，循环调用执行
                    if (!rects.length) {
                        setTimeout(() => {
                            this.getMenuItemTop();
                        }, 10);
                        return;
                    }
                    rects.forEach((rect) => {
                        // 这里减去rects[0].top，是因为第一项顶部可能不是贴到导航栏(比如有个搜索框的情况)
                        this.arr.push(rect.top - rects[0].top);
                        resolve();
                    })
                }).exec()
            })
        },
        // 右边菜单滚动
        async rightScroll(e) {
            this.oldScrollTop = e.detail.scrollTop;
            if (this.arr.length == 0) {
                await this.getMenuItemTop();
            }
            if (this.timer) return;
            if (!this.menuHeight) {
                await this.getElRect('menu-scroll-view', 'menuHeight');
            }
            setTimeout(() => { // 节流
                this.timer = null;
                // scrollHeight为右边菜单垂直中点位置
                let scrollHeight = e.detail.scrollTop + this.menuHeight / 2;
                for (let i = 0; i < this.arr.length; i++) {
                    let height1 = this.arr[i];
                    let height2 = this.arr[i + 1];
                    // 如果不存在height2，意味着数据循环已经到了最后一个，设置左边菜单为最后一项即可
                    if (!height2 || scrollHeight >= height1 && scrollHeight < height2) {
                        this.leftMenuStatus(i);
                        return;
                    }
                }
            }, 10)
        },
        async clickMenu(service, record) {
            console.log(service, record);
            const { id } = service;
            const key = id;
            if (this.userType == '2') {
                // const parmas = { ...service, key,name:service.businessName,record };
                // uni.navigateTo({
                //     url: `/pages_home/pages/register/index?data=${encodeURIComponent(JSON.stringify(parmas))}`
                // })
                // return;

                const res = await getVolunteerInfo({
                    serviceCategory: key
                });
                const parmas = { ...service, key, name: service.businessName, record };

                if (res.code === 200 && res.data) {
                    //已有注册，跳转详情页面
                    uni.navigateTo({
                        url: `/pages_home/pages/details/index?data=${encodeURIComponent(JSON.stringify(parmas))}`
                    })
                    return
                }
                uni.navigateTo({
                    url: `/pages_home/pages/register/index?data=${encodeURIComponent(JSON.stringify(parmas))}`
                })
                return;

            }

            // 动态获取 parentId
            const params = {
                parentId: key
            }
            const res = await volunteerSeachgetTreeList(params)
            // 只有第一条和第二条可以跳转
            // if (key === '1' || key === '2') {
            //     uni.navigateTo({
            //         url: `/pages_home/pages/client/details?dataList=${encodeURIComponent(JSON.stringify(res.data))}&id=${record.id}`
            //     });
            // } else {
            //     // 其他条目提示“敬请期待”
            //     uni.showToast({
            //         title: '敬请期待',
            //         icon: 'none'
            //     });
            // }
            uni.navigateTo({
                url: `/pages_home/pages/client/details?dataList=${encodeURIComponent(JSON.stringify(res.data))}&id=${record.id}`
            });

        }


    }
}
</script>

<style lang="scss" scoped>
.u-wrap {
    display: flex;
    flex-direction: column;

    position: fixed;
    top: 0px;
    left: 0px;
    right: 0px;
    // bottom: 150rpx;
    bottom: 0;
    // padding-bottom: 150px;

}

.u-search-box {
    padding: 18rpx 30rpx;
}

.u-menu-wrap {
    flex: 1;
    display: flex;
    overflow: hidden;
}

.u-search-inner {
    background-color: rgb(234, 234, 234);
    border-radius: 100rpx;
    display: flex;
    align-items: center;
    padding: 10rpx 16rpx;
}

.u-search-text {
    font-size: 26rpx;
}

.u-tab-view {
    width: 188rpx;
    height: 100%;
}

.u-tab-item {
    height: 100rpx;
    background: #f6f6f6;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    justify-content: center;

    font-family: PingFang SC;
    font-size: 26rpx;
    font-weight: 500;
    line-height: 42rpx;
    text-align: center;
    letter-spacing: normal;
    color: #818181;
    border-left: 4rpx solid #fff;
}

.u-tab-item-active {
    position: relative;
    background: #fff;
}

.u-tab-item-active::before {
    border-left: 4rpx solid rgba(221, 94, 69, 1) !important;
}

.u-tab-item-active::before {
    content: "";
    position: absolute;
    border-left: 4px solid $u-primary;
    height: 100%;
    left: -5rpx;
    top: 0;
}

.u-tab-view {
    height: 100%;
    background: #F6F6F6;
}


.right-box {
    background-color: rgb(250, 250, 250);
}

.page-view {
    // padding: 16rpx;
}

.class-item {
    // margin-bottom: 30rpx;
    background-color: #fff;
    padding: 34rpx;
    border-radius: 8rpx;
}

.class-item:last-child {
    min-height: 100vh;
}

.item-title {
    // font-size: 26rpx;
    // color: $u-main-color;
    // font-weight: bold;
    // text-align: center;
    display: flex;
    align-items: center;
    justify-content: space-between;

    border-radius: 14rpx;
background: linear-gradient(180deg, #FFF9F3 0%, rgba(255, 255, 255, 0) 100%);
}

.item-businessName {
    font-family: PingFang SC;
    font-size: 26rpx;
    font-weight: 600;
    line-height: 42rpx;
    letter-spacing: normal;
    color: #262626;
}

.item-title-text {
    font-family: Yuppy SC;
    font-size: 24rpx;
    font-weight: 500;
    line-height: 42rpx;
    text-align: right;
    letter-spacing: normal;
    color: #E58182;
}

.item-menu-name {
    font-family: PingFang SC;
    font-size: 26rpx;
    font-weight: 500;
    line-height: 42rpx;
    text-align: center;
    letter-spacing: normal;
    color: #5D5D5D;
}

.item-container {
    // display: flex;
    // flex-wrap: wrap;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 12rpx;
    margin: 24rpx 0;
}

.thumb-box {
    // width: 33.333333%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    // margin-top: 20rpx;

    // background: #f5f5f5;
    padding: 12rpx 0;
}

.item-menu-image {
    width: 138rpx;
    height: 138rpx;
    margin-bottom: 12rpx;
}
</style>
