import React, { Component } from 'react' import './index.scss' import { Tabs, Toast } from "antd-mobile" import { getParam, http, SendMessageToApp, browser } from "@/utils" import { Popup } from "@common/index" import QRCode from 'qrcode' import { uniqBy } from 'lodash' import { connect } from 'react-redux' import { withRouter } from 'react-router-dom' @connect(state => ({user: state.user})) class Live extends Component { popupInstance = null state = { tabs: [], lives: [], preheatLives: [], todayIndex: '', isApp: getParam('version'), QRCodeUrl: '', } componentDidMount() { http.get(`${API.home}/sys/get_live_info`) .then(res => { const {data, code, msg} = res.data if (code == 200) { let tabs = uniqBy(data, item => item.date) let todayIndex = tabs.findIndex(item => item['is_today']) tabs = tabs.map(item => ({title: item.date})) this.setState({ tabs, lives: data, todayIndex: todayIndex < 0 ? 0 : todayIndex, }) } else { Toast.info(msg, 2, null, false) } }) } toLogin = () => { const {history} = this.props if (!getParam('version')) { history.push('/passport') } else { SendMessageToApp("toLogin") } } toLiveRoom = id => { const {history, isLogin} = this.props var _czc = _czc || [] var name = '直播间id=' + id _czc.push(["_trackEvent", name, 'm端双十一大咖直播-正在直播']) if (this.state.isApp) { if (isLogin) { SendMessageToApp('toLiveRoom', id) } else { SendMessageToApp("toLogin") } } else { if (isLogin) { window.location.href = `${window.location.protocol}//www.julyedu.com/live/m_room/${id}` } else { history.push('/passport') } } } saveImage = () => { let version = getParam('version') version = typeof version === 'string' ? version.replace('.', '').replace('.', '').slice(0, 3) : '' const {QRCodeUrl} = this.state if (version && parseInt(version) < 451) { Toast.info('当前不支持此功能,升级到最新版本app可以点击保存二维码!', 2, null, false) } else { SendMessageToApp('generateQRCode', QRCodeUrl) } } checkVideo = (url) => { let version = getParam('version'); const {history, user} = this.props; if(!version) { if (user.hasError) { this.toLogin() }else{ const vCourseId = url.split('/')[0]; history.push(`/play/video?id=${vCourseId}`) } }else{ Toast.info('当前版本不支持此功能,请前往h5/pc查看回放该直播', 2, null, false); } } makeSubscribe = id => { const {user} = this.props if (user.hasError) { this.toLogin() } var name = '直播间id=' + id _czc.push(["_trackEvent", name, 'm端双十一大咖直播-立即预约']) http.get(`${API['base-api']}/sys/createLiveQrcode/${id}`) .then(res => { const {data} = res if (data.errno == 200) { this.setState(() => ({ QRCodeUrl: data.data.url, })) QRCode.toDataURL(data.data.url, (err, url) => { if (!this.popupInstance) { this.popupInstance = Popup({ title: '扫码关注“七月在线”服务号即可预约', content: ( <> <img id={'live-qr-code'} src={url} alt=""/> { browser.isAndroidApp ? ( <button className={'save-image'} onClick={this.saveImage}>保存二维码</button> ) : null } </> ), close: () => new Promise(resolve => { this.popupInstance = null resolve() }) }) } }) } else if(data.errno == 4030 || data.errno == 4040){ }else { Toast.info(data.msg, 2, null, false) } }) } render() { const {tabs, lives, todayIndex} = this.state return ( <div id={'live'}> <div className="title"> <img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/active19_1111/title-decorate-left.png" alt=""/> <span>大咖直播</span> <img src="https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/active19_1111/title-decorate-right.png" alt=""/> </div> <div className="live-container"> { todayIndex !== '' && <Tabs tabs={tabs} tabBarBackgroundColor={'transparent'} tabBarActiveTextColor={'#5600DF'} tabBarInactiveTextColor={'#FFF604'} tabBarUnderlineStyle={{display: 'none'}} initialPage={todayIndex} swipeable={false} > { tabs.map((item, index) => { const todayLives = lives.filter(liveItem => liveItem.date === item.title) return ( <div key={index}> { todayLives && todayLives.map((item, index) => { return ( <LiveContent item={item} key={index} makeSubscribe={this.makeSubscribe} toLiveRoom={this.toLiveRoom} checkVideo={this.checkVideo}/> ) }) } </div> ) }) } </Tabs> } </div> </div> ) } } function LiveContent({item, makeSubscribe, toLiveRoom, checkVideo}) { return ( <div className="content"> { item['is_teacher'] ? <div className="tag teacher">讲师分享</div> : <div className="tag student">学员分享</div> } <div className="person-info"> <div className="left"> <img src={item.avatar} alt="头像" className="avatar"/> </div> <div className="right"> <div className="name">讲师:{item['teacher']}</div> <div className="profession">{item['teacher_desc']}</div> </div> </div> <div className="title">{item.title}</div> <div className="time">直播时间:{item.time}</div> <div className="outline"> <div className="outline-title">内容大纲:</div> <ul> { item['content'].map((content, index) => { return <li key={index}>{content}</li> }) } </ul> </div> { item['on_live'] ? <button className={'on-living'} onClick={() => { toLiveRoom(item['room_url']) }}>正在直播</button> : item['is_end'] ? item.transcribe_url === '' ? <button className={'subscribed'}>已结束</button> : <button className={'on-living'} onClick={() => checkVideo(item.transcribe_url)}>查看回放</button> : item['is_subscribe'] ? <button className={'subscribed'}>已预约</button> : <button className={'subscribe'} onClick={makeSubscribe.bind(this, item['live_id'])}>立即预约</button> } </div> ) } export default withRouter(Live)