video.bef5adae.chunk.js.map 106 KB
Newer Older
FE committed
1
{"version":3,"sources":["components/video/recommendation/index.js","components/video/video-catalog/index.js","components/video/datum-catalog/index.js","components/video/CustomPlayButton/index.js","components/video/index.js","common/v-list-base/index.js","components/detail/single/index.js","components/detail/single/singleSuccess.js"],"names":["Bottom","_ref","item","react_default","a","createElement","className","price1","price0","Recommendation","connect","state","num","list","courseId","getRecommendation","http","get","concat","API","home","_this","props","vCourseId","then","res","data","code","setState","Array","isArray","toast_default","info","msg","toCourseDetail","id","_this$props","dispatch","history","push","this","_this2","length","map","Info","course_title","simpledescription","recommendation_Bottom","v_list_base","key","course_id","img","image_name","handleClick","PureComponent","VideoCatalog","i","selectVideo","videoCatalog","index","classnames","active","activeIndex","onClick","bind","name","duration","video_auth","practice","qid","react_router_dom","to","pathname","is_tested","search","from","window","location","title","Component","DatumCatalog","datum","accordion_default","Panel","header","dir_name","files","file_id","file_name","defaultProps","videojs","getComponent","Button","CustomPlayButtonCover","Object","getPrototypeOf","prototype","call","el_","CustomPlayButton","player","options","classCallCheck","possibleConstructorReturn","on","tap","type","player_","play","off","registerComponent","options_","children","alert","modal_default","ProgressShareModal","isShow","learn_day_count","parseFloat","action_power","style","display","href","url","closeShareModal","Video","previousPlaybackRate","currentPlaybackRate","reconnect","isCurrentVideoFirstPlay","WATCHTIME","COUNTSCHEDULE","RECENTLEARN","videoList","currentVideoSrc","isAuth","course","salePrice","isLoading","isShowShareModal","shareData","singleBox","singMess","singleType","nowPrice","laterPrice","tobuy","_this2$state$course","errno","simple","toSingleset","localStorage","setItem","JSON","stringify","boxHide","val","payCallback","assertThisInitialized","getParam","parse","getItem","intervalPayStatus","setInterval","clearInterval","Number","now_price","three_day_later_price","isweixinPay","weixin_code","onBridgeReady","WeixinJSBridge","invoke","appId","timeStamp","nonceStr","package","signType","paySign","err_msg","document","addEventListener","attachEvent","check","oid","setupRecord","recordSocket","io","record","transports","forceNew","recordTimer","sendRecord","emit","recordUserInfo","uid","user","courseID","video_id","video_time","parseInt","currentTime","plat","setupWS","ws","WebSocket","setTimeout","timer","e","console","log","position","sendMessage","message","readyState","send","close","clearTimeout","PROCESS_URL","getShareProgressInfo","countSchedule","_this2$state","_this2$state$course2","ctype","is_aist","mtype","token","platform","v_course_id","sendWatchTime","sec","rate","_this2$state2","_this2$state2$course","time","setupTimer","count","watchSec","paused","initializePlayer","HELP_IMPROVE_VIDEOJS","video","controls","preload","bigPlayButton","textTrackDisplay","posterImage","errorDisplay","playbackRates","controlBar","pictureInPictureToggle","addChild","_this2$state3","is_live","playbackRate","sendLastRecord","post","hasAuth","setPlayerSrc","playVideo","getCoursePrice","getLastVideoIndex","lastIndex","findIndex","getVideoList","_res$data","_res$data$data","playSetup","_this2$state$course3","scheduleTime","last_video_id","lessonAvailable","Promise","resolve","playWithAuth","text","onPress","src","ready","_this2$state$course4","_this2$state4","protocol","_this$props$location$","browser","isWeixin","jsCookie","getDatumCatalog","replace","slice","dispose","_this3","_this4","_this$props2","match","_this$state","toHref","HeaderBar","arrow","go","common","ref","el","webkit-playsinline","playsInline","x-webkit-airplay","x5-video-player-type","activeClassName","single","vcourseId","videoId","course_tile","singleSuccess","react_router","exact","path","render","video_video_catalog","assign","video_datum_catalog","video_recommendation","VList","react__WEBPACK_IMPORTED_MODULE_0___default","status","alt","tab","Single","_Users_fe_frontCode_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_2__","_Users_fe_frontCode_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__","_Users_fe_frontCode_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__","payType","toBuy","videoID","orderId","order_id","alipayPay","weixinPay","antd_mobile_lib_toast__WEBPACK_IMPORTED_MODULE_1___default","encodeURIComponent","toLowerCase","_Users_fe_frontCode_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_6__","showSingleBox","toBuyAll","zerobuyReceive","success","colse","zerogroupBuy","getOrderId","groupOrderId","getOrderStatus","getTime","pdd_order_id","endTime","end_time","toGroup","hour","min","nextProps","nextContext","_this5","date","now","Date","s","differenceInSeconds","m","differenceInMinutes","h","differenceInHours","react__WEBPACK_IMPORTED_MODULE_8___default","class_price","compose","withRouter","isPdd","group","cidArr","toLearn","react__WEBPACK_IMPORTED_MODULE_7___default","avatar","String","padStart"],"mappings":"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","file":"mrstatic/js/video.bef5adae.chunk.js","sourcesContent":["import React, { PureComponent } from 'react';\nimport {connect} from 'react-redux';\nimport {getCourses} from './../../detail/actions';\nimport './recommendation.scss'\nimport { http } from '@/utils'\nimport { Toast } from \"antd-mobile\";\nimport VList from '@/common/v-list-base';\n\n\nconst Bottom = ({item}) => {\n    return (\n        <div className='bottom'>\n            <span className='price'>¥{item.price1}</span>\n            <span className='stale-price'>¥{item.price0}</span>\n        </div>\n    )\n}\n\n@connect()\nclass Recommendation extends PureComponent {\n    state = {\n        num: 10,\n        list: [],\n        courseId: null\n    }\n\n    componentDidMount() {\n        this.getRecommendation()\n    }\n\n    getRecommendation = () => {\n        http.get(`${API.home}/m/play/recommend_course/${this.props.vCourseId}?num=${this.state.num}`)\n            .then(res => {\n                const data = res.data\n                if(data.code === 200){\n\n                    this.setState({\n                        list: Array.isArray(data.data) ? data.data : []\n                    })\n\n                }else {\n                    Toast.info(data.msg)\n                }\n            })\n    }\n\n    toCourseDetail = (id) => {\n        const { dispatch, history } = this.props;\n        // dispatch(getCourses(id, () => {\n            history.push(`/detail?id=${id}`)\n        // }));\n    }\n\n    render() {\n        return (\n            this.state.list.length\n            ?\n            <div className='recommendation'>\n                <div className={'title'}>相关推荐</div>\n                <ul>\n                    {\n                        this.state.list.map(item => {\n                            const Info = (\n                                <div className=\"info\">\n                                    <p className='title text-overflow-1'>{item.course_title}</p>\n                                    <p className='des text-overflow-2'>{item.simpledescription}</p>\n                                    <Bottom\n                                        item={item}\n                                    />\n                                </div>\n                            )\n\n                            return (\n                                <VList\n                                    key={item.course_id}\n                                    img={item.image_name}\n                                    handleClick={this.toCourseDetail}\n                                    info={Info}\n                                    id={item.course_id}\n                                />\n                            )\n                        })\n                    }\n                </ul>\n            </div>\n                : null\n        );\n    }\n}\n\nexport default Recommendation;","import React, { Component } from 'react'\nimport './video-catalog.scss'\nimport { Link } from \"react-router-dom\";\nimport classnames from 'classnames'\n\n\nclass VideoCatalog extends Component {\n\n    handleClick = (i) => {\n        this.props.selectVideo(i)\n    }\n\n    render() {\n        return (\n            <div className='video-catalog'>\n                <ul>\n                    {\n                        this.props.videoCatalog.map((item, index) => {\n                            return (\n                                <li \n                                    key={item.id}\n                                    className={classnames({active: this.props.activeIndex === index})}\n                                >\n                                    <div \n                                        className=\"video-title\" \n                                        onClick={this.handleClick.bind(this, index)}\n                                    >\n                                        <span className=\"title\">{item.name}</span>\n                                        <span className='duration'>{item.duration}</span>\n                                        <i className={classnames(`iconfont`,\n                                            [item.video_auth === 0\n                                                ? 'iconiconfront-74'\n                                                : 'iconplay_hovericon'],\n                                        )}/>\n                                    </div>\n                                    {\n                                        (item.practice && item.practice.qid)\n                                            ? <Link to={{\n                                                pathname: item.practice.is_tested ? '/campResolve' : '/campTest',\n                                                search: `?keshi_id=${item.id}&qid=${item.practice.qid}`,\n                                                state: {from: `/play/video${window.location.search}`}\n                                            }}>\n                                                <div className=\"exercise\">\n                                                    课后练习:{item.practice.title}\n                                                    <i className={classnames('iconfont',!item.video_auth ? 'iconiconfront-74' : item.practice.is_tested ? 'iconiconfront-3' : '')}/>\n                                                </div>\n                                            </Link>\n                                            : null\n                                    }\n                                </li>\n                            )\n                        })\n                    }\n                </ul>\n            </div>\n        );\n    }\n}\n\nexport default VideoCatalog;","import React, { Component } from 'react';\nimport './datum-catalog.scss'\nimport { Accordion } from \"antd-mobile\";\n\n\nclass DatumCatalog extends Component {\n\n    static defaultProps = {\n        datum: [{\n            dir_name: '',\n            files: [{\n                file_name: '',\n                file_id: 0\n            }]\n        }]\n    }\n\n    render() {\n        const {datum} = this.props\n        return (\n            <div className='datum-catalog'>\n                <p className='prompt'>课程资料请到PC端播放页下载</p>\n                <Accordion>\n                    {\n                        datum && datum.length && datum.map((item, index) => {\n                            return (\n                                <Accordion.Panel header={item.dir_name} key={index}>\n                                    {\n                                        item.files.map(item => {\n                                            return (\n                                                <div key={item.file_id} className='file-name'>\n                                                    {item.file_name}\n                                                </div>\n                                            )\n                                        })\n                                    }\n                                </Accordion.Panel>\n                            )\n                        })\n                    }\n                </Accordion>\n            </div>\n        );\n    }\n}\n\nexport default DatumCatalog;","import videojs from 'video.js'\n\nconst Component = videojs.getComponent('Component')\nconst Button = videojs.getComponent('Button')\n\nclass CustomPlayButtonCover extends Component {\n    createEl() {\n        return super.createEl('div', {\n            className: 'vjs-custom-play-button-cover'\n        })\n    }\n\n    dispose() {\n        this.el_ && (this.el_ = null)\n    }\n}\n\nclass CustomPlayButton extends Button {\n    constructor(player, options) {\n        super(player, options)\n        this.on('tap', this.tap)\n    }\n\n    createEl() {\n        return super.createEl('button', {\n            className: 'vjs-custom-play-button'\n        }, {\n            type: 'button'\n        })\n    }\n\n    tap() {\n        this.player_.play()\n    }\n\n    dispose() {\n        if (this.el_) {\n            this.off('tap', this.tap)\n            this.el_ = null\n        }\n    }\n}\n\n\nComponent.registerComponent('CustomPlayButton', CustomPlayButton)\n\nCustomPlayButtonCover.prototype.options_ = {\n    children: [\n        'CustomPlayButton'\n    ]\n}\n\nComponent.registerComponent('CustomPlayButtonCover', CustomPlayButtonCover)\n","import React, { Component } from 'react'\nimport HeaderBar from '@/common/HeaderBar'\nimport './video.scss'\nimport { NavLink, Route, Redirect, Switch, Link } from 'react-router-dom'\nimport { http, getParam, browser } from '@/utils'\nimport Recommendation from './recommendation'\nimport VideoCatalog from './video-catalog'\nimport DatumCatalog from './datum-catalog'\nimport { Toast } from 'antd-mobile'\nimport videojs from 'video.js'\nimport 'video.js/dist/video-js.min.css'\nimport { Modal } from \"antd-mobile\"\nimport { Loading } from '@/common'\nimport { connect } from \"react-redux\"\nimport jsCookie from 'js-cookie'\nimport io from 'socket.io-client'\nimport Single from \"@/components/detail/single\";\nimport SingleSuccess from \"../detail/single/singleSuccess\";\nimport './CustomPlayButton'\n\n\nlet alert = Modal.alert\n\nfunction ProgressShareModal(props) {\n    return (\n        props.isShow &&\n        <div className='progress-share-modal-wrapper'>\n            <div className=\"progress-share-modal\">\n                <div className=\"title\">每日打卡</div>\n                <ul className=\"progress-container\">\n                    <li>\n                        <div className=\"title\">累计学习</div>\n                        <div className=\"number\"><span className='num'>{props.data.learn_day_count}</span>天</div>\n                    </li>\n                    <li>\n                        <div className=\"title\">行动力超过</div>\n                        <div className=\"number\"><span className='num'>{parseFloat(props.data.action_power)}</span>%\n                        </div>\n                    </li>\n                </ul>\n                <div className=\"share-container\">\n                    <div className=\"title\">分享到</div>\n                    <ul>\n                        <li className='share-icon'>\n                            <a style={{display: 'block'}} href={props.data.url}>\n                                <div className=\"icon\"><i className='iconfont iconweixinzhifu'/></div>\n                                <div className='text'>微信好友</div>\n                            </a>\n                        </li>\n                        <li className='share-icon'>\n                            <a style={{display: 'block'}} href={props.data.url}>\n                                <div className=\"icon\"><i className='iconfont iconpengyouquaniconx'/></div>\n                                <div className='text'>朋友圈</div>\n                            </a>\n                        </li>\n                    </ul>\n                </div>\n                <i className=\"iconfont iconiconfront-2 close\" onClick={props.closeShareModal}/>\n            </div>\n        </div>\n    )\n}\n\nclass Video extends Component {\n\n    video   //video element\n    player  //video player instance\n\n    courseID\n\n    ws  //websocket instance\n    timer\n    token\n    count\n    watchSec\n    previousPlaybackRate = 1\n    currentPlaybackRate = 1\n    reconnect = true\n    // timeEnough = false\n\n    recordSocket\n    recordTimer\n\n    isCurrentVideoFirstPlay  = true\n\n    WATCHTIME = \"watch_time\"\n    COUNTSCHEDULE = \"count_schedule\"\n    RECENTLEARN = \"recent_learn\"\n\n    state = {\n        title: '',\n        courseId: null,\n        videoList: [],\n        datum: [],\n        currentVideoSrc: '',\n        activeIndex: 0,\n        isAuth: true,\n        course: {}, // course.course_id 为 0 或 '' 时 为免费课程\n        salePrice: null,\n        vCourseId: null,\n        isLoading: true,\n        isShowShareModal: false,\n        shareData: {},\n        singleBox: false,\n        singMess: '',\n        singleType: 1,// 单集购买需要\n        nowPrice: 0,// 单集购买需要\n        laterPrice: 0,// 单集购买需要\n    }\n\n\n    componentDidMount() {\n        if (window.location.protocol === 'https:') {\n            window.location.replace('http' + window.location.href.slice(5))\n            return\n        }\n\n        this.courseID = getParam('id')\n        if (!this.courseID) {\n            this.props.history.replace('/')\n            return\n        }\n        this.setState({\n            courseId: this.courseID\n        })\n        const {location, location: {state = {}}} = this.props;\n        if (state.oid) {\n            this.check(state.oid);\n        }\n        if (getParam('is_class') === 1 || getParam('weixinpay')) {\n            this.payCallback()\n        }\n        if (browser.isWeixin) {\n            this.isweixinPay()\n        }\n        this.token = jsCookie.get('token')\n        this.getVideoList()\n        this.getDatumCatalog()\n        this.setupRecord()\n    }\n\n    // 直接购买\n    tobuy = () => {\n        // 详情页单集购买到该页面,url中的id不是课程id\n        const {course = {}} = this.state;\n        http.get(`${API['base-api']}/m/cart/addtopreorder/[${course.course_id}]`).then((res) => {\n            if (res.data.errno === 0) {\n                this.props.history.push(`/order?id=${course.course_id}`, {simple: 1})\n            } else {\n                Toast.info(res.data.msg, 2);\n            }\n        })\n    }\n    // 购买单集\n    toSingleset = (item) => {\n        // console.log(item);\n        this.setState({\n            singleBox: true,\n            singleType: 1,\n            singMess: item\n        })\n        window.localStorage.setItem('singMess', JSON.stringify(item))\n    }\n\n    // 自组件传给父组件的boxHide\n    boxHide = (val) => {\n        this.setState({singleBox: val, singleType: 1})\n    }\n\n    // 单集购买 H5支付成功后回调\n    payCallback = () => {\n        const _this = this;\n        if (!getParam('oid')) {\n            return;\n        } else {\n            this.setState({\n                singMess: JSON.parse(window.localStorage.getItem('singMess'))\n            })\n            _this.intervalPayStatus = setInterval(function () {\n                http.get(`${API['base-api']}/m/orderState/oid/${getParam('oid')}`).then(res => {\n                    if (res.data.errno === 401) {\n                        clearInterval(_this.intervalPayStatus);\n                        _this.intervalPayStatus = null;\n                        // 获取课程类型\n                        http.get(`${API['base-api']}/class_order_status/${getParam('oid')}`).then((res) => {\n                            if (Number(res.data.data.errno) === 200) {\n                                // 正常购买单集成功\n                                _this.setState({\n                                    singleType: 6,\n                                })\n                            } else if (Number(res.data.data.errno) === 201) {\n                                // 0元参团\n                                _this.setState({\n                                    singleType: 4,\n                                })\n                            } else if (Number(res.data.data.errno) === 202) {\n                                // 0元购\n                                _this.setState({\n                                    singleType: 3,\n                                })\n                            } else if (Number(res.data.data.errno) === 203) {\n                                // 三天内特价\n                                _this.setState({\n                                    nowPrice: res.data.data.data.now_price,\n                                    laterPrice: res.data.data.data.three_day_later_price,\n                                    singleType: 2,\n                                })\n                            } else {\n                                Toast.info(res.data.data.msg, 2)\n                            }\n                        })\n                    }\n                })\n            }, 1000)\n        }\n    };\n    // 单集购买 微信内支付成功后回调\n    isweixinPay = () => {\n        let _this = this;\n        let weixin_code = getParam('code');\n        if (weixin_code) {\n            if (!getParam('oid')) {\n                return\n            } else {\n                this.setState({\n                    singMess: JSON.parse(window.localStorage.getItem('singMess'))\n                })\n                // this.props.weixinPay(weixin_code)\n                http.get(`${API['base-api']}/pay/wxpay/pub_charge/oid/${getParam('oid')}/code/${weixin_code}`).then((res) => {\n                    if (res.data.errno === 0) {\n                        const data = res.data.data;\n\n                        function onBridgeReady() {\n                            WeixinJSBridge.invoke(\n                                'getBrandWCPayRequest', {\n                                    \"appId\": data.appId,                //公众号名称,由商户传入\n                                    \"timeStamp\": data.timeStamp,        //时间戳,自1970年以来的秒数\n                                    \"nonceStr\": data.nonceStr,          //随机串\n                                    \"package\": data.package,\n                                    \"signType\": data.signType,          //微信签名方式:\n                                    \"paySign\": data.paySign             //微信签名\n                                },\n                                function (res) {\n                                    if (res.err_msg == \"get_brand_wcpay_request:ok\") {\n                                        Toast.info('支付成功', 2);\n                                        _this.intervalPayStatus = setInterval(function () {\n                                            http.get(`${API['base-api']}/m/orderState/oid/${getParam('oid')}`).then(res => {\n                                                if (res.data.errno === 401) {\n                                                    clearInterval(_this.intervalPayStatus);\n                                                    _this.intervalPayStatus = null;\n                                                    // 获取课程类型\n                                                    http.get(`${API['base-api']}/class_order_status/${getParam('oid')}`).then((res) => {\n                                                        if (Number(res.data.data.errno) === 200) {\n                                                            // 正常购买单集成功\n                                                            _this.setState({\n                                                                singleType: 6,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 201) {\n                                                            // 0元参团\n                                                            _this.setState({\n                                                                singleType: 4,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 202) {\n                                                            // 0元购\n                                                            _this.setState({\n                                                                singleType: 3,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 203) {\n                                                            // 三天内特价\n                                                            _this.setState({\n                                                                nowPrice: res.data.data.data.now_price,\n                                                                laterPrice: res.data.data.data.three_day_later_price,\n                                                                singleType: 2,\n                                                            })\n                                                        } else {\n                                                            Toast.info(res.data.data.msg, 2)\n                                                        }\n                                                    })\n                                                }\n                                            })\n                                        }, 1000)\n                                    } else {\n                                        alert('支付失败')\n                                    }\n                                }\n                            )\n                        }\n\n                        if (typeof WeixinJSBridge == \"undefined\") {\n                            if (document.addEventListener) {\n                                document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false)\n                            } else if (document.attachEvent) {\n                                document.attachEvent('WeixinJSBridgeReady', onBridgeReady)\n                                document.attachEvent('onWeixinJSBridgeReady', onBridgeReady)\n                            }\n                        } else {\n                            onBridgeReady()\n                        }\n                    } else {\n                        Toast.info(res.data.msg, 2)\n                    }\n                })\n            }\n        }\n    };\n    // 判断支付是否成功\n    check = (oid) => {\n        this.setState({\n            singMess: JSON.parse(window.localStorage.getItem('singMess'))\n        })\n        http.get(`${API['base-api']}/class_order_status/${oid}`).then((res) => {\n            if (Number(res.data.data.errno) === 200) {\n                // 正常购买单集成功\n                this.setState({\n                    singleType: 6,\n\n                })\n            } else if (Number(res.data.data.errno) === 201) {\n                // 0元参团\n                this.setState({\n                    singleType: 4,\n\n                })\n            } else if (Number(res.data.data.errno) === 202) {\n                // 0元购\n                this.setState({\n                    singleType: 3,\n\n                })\n            } else if (Number(res.data.data.errno) === 203) {\n                // 三天内特价\n                this.setState({\n                    nowPrice: res.data.data.data.now_price,\n                    laterPrice: res.data.data.data.three_day_later_price,\n                    singleType: 2,\n\n                })\n            } else {\n                Toast.info(res.data.data.msg, 2)\n            }\n        })\n    }\n\n    setupRecord = () => {\n        this.recordSocket = io(API.record, {\n            transports: ['websocket'],\n            forceNew: true\n        })\n        // this.recordSocket = io(API.record)\n        // this.recordSocket.on('seek', time => {\n        //     this.player.currentTime(time)\n        // })\n\n        // 开启定时器 每5秒发送一次学习记录 --删除\n        this.recordTimer = setInterval(() => {\n            this.sendRecord()\n        }, 5000)\n    }\n\n    // 发送学习记录\n    sendRecord = () => {\n        if (this.recordSocket && this.player) {\n            this.recordSocket.emit('addRecord', this.recordUserInfo())\n        }\n    }\n    // 返回学习记录的数据\n    recordUserInfo = () => {\n        let {uid} = this.props.user.data\n        return {\n            uid,\n            course_id: this.courseID,\n            video_id: this.state.videoList[this.state.activeIndex]['id'],\n            video_time: parseInt(this.player.currentTime()),\n            plat: 5\n        }\n    }\n\n    // 9502 初始化 监听事件\n    setupWS = () => {\n        this.ws = new WebSocket(API[\"process-api\"]);\n        this.ws.addEventListener('error', () => {\n            this.ws = null\n        })\n        this.ws.addEventListener('close', () => {\n            if (this.reconnect) {\n                this.ws = null\n                setTimeout(() => {\n                    this.setupWS();\n                }, 1000)\n            }\n            clearInterval(this.timer)\n            this.timer = null;\n        })\n        this.ws.addEventListener('message', e => {\n            const data = JSON.parse(e.data);\n            data.code == 4040 && (this.reconnect = false);\n            if(data.code === 0) {\n                console.log(\"上次的学习记录\" + JSON.stringify(data));\n                if(data.data && data.data.position) {\n                    this.player.currentTime(data.data.position);\n                }\n            }\n        })\n    }\n\n    sendMessage = message => {\n        let readyState = this.ws.readyState, _this = this;\n        if(readyState === 1) {\n            this.ws && this.ws.send(JSON.stringify(message))\n        }else if(readyState === 3) {\n            this.ws.close();\n            this.ws = null;\n            let reconnect = setTimeout(function() {\n                clearTimeout(reconnect);\n                reconnect = null;\n                _this.ws = new WebSocket(PROCESS_URL);\n            }, 500);\n        }\n    }\n\n    //视频结束请求接口\n    getShareProgressInfo = () => {\n        http.get(`${API['base-api']}/m/aist/share_data/${this.courseID}/${this.state.videoList[this.state.activeIndex]['id']}`)\n            .then(res => {\n                const {data} = res\n                if (data.errno == 200) {\n                    this.setState({shareData: data.data, isShowShareModal: true})\n                }\n            })\n    }\n\n    //告诉服务端计算进度\n    countSchedule = () => {\n        const {videoList, activeIndex, vCourseId, course = {}} = this.state\n        if (Number(course.course_id) === 0 || course.course_id === '') {\n            console.log('免费课程 拦截');\n            return;\n        }\n        let ctype = 0;\n        if (course.is_aist) {\n            ctype = 2;\n        }\n        // 计算进度 根据ctype判断 课程类型 0-视频 1-直播 2-AI特训营\n        this.sendMessage({\n            mtype: 'count_schedule',\n            uid: this.props.user.data.uid,\n            token: this.token,\n            platform: 5,\n            video_id: videoList[activeIndex]['id'],\n            course_id: this.state.courseId,\n            v_course_id: vCourseId,\n            ctype: ctype,\n        })\n\n    }\n    // 发送时间消息\n    sendWatchTime = (sec, rate) => {\n        const {videoList, activeIndex, vCourseId, course = {}} = this.state\n        // 免费课程不发送\n        // if (Number(course.course_id) === 0 || course.course_id === '') {\n        //     console.log('免费课程 拦截');\n        //     return;\n        // }\n        // 时间为0 不发送消息\n        if (Number(sec) === 0) {\n            return;\n        }\n        let ctype = 0;\n        if (course.is_aist) {\n            ctype = 2;\n        }\n        // 时间足够不发送\n        // if(this.timeEnough) {\n        //     console.log('5001 时间足够');\n        //     return;\n        // }\n        this.sendMessage({\n            mtype: 'watch_time',\n            rate,\n            time: sec,\n            video_id: videoList[activeIndex]['id'],\n            course_id: this.state.courseId,\n            v_course_id: vCourseId,\n            uid: this.props.user.data.uid,\n            token: this.token,\n            platform: 5,\n            position: parseInt(this.player.currentTime()),\n            ctype: ctype,\n        })\n    }\n\n    setupTimer = () => {\n        this.count = 0\n        this.watchSec = 0\n        clearInterval(this.timer)\n        this.timer = null;\n        this.timer = setInterval(() => {\n            if (this.player && this.player.player()) {\n                if (this.count === 5) {\n                    this.sendWatchTime(this.watchSec, this.currentPlaybackRate)\n                    this.count = this.watchSec = 0\n                } else {\n                    !this.player.paused() && this.watchSec++\n                    !this.player.paused() && this.count++\n                }\n            }\n        }, 1000)\n\n    }\n\n    // 初始化视频播放器\n    initializePlayer = () => {\n        window.HELP_IMPROVE_VIDEOJS = false;\n        this.player = videojs(this.video, {\n            controls: true,\n            preload: 'auto',\n            bigPlayButton: false,\n            textTrackDisplay: false,\n            posterImage: false,\n            errorDisplay: false,\n            playbackRates: ['0.75', '1', '1.5', '2'],\n            controlBar: {\n                pictureInPictureToggle: false\n            }\n        })\n        this.player.addChild('CustomPlayButtonCover')\n        this.player.on('ready', () => {\n            this.recordSocket.emit('load', this.recordUserInfo())\n        })\n        this.player.on('play', () => {\n            const {videoList, activeIndex, vCourseId, course = {}} = this.state\n            // 当视频播放时 看是否是第一次播放(初次进入页面 刷新页面 切换视频 都是第一次播放  需要获取上次的播放时间)\n            if(this.isCurrentVideoFirstPlay) {\n                // 当某些原因导致视频暂停时(用户暂停 网络不好等) 再播放时不需要发送\n                this.isCurrentVideoFirstPlay = false;\n                // 发送消息 recent_learn\n                this.ws.send(JSON.stringify({\n                    mtype: this.RECENTLEARN,\n                    uid: this.props.user.data.uid,\n                    token: this.token,\n                    platform: 5,\n                    video_id: videoList[activeIndex]['id'],\n                    course_id: this.state.courseId,\n                    v_course_id: vCourseId,\n                    is_live: 0,\n                }))\n            }\n            if(!this.timer) {\n                this.setupTimer();\n            }\n        })\n        this.player.on('ratechange', () => {\n            this.currentPlaybackRate = this.player.playbackRate()\n            this.sendWatchTime(this.watchSec, this.previousPlaybackRate)\n            this.count = this.watchSec = 0\n            this.previousPlaybackRate = this.currentPlaybackRate\n        })\n        this.player.on('ended', () => {\n            this.sendWatchTime(this.watchSec, this.currentPlaybackRate);\n            this.count = this.watchSec = 0;\n            this.countSchedule(); // 计算进度 -- 播放完毕\n            // 返现课程才出现打卡记录\n            if(this.state.course.is_aist) {\n                this.getShareProgressInfo()\n            }\n            clearInterval(this.timer);\n            this.timer = null;\n        })\n        this.player.on('seeked', () => {\n            this.sendRecord()\n        })\n    }\n\n    sendLastRecord = () => {\n        http.post(`${API.home}/m/course/record_last_video`, {\n            v_course_id: this.state.course['v_course_id'],\n            video_id: this.state.videoList[this.state.activeIndex].id\n        })\n    }\n\n    componentWillUnmount() {\n        this.player && this.player.dispose()\n\n        clearInterval(this.timer)\n        this.timer = null;\n        this.ws && this.ws.close()\n        this.ws = null\n\n        clearInterval(this.recordTimer)\n        this.recordSocket && this.recordSocket.close()\n        this.recordSocket = null\n    }\n\n    // 选择新的视频\n    selectVideo = index => {\n        if (index === this.state.activeIndex) {\n            return\n        }\n        console.log('selectVideo 先发送时间 再发送进度 在重置定时器');\n        this.isCurrentVideoFirstPlay = true; // 切换视频则重置这个变量 因为新视频肯定是首次播放\n        this.sendWatchTime(this.watchSec, this.currentPlaybackRate)\n        this.countSchedule(); // 计算进度 -- 选择新视频(可能是M端特有的)\n        this.setupTimer();\n\n        this.setState(\n            {\n                activeIndex: index\n            },\n            () => {\n\n                if (this.hasAuth(this.state.activeIndex)) {\n                    this.setPlayerSrc(this.state.videoList[index]['play_url'])\n                    this.sendLastRecord()\n                    this.playVideo()\n                } else {\n                    this.getCoursePrice();\n                }\n            }\n        );\n    }\n\n    getLastVideoIndex = lastIndex => {\n        return this.state.videoList.findIndex(item => item.id == lastIndex)\n    }\n\n    getVideoList = () => {\n        let url = '';\n        if (getParam('video_id')) {\n            url = `${API.home}/m/course/play/${this.courseID + '?video_id=' + getParam('video_id')}`\n            http.post(`${API['base-api']}/sys/get_class_audition`, {\n                video_id: getParam('video_id')\n            })\n        } else {\n            url = `${API.home}/m/course/play/${this.courseID}`\n        }\n        http.get(url).then(res => {\n                const {data = {}, code} = res.data;\n                if (code === 200) {\n                    this.setState(\n                        state => ({\n                            videoList: data['lessons'],\n                            currentVideoSrc: data['lessons'][state.activeIndex]['play_url'],\n                            course: data.course,\n                            courseId: data.course['course_id'],\n                            vCourseId: data.course['v_course_id'],\n                            title: data.course['course_title'],\n                            isLoading: false\n                        }),\n                        this.playSetup\n                    )\n                } else {\n                    Toast.info(data.msg)\n                }\n            }\n        )\n    }\n\n    playSetup = () => {\n        // is_aist,是否AI特训营\n        const {course = {}} = this.state;\n        // if (Number(course.course_id) === 0 || course.course_id === '') {\n        //     console.log('免费课程 拦截');\n        // }else{\n            let _this = this;\n            this.setupWS();\n            this.setupTimer();\n            let scheduleTime = setTimeout(function () {\n                clearTimeout(scheduleTime);\n                scheduleTime = null;\n                _this.countSchedule(); // 刚进入页面的时候 就计算进度  先获取视频列表getVideoList 获取列表后 播放选择的视频 然后计算进度\n            }, 1000);\n        // }\n        let index = this.getLastVideoIndex(course.last_video_id);\n        index = index >= 0 ? index : 0;\n        this.setState(\n            {\n                activeIndex: index\n            },\n            () => {\n                if (this.lessonAvailable(index)) {\n                    if (this.hasAuth(index)) {\n                        Promise.resolve().then(() => {\n                            this.initializePlayer()\n                            this.playWithAuth()\n                        })\n                    } else {\n                        this.getCoursePrice();\n                    }\n                } else {\n                    alert('暂无视频', '', [{\n                        text: 'OK',\n                        onPress: () => {\n                            this.props.history.push('/')\n                        }\n                    }])\n                }\n            }\n        );\n\n    }\n\n    setPlayerSrc = src => {\n        if (!this.player) {\n            this.initializePlayer()\n        }\n        this.player.src({\n            src,\n            type: 'application/x-mpegURL'\n        })\n    }\n\n    playVideo = () => {\n        this.player.ready(() => {\n            this.player.play()\n        })\n\n    }\n\n\n    getDatumCatalog() {\n        http.get(`${API.home}/m/course/data/${this.courseID}`)\n            .then(res => {\n                const data = res.data\n                if (data.code === 200) {\n\n                    this.setState({\n                        datum: data.data\n                    })\n\n                } else {\n                    Toast.info(data.msg)\n                }\n            })\n    }\n\n    lessonAvailable = index => {\n        return this.state.videoList[index]['video_size'] !== 0\n    }\n\n    getCoursePrice = () => {\n        const {course = {}} = this.state;\n        http.get(`${API.home}/sys/course/price/${course.course_id}`)\n            .then(res => {\n                const {data} = res\n                if (data.code === 200) {\n                    this.setState({\n                        salePrice: data.data['sale_price']\n                    })\n                }\n            })\n    }\n\n    playWithAuth = () => {\n        const {videoList, activeIndex} = this.state\n\n        if (this.hasAuth(activeIndex)) {\n            this.setPlayerSrc(videoList[activeIndex]['play_url'])\n        }\n    }\n\n    hasAuth = index => {\n        const {videoList} = this.state\n\n        let lesson = videoList[index]\n\n        if (lesson['video_auth']) {\n            this.setState({\n                isAuth: true\n            })\n            return true\n        } else {\n            this.setState({\n                isAuth: false\n            })\n            return false\n\n        }\n    }\n\n\n    render() {\n        let {match, location, history} = this.props\n        const {videoList, activeIndex, isAuth, salePrice, course, singleBox, singleType} = this.state;\n        let toHref = '';\n        if (location.state && location.state.to && location.state.to === 'detail') {\n            toHref = `/detail?id=${course.course_id}`\n        }\n        return (\n            <div className='play'>\n                <HeaderBar title={this.state.title} arrow={true} toHref={() => {\n                    toHref ? history.push(\n                        toHref,\n                        {\n                            to: 'classify'\n                        }\n                    ) : history.go(-1)\n                }}/>\n                <Loading isLoading={this.state.isLoading}>\n                    <div className=\"video\">\n                        <video className={'video-js'} ref={el => this.video = el}\n                               webkit-playsinline=\"true\"\n                               playsInline={true}\n                               x-webkit-airplay=\"allow\"\n                               x5-video-player-type=\"h5\">\n                            <source src={'/'} type='application/x-mpegURL'/>\n                        </video>\n                        {\n                            !isAuth && !!videoList[activeIndex]['is_class'] && (\n                                <div className=\"purchase-box\">\n                                    <div className='hint'>您尚未购买该课时,请购买后学习。</div>\n                                    <div className='btns'>\n                                        <button\n                                            type='button'\n                                            onClick={this.tobuy}\n                                            className='purchase-class'\n                                        >\n                                            ¥{salePrice} 购买课程\n                                        </button>\n                                        <button\n                                            type='button'\n                                            onClick={this.toSingleset.bind(this, videoList[activeIndex])}\n                                            className='purchase-episode'\n                                        >\n                                            ¥{videoList.length && videoList[activeIndex]['class_price']} 购买单集\n                                        </button>\n                                    </div>\n                                </div>\n                            )\n                        }\n                        {\n                            !isAuth && !!course.is_aist && (\n                                <div className=\"is-aist-box\">\n                                    <i className={'iconfont iconiconfront-21'}></i>\n                                    <p className={'time'}>{videoList[activeIndex]['aist_start_time']}</p>\n                                    <p className={'time'}>请耐心等待...</p>\n                                </div>\n                            )\n                        }\n                    </div>\n                    <div className='tab'>\n                        <div>\n                            <NavLink to={{pathname: `${match.url}/video`, search: `?id=${this.courseID}`}}\n                                     replace\n                                     activeClassName='active'\n                            >视频</NavLink>\n                        </div>\n                        <div>\n                            <NavLink to={{pathname: `${match.url}/datum`, search: `?id=${this.courseID}`}}\n                                     replace\n                                     activeClassName='active'\n                            >资料</NavLink>\n                        </div>\n                    </div>\n\n                    {/*单集购买*/}\n                    {\n                        singleBox &&\n                        <Single\n                            courseId={course.course_id}\n                            singleBox={this.state.singleBox}\n                            boxHide={this.boxHide}\n                            data={this.state.singMess}\n                            singleType={this.state.singleType}\n                            vcourseId={course.v_course_id}\n                            videoId={this.state.singMess.video_id}\n                            check={this.check}\n                            title={this.state.singMess.course_tile}/>\n                    }\n                    {/* 单集购买成功 */}\n                    {\n                        singleType !== 1 &&\n                        <SingleSuccess\n                            courseId={course.course_id}\n                            boxHide={this.boxHide}\n                            data={this.state.singMess}\n                            singleType={singleType}\n                            vcourseId={course.v_course_id}\n                            videoId={this.state.singMess.video_id}\n                            nowPrice={this.state.nowPrice}\n                            laterPrice={this.state.laterPrice}\n                        />\n                    }\n\n                </Loading>\n                <Switch>\n                    <Redirect exact from={'/play'} to={{\n                        pathname: '/play/video',\n                        search: location.search\n                    }}/>\n                    <Route\n                        path={`${match.path}/video`}\n                        render={props => {\n                            return (\n                                <VideoCatalog\n                                    activeIndex={this.state.activeIndex}\n                                    selectVideo={this.selectVideo}\n                                    videoCatalog={videoList}\n                                    {...props}\n                                />\n                            );\n                        }}\n                    />\n                    <Route path={`${match.path}/datum`} render={props => {\n                        return <DatumCatalog {...props} datum={this.state.datum}/>\n                    }}/>\n                </Switch>\n                <Route render={props => {\n                    return this.state.vCourseId ? <Recommendation {...props} vCourseId={this.state.vCourseId}/>\n                        : null\n                }}/>\n                <ProgressShareModal isShow={this.state.isShowShareModal}\n                                    closeShareModal={() => this.setState({isShowShareModal: false})}\n                                    data={this.state.shareData}\n                />\n\n            </div>\n        );\n    }\n}\n\n\nexport default connect(\n    state => ({user: state.user}),\n    null\n)(Video);\n","import React from 'react';\nimport './index.scss'\n\nconst VList = (props) => {\n    return (\n        <li className='v-list-base-item' onClick={props.handleClick.bind(this, props.id)}>\n            <div className=\"content\">\n                <div className=\"cover\">\n                    {props.status}\n                    <img src={props.img} alt=\"\"/>\n                </div>\n                {props.info}\n            </div>\n            {props.tab}\n        </li>\n    );\n};\n\nexport default VList;","import React, { Component } from 'react'\nimport './index.scss'\nimport { getParam, http, browser } from \"@/utils\";\nimport { Toast } from 'antd-mobile';\nimport { Link, withRouter } from \"react-router-dom\";\nimport { compose } from \"redux\";\nimport { connect } from \"react-redux\";\nimport { differenceInHours, differenceInMinutes, differenceInSeconds } from \"date-fns\";\n\n\nclass Single extends Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            // status: 1,\n            orderId: '',\n            nowPrice: '',\n            laterPrice: '',\n            hour: '',\n            min: '',\n            sec: '',\n            endTime: '',\n            groupOrderId: '',\n            payType: '0',  // 1支付宝 0微信\n            // singleBox: false,\n            showSingleBox: false,\n        }\n    }\n\n    componentDidMount() {\n        // if (getParam('is_class') === 1 || getParam('weixinpay')) {\n        //     console.log(0);\n        //     this.payCallback()\n        // }\n        // if (browser.isWeixin) {\n        //     this.isweixinPay()\n        // }\n    }\n\n    componentWillReceiveProps(nextProps, nextContext) {\n        // console.log(nextProps);\n        // this.setState({\n        //     singleBox: nextProps.singleBox\n        // })\n    }\n\n    // 选择支付方式\n    check = (type) => {\n        this.setState({\n            payType: type\n        })\n    }\n\n    // 确定购买\n    toBuy = () => {\n        const { courseId } = this.props;\n        const videoID = this.props.data.video_id || this.props.data.id;\n        http.get(`${API.home}/sys/createClassOrder/${videoID}`).then((res) => {\n            if (res.data.code === 200) {\n                this.setState({\n                    orderId: res.data.data.order_id\n                })\n                this.state.payType === '1' ? this.alipayPay(res.data.data.order_id, courseId) : this.weixinPay(res.data.data.order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n    // 微信支付\n    weixinPay = (orderId) => {\n        // 微信内部-支付\n        if (browser.isWeixin) {\n            window.location.href = \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=\" + encodeURIComponent(window.location.href + \"&aa=bb&oid=\" + orderId).toLowerCase() + \"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect\";\n        } else {\n            // 微信外部-支付\n            http.get(`${API['base-api']}/pay/wxpay/wap_charge/oid/${orderId}`).then((res) => {\n                if (res.data.errno === 0) {\n                    window.location.href = res.data.data.url + \"&redirect_url=\" + encodeURIComponent(window.location.href + \"&weixinpay=1&oid=\" + orderId).toLowerCase();\n                } else {\n                    Toast.info(res.data.msg, 2)\n                }\n            })\n        }\n    }\n    // 支付宝支付\n    alipayPay = (orderId, courseId) => {\n        http.get(`${API['base-api']}/pay/alipay/wap_charge_new/oid/${orderId}`).then((res) => {\n            if (res.data.errno === 0) {\n                window.location = res.data.data.url;\n                courseId && window.localStorage.setItem('payCourse', courseId);\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 微信内部支付\n    isweixinPay = () => {\n        let _this = this;\n        let weixin_code = getParam('code')\n        if (weixin_code) {\n            if (!getParam('oid')) {\n                return\n            } else {\n                http.get(`${API['base-api']}/pay/wxpay/pub_charge/oid/${getParam('oid')}/code/${weixin_code}`).then((res) => {\n                    if (res.data.errno === 0) {\n                        const data = res.data.data;\n\n                        function onBridgeReady() {\n                            WeixinJSBridge.invoke(\n                                'getBrandWCPayRequest', {\n                                    \"appId\": data.appId,                //公众号名称,由商户传入\n                                    \"timeStamp\": data.timeStamp,        //时间戳,自1970年以来的秒数\n                                    \"nonceStr\": data.nonceStr,          //随机串\n                                    \"package\": data.package,\n                                    \"signType\": data.signType,          //微信签名方式:\n                                    \"paySign\": data.paySign             //微信签名\n                                },\n                                function (res) {\n                                    if (res.err_msg == \"get_brand_wcpay_request:ok\") {\n                                        Toast.info('支付成功', 2);\n                                        _this.intervalPayStatus = setInterval(function () {\n                                            http.get(`${API['base-api']}/m/orderState/oid/${getParam('oid')}`).then(res => {\n                                                if (res.data.errno === 401) {\n                                                    clearInterval(_this.intervalPayStatus);\n                                                    _this.intervalPayStatus = null;\n                                                    // 获取课程类型\n                                                    http.get(`${API['base-api']}/class_order_status/${getParam('oid')}`).then((res) => {\n                                                        if (Number(res.data.data.errno) === 200) {\n                                                            // 正常购买单集成功\n                                                            this.setState({\n                                                                status: 6,\n                                                                showSingleBox: true,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 201) {\n                                                            // 0元参团\n                                                            this.setState({\n                                                                status: 4,\n                                                                showSingleBox: true,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 202) {\n                                                            // 0元购\n                                                            this.setState({\n                                                                status: 3,\n                                                                showSingleBox: true,\n                                                            })\n                                                        } else if (Number(res.data.data.errno) === 203) {\n                                                            // 三天内特价\n                                                            this.setState({\n                                                                nowPrice: res.data.data.data.now_price,\n                                                                laterPrice: res.data.data.data.three_day_later_price,\n                                                                status: 2,\n                                                                showSingleBox: true,\n                                                            })\n                                                        } else {\n                                                            Toast.info(res.data.data.msg, 2)\n                                                        }\n                                                    })\n                                                }\n                                            })\n                                        }, 1000)\n                                    } else {\n                                        alert('支付失败')\n                                    }\n                                }\n                            )\n                        }\n\n                        if (typeof WeixinJSBridge == \"undefined\") {\n                            if (document.addEventListener) {\n                                document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false)\n                            } else if (document.attachEvent) {\n                                document.attachEvent('WeixinJSBridgeReady', onBridgeReady)\n                                document.attachEvent('onWeixinJSBridgeReady', onBridgeReady)\n                            }\n                        } else {\n                            onBridgeReady()\n                        }\n                    } else {\n                        Toast.info(res.data.msg, 2)\n                    }\n                })\n            }\n        }\n    }\n\n    // 支付完成之后获取状态\n    payCallback = () => {\n        const _this = this;\n        if (!getParam('oid')) {\n            return;\n        } else {\n            _this.intervalPayStatus = setInterval(function () {\n                http.get(`${API['base-api']}/m/orderState/oid/${getParam('oid')}`).then(res => {\n                    if (res.data.errno === 401) {\n                        clearInterval(_this.intervalPayStatus);\n                        _this.intervalPayStatus = null;\n                        // 获取课程类型\n                        http.get(`${API['base-api']}/class_order_status/${getParam('oid')}`).then((res) => {\n                            if (Number(res.data.data.errno) === 200) {\n                                // 正常购买单集成功\n                                this.setState({\n                                    status: 6,\n                                    showSingleBox: true,\n                                })\n                            } else if (Number(res.data.data.errno) === 201) {\n                                // 0元参团\n                                this.setState({\n                                    status: 4,\n                                    showSingleBox: true,\n                                })\n                            } else if (Number(res.data.data.errno) === 202) {\n                                // 0元购\n                                this.setState({\n                                    status: 3,\n                                    showSingleBox: true,\n                                })\n                            } else if (Number(res.data.data.errno) === 203) {\n                                // 三天内特价\n                                this.setState({\n                                    nowPrice: res.data.data.data.now_price,\n                                    laterPrice: res.data.data.data.three_day_later_price,\n                                    status: 2,\n                                    showSingleBox: true,\n                                })\n                            } else {\n                                Toast.info(res.data.data.msg, 2)\n                            }\n                        })\n                    }\n                })\n            }, 1000)\n        }\n\n    }\n\n\n    // 特价购买全集\n    toBuyAll = () => {\n\n    }\n    // 0元购买全集\n    zerobuyReceive = () => {\n        Toast.success('购买全集成功', 3)\n        this.colse()\n    }\n    // 0元参团\n    zerogroupBuy = () => {\n        this.getOrderId()\n    }\n\n    // 获取订单号-0元参团\n    getOrderId = () => {\n        let data = {\n            course_id: getParam('id')\n        }\n        http.post(`${API['base-api']}/pdd/sys`, data).then((res) => {\n            if (res.data.errno === 0) {\n                this.setState({\n                    groupOrderId: res.data.data.order_id\n                })\n                this.getOrderStatus(res.data.data.order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 获取订单状态-0元参团\n    getOrderStatus = (id) => {\n        http.get(`${API.home}/m/pdd/order_status/${id}`).then((res) => {\n            if (res.data.code === 200) {\n                this.getTime(res.data.data.pdd_order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n    // 获取倒计时-0元参团\n    getTime = (id) => {\n        http.get(`${API.home}/m/pdd_order_end_time/${id}`).then((res) => {\n            if (res.data.code === 200) {\n                this.setState({\n                    endTime: res.data.data.end_time,\n                    status: 7\n                })\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 邀请好友参团\n    toGroup = () => {\n        this.props.history.push(`/togroup?id=${this.state.groupOrderId}`)\n    }\n\n    // 关闭弹窗\n    colse = () => {\n        this.props.boxHide(false);\n        this.setState({\n            status: 1\n        })\n    }\n\n    render() {\n        const {showSingleBox} = this.state;\n        if (this.state.endTime) {\n            let date = this.state.endTime * 1000\n            let now = Date.now()\n            setInterval(() => {\n                date -= 1000\n                let s = differenceInSeconds(new Date(date), now) % 60,\n                    m = differenceInMinutes(new Date(date), now) % 60,\n                    h = differenceInHours(new Date(date), now) % 24\n                this.setState({\n                    hour: h,\n                    min: m,\n                    sec: s,\n                })\n            }, 1000)\n        }\n        const {singleType} = this.props;\n        return (\n            singleType === 1 &&\n            <div>\n                <div className='popup-box'>\n                    <div className='content singleset-payment'>\n                        <div className='price-box'>\n                            <span>实付款:</span>\n                            <p>{this.props.data.class_price}元</p>\n                        </div>\n                        <div className='course-info'>\n                            <p className='text-overflow-1'><span>课程:</span>\n                                {this.props.title}\n                            </p>\n                            <p className='text-overflow-1'><span>课时:</span>\n                                {this.props.data.name}\n                            </p>\n                        </div>\n                        <div className='payment-type'>\n                            <label>支付方式:</label>\n                            <p onClick={this.check.bind(this, '0')}>\n                                <i className='iconfont iconweixinzhifu buy'></i>\n                                <span>微信支付</span>\n                                <i className={`iconfont icondanseshixintubiao-5 redio ${this.state.payType === '0' ? 'redioed' : ''}`}></i>\n                            </p>\n                            {\n                                !browser.isWeixin &&\n                                <p onClick={this.check.bind(this, '1')}>\n                                    <i className='iconfont iconalipay'></i>\n                                    <span>支付宝</span>\n                                    <i className={`iconfont icondanseshixintubiao-5 redio ${this.state.payType === '1' ? 'redioed' : ''}`}></i>\n                                </p>\n                            }\n\n                        </div>\n                        <div className='btn btn-18B4ED' onClick={this.toBuy}>确认购买</div>\n                    </div>\n                    <i onClick={this.colse} className={'iconfont iconiconfront-2 close'}></i>\n                </div>\n\n            </div>\n\n        );\n    }\n\n}\n\nexport default compose(\n    connect(\n        state => ({user: state.user}),\n        null\n    ),\n    withRouter\n)(Single)\n","import React, { Component } from 'react'\nimport './index.scss'\nimport { getParam, http, browser } from \"@/utils\";\nimport { Toast } from 'antd-mobile';\nimport { Link, withRouter } from \"react-router-dom\";\nimport { compose } from \"redux\";\nimport { connect } from \"react-redux\";\nimport { differenceInHours, differenceInMinutes, differenceInSeconds } from \"date-fns\";\n\n\nclass Single extends Component {\n    constructor(props) {\n        super(props)\n        this.state = {\n            // status: 1,\n            orderId: '',\n            nowPrice: '',\n            laterPrice: '',\n            hour: '',\n            min: '',\n            sec: '',\n            endTime: '',\n            groupOrderId: '',\n            payType: '0',  // 1支付宝 0微信\n            // singleBox: false,\n        }\n    }\n\n    componentDidMount() {\n\n    }\n\n    componentWillReceiveProps(nextProps, nextContext) {\n        // console.log(nextProps);\n        // this.setState({\n        //     singleBox: nextProps.singleBox\n        // })\n    }\n\n    // 选择支付方式\n    check = (type) => {\n        this.setState({\n            payType: type\n        })\n    }\n\n    // 确定购买\n    toBuy = () => {\n        const videoID = this.props.data.video_id || this.props.data.id;\n        http.get(`${API.home}/sys/createClassOrder/${videoID}`).then((res) => {\n            if (res.data.code === 200) {\n                this.setState({\n                    orderId: res.data.data.order_id\n                })\n                this.state.payType === '1' ? this.alipayPay(res.data.data.order_id) : this.weixinPay(res.data.data.order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n    // 微信支付\n    weixinPay = (orderId) => {\n        // 微信内部-支付\n        if (browser.isWeixin) {\n            window.location.href = \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=\" + encodeURIComponent(window.location.href + \"&aa=bb&oid=\" + orderId).toLowerCase() + \"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect\";\n        } else {\n            // 微信外部-支付\n            http.get(`${API['base-api']}/pay/wxpay/wap_charge/oid/${orderId}`).then((res) => {\n                if (res.data.errno === 0) {\n                    window.location.href = res.data.data.url + \"&redirect_url=\" + encodeURIComponent(window.location.href + \"&weixinpay=1&oid=\" + orderId).toLowerCase();\n                } else {\n                    Toast.info(res.data.msg, 2)\n                }\n            })\n        }\n    }\n    // 支付宝支付\n    alipayPay = (orderId) => {\n        const courseId = getParam('id');\n        http.get(`${API['base-api']}/pay/alipay/wap_charge_new/oid/${orderId}`).then((res) => {\n            if (res.data.errno === 0) {\n                window.location = res.data.data.url;\n                courseId && window.localStorage.setItem('payCourse', courseId);\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 特价购买全集\n    toBuyAll = (vcourseId) => {\n        if(Number(this.props.isPdd) === 1) {\n            this.props.history.push(`/order?id=${this.props.courseId}`, {group: 1})\n        }else{\n            let cidArr = JSON.stringify([Number(vcourseId)]);\n            http.get(`${API['base-api']}/m/cart/addtopreorder/${cidArr}`).then((res) => {\n                if (res.data.errno === 0) {\n                    this.props.history.push(\"/order?id=\" + res.data.data[0], {simple: 1});\n                } else {\n                    Toast.info(res.data.msg, 2);\n                }\n            })\n        }\n    }\n    // 0元购买全集\n    zerobuyReceive = () => {\n        Toast.success('购买全集成功', 3)\n        this.colse()\n    }\n    // 0元参团\n    zerogroupBuy = () => {\n        this.getOrderId()\n    }\n\n    // 获取订单号-0元参团\n    getOrderId = () => {\n        let data = {\n            course_id: getParam('id')\n        }\n        http.post(`${API['base-api']}/pdd/sys`, data).then((res) => {\n            if (res.data.errno === 0) {\n                this.setState({\n                    groupOrderId: res.data.data.order_id\n                })\n                this.getOrderStatus(res.data.data.order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 获取订单状态-0元参团\n    getOrderStatus = (id) => {\n        http.get(`${API.home}/m/pdd/order_status/${id}`).then((res) => {\n            if (res.data.code === 200) {\n                this.getTime(res.data.data.pdd_order_id)\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n    // 获取倒计时-0元参团\n    getTime = (id) => {\n        http.get(`${API.home}/m/pdd_order_end_time/${id}`).then((res) => {\n            if (res.data.code === 200) {\n                this.setState({\n                    endTime: res.data.data.end_time,\n                    status: 7\n                })\n            } else {\n                Toast.info(res.data.msg, 2)\n            }\n        })\n    }\n\n    // 邀请好友参团\n    toGroup = () => {\n        this.props.history.push(`/togroup?id=${this.state.groupOrderId}`)\n    }\n\n    toLearn = (vcourseId, videoID) => {\n        this.props.boxHide(false);\n        this.props.history.push(`/play/video?id=${vcourseId}&video_id=${videoID}`);\n    }\n\n\n    // 关闭弹窗\n    colse = () => {\n        this.props.boxHide(false);\n        this.setState({\n            status: 1\n        })\n    }\n\n    render() {\n        let {singleBox} = this.state;\n        if (this.state.endTime) {\n            let date = this.state.endTime * 1000\n            let now = Date.now()\n            setInterval(() => {\n                date -= 1000\n                let s = differenceInSeconds(new Date(date), now) % 60,\n                    m = differenceInMinutes(new Date(date), now) % 60,\n                    h = differenceInHours(new Date(date), now) % 24\n                this.setState({\n                    hour: h,\n                    min: m,\n                    sec: s,\n                })\n            }, 1000)\n        }\n        const { singleType } = this.props;\n        // console.log(this.props);\n        const videoID = this.props.data.video_id || this.props.data.id;\n        return (\n          <div className='popup-box'>\n          {\n              singleType === 2 &&\n              <div className='content payment-success'>\n                  <div className=\"header\">\n                      <i className='iconfont icondanseshixintubiao-5'></i>\n                      <span>购买成功</span>\n                  </div>\n                  <div className=\"dec\">· 3天内购买全集,可直接抵扣该集费用,{this.props.nowPrice}元购买。</div>\n                  <div className=\"dec\">· 超过3天,按照未购集数/全部集数等比例计费,{this.props.laterPrice}元购买全集。</div>\n                  <span onClick={()=>this.toLearn(this.props.vcourseId,videoID)} className='btn btn-18B4ED'>开始学习</span>\n                  <div className='btn btn-FF4000' onClick={()=>{this.toBuyAll(this.props.courseId)}}>¥{this.props.nowPrice}购买全集\n                  </div>\n              </div>\n          }\n          {\n              singleType === 3 &&\n              <div className='content zero'>\n                  <div className=\"header\">\n                      <i className='iconfont icondanseshixintubiao-5'></i>\n                      <span>购买成功</span>\n                  </div>\n                  <div className=\"dec\">· 恭喜您获得0元拼团购买剩余课时的机会。</div>\n                  <div className='btn btn-FF4000' onClick={this.zerogroupBuy}>0元参团</div>\n              </div>\n          }\n          {\n              singleType === 4 &&\n              <div className='content zero'>\n                  <div className=\"header\">\n                      <i className='iconfont icondanseshixintubiao-5'></i>\n                      <span>购买成功</span>\n                  </div>\n                  <div className=\"dec\">· 恭喜您获得0元购买剩余课时的机会。</div>\n                  <div className='btn btn-FF4000' onClick={this.zerobuyReceive}>0元购</div>\n              </div>\n          }\n          {\n              singleType === 6 &&\n              <div className='content zero'>\n                  <div className=\"header\">\n                      <i className='iconfont icondanseshixintubiao-5'></i>\n                      <span>购买成功</span>\n                  </div>\n                  {/*<Link to={`/play/video?id=${this.props.vcourseId}&video_id=${videoID}`} className='btn btn-18B4ED'>去学习</Link>*/}\n                  <span onClick={()=>this.toLearn(this.props.vcourseId,videoID)} className='btn btn-18B4ED'>去学习</span>\n              </div>\n          }\n          {\n              singleType === 7 &&\n              <div className='content group'>\n                  <div className=\"header\">\n                      <i className='iconfont icondanseshixintubiao-5'></i>\n                      <span>参团成功</span>\n                  </div>\n                  <div className='group-img'>\n                      <img src={this.props.user.data.avatar} alt=\"\"/>\n                      <img\n                          src=\"https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/images/weekend/train7/ellipsis.png\"\n                          alt=\"\"/>\n                      <img\n                          src=\"https://julyedu-cdn.oss-cn-beijing.aliyuncs.com/images/weekend/train7/ellipsis.png\"\n                          alt=\"\"/>\n\n                  </div>\n                  <div className='btn-l btn-FF4000' onClick={this.toGroup}>\n                      剩余{String(this.state.hour).padStart(2, 0)}:{String(this.state.min).padStart(2, 0)}:{String(this.state.sec).padStart(2, 0)}\n                      邀请好友参团\n                  </div>\n              </div>\n          }\n          <i onClick={this.colse} className={'iconfont iconiconfront-2 close'}></i>\n      </div>\n\n        );\n    }\n\n}\n\nexport default compose(\n    connect(\n        state => ({user: state.user}),\n        null\n    ),\n    withRouter\n)(Single)\n"],"sourceRoot":""}