|
|
@@ -1,13 +1,15 @@
|
|
|
<script lang="ts" setup>
|
|
|
import { user } from '@/.cool'
|
|
|
import { ref, onMounted, computed } from 'vue'
|
|
|
-import { fetchSubjectConfigInfo } from '@/services/subject/info'
|
|
|
+import { fetchSubjectAppInfo } from '@/services/subject/info'
|
|
|
import type { SubjectCatalogResult } from '@/services/subject/catalog'
|
|
|
+import type { SubjectCourseResult } from '@/services/subject/course'
|
|
|
import Progress from '../catalog/components/progress.uvue'
|
|
|
import Back from '@/components/back.uvue'
|
|
|
import Lock from '@/components/lock.uvue'
|
|
|
import Loading from '@/components/loading.uvue'
|
|
|
import { config } from '@/config'
|
|
|
+import { dict } from '@/.cool/store'
|
|
|
import { router } from "@/.cool";
|
|
|
const isLoading = ref(true)
|
|
|
const visible = ref<boolean>(false)
|
|
|
@@ -15,11 +17,13 @@ const dataList = ref<SubjectCatalogResult[]>([])
|
|
|
const catalog = ref<SubjectCatalogResult>()
|
|
|
const record = ref<any>()
|
|
|
const userInfo = computed(() => user.info.value?.userInfo)
|
|
|
+const courseList = ref<SubjectCourseResult[]>()
|
|
|
async function getDataList() {
|
|
|
- const res = await fetchSubjectConfigInfo({ id: router.query().id,delFlag: false })
|
|
|
+ const res = await fetchSubjectAppInfo({ id: router.query().id,delFlag: false })
|
|
|
record.value = res
|
|
|
dataList.value = res.catalogList || []
|
|
|
catalog.value = res?.catalogList?.[0]
|
|
|
+ courseList.value = res?.courseList || []
|
|
|
}
|
|
|
onMounted(async () => {
|
|
|
try {
|
|
|
@@ -30,9 +34,19 @@ onMounted(async () => {
|
|
|
isLoading.value = false
|
|
|
}
|
|
|
})
|
|
|
-function handleSelect(item: SubjectCatalogResult) {
|
|
|
- catalog.value = item
|
|
|
+const scrollLeft = ref<any>(0)
|
|
|
+const cardsScrollView = ref<any>(null)
|
|
|
+async function handleSelect(val: SubjectCatalogResult) {
|
|
|
+ catalog.value = val
|
|
|
visible.value = false
|
|
|
+ uni.createSelectorQuery().select(`.category-${val.id}`).boundingClientRect().exec(async (rect) => {
|
|
|
+ if (cardsScrollView.value && rect[0]) {
|
|
|
+ cardsScrollView.value.scrollTo({
|
|
|
+ left: scrollLeft.value + rect[0].left - dict.getWindowHeight() / 2, // 减去顶部偏移
|
|
|
+ animated: true
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
function handleDetail(item: SubjectCatalogResult) {
|
|
|
if (!item.payFlag && !item.trialPlay) {
|
|
|
@@ -49,6 +63,21 @@ function handleDetail(item: SubjectCatalogResult) {
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
+function debouncedOnScroll(e: any) {
|
|
|
+ console.log(e);
|
|
|
+ scrollLeft.value = e.detail.scrollLeft
|
|
|
+ dataList.value.forEach(async (category) => {
|
|
|
+ const selector = `.category-${category.id}`
|
|
|
+ await uni.createSelectorQuery().selectAll(selector).boundingClientRect().exec((rects) => {
|
|
|
+ for (const rect of rects[0]) {
|
|
|
+ if (rect.left <= (dict.getWindowHeight() / 2) && rect.left > 0) {
|
|
|
+ catalog.value = category
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
@@ -71,8 +100,8 @@ function handleDetail(item: SubjectCatalogResult) {
|
|
|
<cl-icon name="arrow-left-right-line" color="primary"></cl-icon>
|
|
|
</view>
|
|
|
<view class="boxs">
|
|
|
- <scroll-view class="scroll-view_H" direction="horizontal" :show-scrollbar="false">
|
|
|
- <view class="scroll-view-item_H bg-[white]" v-for="course in catalog?.courseList || []" :key="course.id"
|
|
|
+ <scroll-view class="scroll-view_H" direction="horizontal" ref="cardsScrollView" :show-scrollbar="false" @scroll="debouncedOnScroll">
|
|
|
+ <view class="scroll-view-item_H bg-[white]" :class="`category-${course.catalogId}`" v-for="course in courseList || []" :key="course.id"
|
|
|
@tap="handleDetail(course)">
|
|
|
<cl-image :src="config.baseUrl + course?.fileList?.[0]?.url" mode="heightFix"
|
|
|
class="!w-full !h-[26vh] mb-[2px] rounded-xl"></cl-image>
|