import { defineComponent, reactive, ref } from 'vue' import { Sticky, List, Popup, Icon } from 'vant' import Search from '@/components/col-search' import request from '@/helpers/request' import Item from './item' import SelectTag from '../search/select-tag' import { useRoute, useRouter } from 'vue-router' import ColResult from '@/components/col-result' import styles from './index.module.less' import { getRandomKey, musicBuy } from '../music' import { state } from '@/state' import SelectSubject from '../search/select-subject' const noop = () => {} export default defineComponent({ name: 'MusicList', props: { hideSearch: { type: Boolean, default: false }, defauleParams: { type: Object, default: () => ({}) }, onItemClick: { type: Function, default: noop }, teacherId: { type: String || Number, default: '' } }, setup({ hideSearch, defauleParams, onItemClick, teacherId }, { expose }) { localStorage.setItem('behaviorId', getRandomKey()) const route = useRoute() // const router = useRouter() const tempParams: any = {} if (state.version) { tempParams.version = state.version || '' // 处理ios审核版本 tempParams.platform = state.platformType === 'STUDENT' ? 'ios-student' : 'ios-teacher' } const params = reactive({ search: (route.query.search as string) || '', musicTagIds: route.query.tagids || '', page: 1, ...tempParams, ...defauleParams }) const data = ref(null) const loading = ref(false) const finished = ref(false) const isError = ref(false) const tagVisibility = ref(false) const apiSuffix = ref( state.platformType === 'STUDENT' ? '/api-student' : '/api-teacher' ) const onSearch = (value: string) => { params.page = 1 params.search = value data.value = null FetchList() } const FetchList = async () => { if (loading.value) { return } loading.value = true isError.value = false const tempParams = { ...params, idAndName: params.search, createBy: teacherId } if (state.platformType === 'TEACHER') { tempParams.myself = false } try { const res = await request.post(`${apiSuffix.value}/music/sheet/list`, { data: tempParams }) if (data.value) { const result = (data.value?.rows || []).concat(res.data.rows || []) data.value.rows = result } data.value = data.value || res.data params.page = res.data.pageNo + 1 finished.value = res.data.pageNo >= res.data.totalPage } catch (error) { isError.value = true } loading.value = false } const onComfirm = tags => { const d = Object.values(tags).flat().filter(Boolean).join(',') params.musicTagIds = d params.page = 1 data.value = null FetchList() tagVisibility.value = false } const onComfirmSubject = item => { params.page = 1 params.subjectIds = item.id subject.id = item.id subject.name = item.name data.value = null FetchList() subject.show = false } const subject = reactive({ show: false, name: '全部', id: '' }) expose({ onSearch, onComfirm, onComfirmSubject }) return () => ( <> {!hideSearch && ( (tagVisibility.value = true)} filterDot={!!params.musicTagIds} v-slots={{ left: () => (
(subject.show = true)} > {subject.name}
) }} />
)} {data.value && data.value.rows.length ? data.value.rows.map(item => ( { if (onItemClick === noop) { musicBuy(item) } else { onItemClick?.(item) } }} /> )) : !loading.value && ( )}
(tagVisibility.value = val)} > {}} defaultValue={route.query.tagids as string} /> {/* 声部弹框 */} (subject.show = false)} onClosed={() => (subject.show = false)} > ) } })