import React, { Component } from 'react' import { VList } from '../../common' import { Tabs, WhiteSpace, Toast } from 'antd-mobile' import './courselist.scss' import HeaderSearch from '../../common/HeaderSearch/index' import { http, getParam } from "@/utils" import Loading from '@/common/Loading' import { connect } from 'react-redux'; import { StickyContainer, Sticky } from "react-sticky"; function stopScroll(e) { e.preventDefault() } @connect(({user}) => ({ user })) class Classify extends Component { constructor(props) { super(props) this.state = { ispull: false, display: 'none', arr: [{basics: []}, {advanced: []}], allClass: [], data: [], activeTab: decodeURIComponent(getParam('name')), isLoading: true, top: 44 } } componentDidMount() { this.getTabs() this.getList() const el = document.querySelector('.search-nav'); this.setState({ top: el.offsetHeight }); } componentWillUnmount() { document.removeEventListener('touchmove', stopScroll) } // 获取tabs接口 getTabs = () => { let data = 0 http.get(`${API.home}/m/course/classify/${data}`) .then((res) => { const _this = this if (res.data.code === 200) { if (res.data.data.common.length > 0) { let arr = ['basics', 'advanced'] let arr2 = [{basics: []}, {advanced: []}] let arr3 = [] arr.forEach(function (item, index) { arr2[item] = res.data.data.common[index] res.data.data.common[index].list.forEach(function (item, index) { arr3.push({'title': item.c_name, 'id': item.c_id}) }) }) _this.setState({ arr: arr2, allClass: arr3 }) } } else { Toast.info(res.data.msg, 2) } }) .catch(err => { console.log(err) }) } // 获取课程接口 getList = () => { const _this = this _this.setState((state, props) => ({ isLoading: true })); http.get(`${API.home}/m/course/list/${getParam('id')}`).then((res) => { if (res.data.code === 200) { _this.setState({ data: res.data.data, isLoading: false }) } }) } // 点击横向滚动tab查询 ontabclick = (tab) => { this.props.history.push(`/courselist?id=${tab.id}&name=${tab.title}`) this.getList() this.setState({ activeTab: decodeURIComponent(getParam('name')) }); } // 上下展示 pulldown = () => { this.setState(status => ({ ispull: !status.ispull, display: status.ispull ? 'none' : 'block' }), () => { this.state.ispull ? document.addEventListener('touchmove', stopScroll, { passive: false }) : document.removeEventListener('touchmove', stopScroll) }); } // 弹窗里面tab点击查询 labelclick = (item) => { this.props.history.push(`/courselist?id=${item.c_id}&name=${item.c_name}`) this.getList() this.setState(status => ({ ispull: !status.ispull, display: status.ispull ? 'none' : 'block', activeTab: decodeURIComponent(getParam('name')) })) } toCourseDetail = (id) => { const {dispatch, history} = this.props; // dispatch(getCourses(id, () => { history.push(`/detail?id=${id}`) // })); } toClassify = () => { this.props.history.replace('/classify'); } render() { const {user = {}} = this.props; let isLogin = user.data && user.data.uid ? true : false; const bottom = ( <i className={'iconfont iconiconfront-69 pull-down'}></i> ) const top = ( <i className={'iconfont iconiconfront-71 pull-down'}></i> ) let page = this.state.allClass.findIndex((item) => item.title === this.state.activeTab) return ( <div className='class-child'> <HeaderSearch isLogin={isLogin} toHref={this.toClassify} /> <Loading isLoading={this.state.isLoading}> <div className='class-content'> {/* <WhiteSpace/> */} <div onClick={this.pulldown.bind(this)}> {this.state.ispull ? top : bottom} </div> <StickyContainer> {/* <Tabs tabs={this.state.allClass} animated={false} page={page} onChange={(tab) => this.ontabclick(tab)} renderTabBar={props => <div className={'custom-render-bar'}> <Tabs.DefaultTabBar {...props}/> </div>} > */} <Tabs tabs={this.state.allClass} animated={false} page={page} onChange={(tab) => this.ontabclick(tab)} renderTabBar={props => { return ( <Sticky> {({style}) => { return ( <div style={{...style, top: `${this.state.top}px`, zIndex: 1}}> <Tabs.DefaultTabBar {...props} /> </div> ) }} </Sticky> ) }} > <div className='tabs'> <ul> {this.state.data && this.state.data.length > 0 && this.state.data.map((item, index) => { const Info = ( <div className="info"> <p className='title' onClick={() => this.toCourseDetail(item.course_id)}> {item.course_title} </p> <p className='contact text-overflow-2'>{item.desc}</p> <div className='des'> { item.is_restricted ? <LimitFree course={item}/> : item.is_buy ? <span className="isbuy">已购买</span> : <p className="course-price"> <span className="new">¥{item.price1}</span> <span className="old">¥{item.price0}</span> </p> } </div> </div> ) const status = ( !item.is_buy && <div> {item.bargain_num === 0 && item.groupon_num !== 0 && <p className='course-status'>拼团减{item.groupon_num}元</p> } {item.bargain_num !== 0 && item.groupon_num === 0 && <p className='course-status'>砍价减{item.bargain_num}元</p> } { item.is_aist && <span className='return_cash'></span> } </div> ) return ( <VList key={index} status={status} img={item.image_name} id={item.course_id} info={Info} toDetail={this.toCourseDetail} /> ) })} </ul> </div> </Tabs> </StickyContainer> <WhiteSpace/> </div> <div className='mbc-box' style={{display: this.state.display}}> { this.state.arr.basics && <div className="tabcontent"> <ClassCourse activeTab={this.state.activeTab} data={this.state.arr.basics.list} title={this.state.arr.basics.name} labelclick={this.labelclick}/> <ClassCourse activeTab={this.state.activeTab} data={this.state.arr.advanced.list} title={this.state.arr.advanced.name} labelclick={this.labelclick}/> </div> } </div> </Loading> </div> ) } } function ClassCourse(props) { return ( <div className="class-course"> <p className='course-items-title'>{props.title}</p> <div className='items-box'> { props.data && props.data.length > 0 && props.data.map((item, index) => { return ( <span className={props.activeTab === item.c_name ? 'active-label' : 'item-label'} key={index} onClick={e => props.labelclick(item)}>{item.c_name}</span> ) }) } </div> </div> ) } function LimitFreeStatus({course}) { /* * limit-free-status: 0-未领取 1-已领取 2-已过期 * * */ switch (course.limit_free_status) { case 0: return <div className="limit-free"> <span>限时免费</span> <span>¥{course.price0}</span> </div> case 1: return <div>已领取</div> case 2: return <p className="course-price"> <span className="new">¥{course.price1}</span> <span className="old">¥{course.price0}</span> </p> } } function LimitFree({course}) { if (course.is_buy) { if (course.limit_free_status === 1) { return <div className={'isbuy'}>已领取</div> } else { return <div className={'isbuy'}>已购买</div> } } else { return <LimitFreeStatus course={course}/> } } export default Classify;