Files
taimed-international-app/hooks/useCourse.ts

99 lines
2.3 KiB
TypeScript

// hooks/useCourse.ts
/**
* 课程相关的可复用逻辑
*/
import { ref } from 'vue'
import { courseApi } from '@/api/modules/course'
import type { ICourseDetail, ICatalogue, IChapter, IVipInfo } from '@/types/course'
export function useCourse() {
const loading = ref(false)
const courseDetail = ref<ICourseDetail | null>(null)
const catalogueList = ref<ICatalogue[]>([])
const chapterList = ref<IChapter[]>([])
const userVip = ref<IVipInfo | null>(null)
/**
* 获取课程详情
*/
const fetchCourseDetail = async (courseId: number) => {
try {
loading.value = true
const res = await courseApi.getCourseDetail(courseId)
if (res.code === 0 && res.data) {
courseDetail.value = res.data.course
catalogueList.value = res.data.catalogues || []
return res.data
}
} catch (error) {
console.error('获取课程详情失败:', error)
throw error
} finally {
loading.value = false
}
}
/**
* 获取章节列表
*/
const fetchChapterList = async (catalogueId: number) => {
try {
const res = await courseApi.getCatalogueChapterList(catalogueId)
if (res.code === 0) {
chapterList.value = res.chapterList || []
return res.chapterList
}
} catch (error) {
console.error('获取章节列表失败:', error)
chapterList.value = []
throw error
}
}
/**
* 检查VIP状态
*/
const checkVipStatus = async (courseId: number) => {
try {
const res = await courseApi.checkCourseVip(courseId)
if (res.code === 0) {
userVip.value = res.userVip || null
return res.userVip
}
} catch (error) {
console.error('检查VIP状态失败:', error)
userVip.value = null
throw error
}
}
/**
* 领取免费课程
*/
const getFreeCourse = async (catalogueId: number) => {
try {
const res = await courseApi.startStudyForMF(catalogueId)
if (res.code === 0) {
uni.showToast({ title: '领取成功', icon: 'success' })
return true
}
return false
} catch (error) {
console.error('领取免费课程失败:', error)
throw error
}
}
return {
loading,
courseDetail,
catalogueList,
chapterList,
userVip,
fetchCourseDetail,
fetchChapterList,
checkVipStatus,
getFreeCourse
}
}