video.875f11e7.chunk.js.map 106 KB
Newer Older
xuzhenghua 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","isAist","practice","qid","react_router_dom","to","pathname","is_tested","search","from","window","location","title","href","practice_common","commonItem","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","url","closeShareModal","Video","previousPlaybackRate","currentPlaybackRate","reconnect","isCurrentVideoFirstPlay","RECENTLEARN","videoList","currentVideoSrc","isAuth","course","salePrice","isLoading","isShowShareModal","shareData","singleBox","singMess","singleType","nowPrice","laterPrice","limitFreeNoPromptChecked","showLimitFreePopup","limitFreePopup","isShowNeverShowPopupOption","limitFreePopupVideos","JSON","parse","localStorage","getItem","tobuy","_this2$state$course","errno","simple","toSingleset","setItem","stringify","boxHide","val","payCallback","assertThisInitialized","getParam","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","setupWS","ws","WebSocket","setTimeout","timer","e","position","currentTime","sendMessage","message","readyState","send","close","clearTimeout","PROCESS_URL","getShareProgressInfo","courseID","countSchedule","_this2$state","_this2$state$course2","ctype","is_aist","mtype","uid","user","token","platform","video_id","v_course_id","sendWatchTime","sec","rate","_this2$state2","_this2$state2$course","time","parseInt","setupTimer","count","watchSec","paused","initializePlayer","HELP_IMPROVE_VIDEOJS","video","controls","preload","bigPlayButton","textTrackDisplay","posterImage","errorDisplay","playbackRates","controlBar","pictureInPictureToggle","addChild","_this2$state3","is_live","playbackRate","is_free","sendLastRecord","post","hasAuth","setPlayerSrc","playVideo","getCoursePrice","getLastVideoIndex","lastIndex","findIndex","getVideoList","_res$data","_res$data$data","playSetup","getLimitFreePopup","_this2$state$course3","scheduleTime","last_video_id","lessonAvailable","Promise","resolve","playWithAuth","text","onPress","src","ready","_this2$state$course4","_this2$state4","_res$data2","_this2$state5","includes","checkNeverShowLimitFreePopup","_res$data3","objectSpread","protocol","_this$props$location$","browser","isWeixin","jsCookie","getDatumCatalog","replace","slice","dispose","recordTimer","recordSocket","_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","pop_descbition","wechat_img","alt","htmlFor","onChange","target","checked","_this4$state","toConsumableArray","VList","react__WEBPACK_IMPORTED_MODULE_0___default","status","tab","Single","_Users_xzh_dnmp_www_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_classCallCheck__WEBPACK_IMPORTED_MODULE_2__","_Users_xzh_dnmp_www_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__","_Users_xzh_dnmp_www_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_xzh_dnmp_www_mr_julyedu_node_modules_babel_preset_react_app_node_modules_babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_7__","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.875f11e7.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                                        this.props.isAist ? (\n                                            item.video_auth ? (\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.practice.is_tested ? 'iconiconfront-3' : '')}/>\n                                                    </div>\n                                                </Link>\n                                                : null\n                                            ) : (\n                                                <a href=\"javascript:void(0)\">\n                                                    <div className=\"exercise\">\n                                                        课后练习:{item.practice.title}\n                                                        <i className={classnames('iconfont','iconiconfront-74')}/>\n                                                    </div>\n                                                </a>\n                                            )\n                                        ) : (\n                                            item.practice_common.map((commonItem, index) => {\n                                                return (\n                                                    item.video_auth ? (\n                                                        <Link to={{\n                                                            pathname: commonItem.is_tested ? '/campResolve' : '/campTest',\n                                                            search: `?keshi_id=${item.id}&qid=${commonItem.qid}`,\n                                                            state: {from: `/play/video${window.location.search}`}\n                                                        }} key={index}>\n                                                            <div className=\"exercise\">\n                                                                课后练习:{commonItem.title}\n                                                                <i className={classnames('iconfont',commonItem.is_tested ? 'iconiconfront-3' : '')}/>\n                                                            </div>\n                                                        </Link>\n                                                    ) : (\n                                                        <a href=\"javascript:void(0)\">\n                                                            <div className=\"exercise\">\n                                                                课后练习:{commonItem.title}\n                                                                <i className={classnames('iconfont','iconiconfront-74')}/>\n                                                            </div>\n                                                        </a>\n                                                    )\n                                                )\n                                            })\n                                        )\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 } 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 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  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    limitFreeNoPromptChecked: false,//是否勾选\"不再显示此弹框\"选项\n    showLimitFreePopup: false,\n    limitFreePopup: {},\n    isShowNeverShowPopupOption: false, //限时免费课程 播放结束后是否显示\"不再显示此弹框\"选项\n    limitFreePopupVideos: JSON.parse(localStorage.getItem('limit-free-popup-videos'))\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  }\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    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  // 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        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      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    //     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    //     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('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      if (this.state.limitFreePopup.is_free) {\n        this.setState({\n          showLimitFreePopup: true\n        })\n      }\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    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          data.course.course_id && this.getLimitFreePopup(data.course.course_id)\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    // }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  getLimitFreePopup = id => {\n    http.post(`${API.home}/sys/popup`, {\n      course_id: id\n    })\n      .then(res => {\n        const {code, msg, data} = res.data\n        if (code === 200) {\n\n          const {courseId, limitFreePopupVideos} = this.state\n          this.setState({\n            limitFreePopup: data,\n            isShowNeverShowPopupOption: limitFreePopupVideos ?  limitFreePopupVideos.includes(courseId) : false\n          })\n\n        } else {\n          Toast.info(msg, 2, null, false)\n        }\n      })\n  }\n  checkNeverShowLimitFreePopup = () => {\n    if (!this.state.limitFreeNoPromptChecked) {\n      return\n    }\n    http.post(`${API.home}/sys/checklist`, {\n      course_id: this.state.course.course_id\n    })\n      .then(res => {\n        const {code, msg} = res.data\n        if (code === 200) {\n          this.setState({\n            limitFreePopup: {...this.state.limitFreePopup, is_free: 0}\n          })\n\n        } else {\n          Toast.info(msg, 2, null, false)\n\n        }\n      })\n  }\n\n  render() {\n    let {match, location, history} = this.props\n    const {\n      videoList,\n      activeIndex,\n      isAuth,\n      salePrice,\n      course,\n      singleBox,\n      singleType,\n      showLimitFreePopup,\n      limitFreePopup,\n      isShowNeverShowPopupOption\n    } = 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                  isAist={course.is_aist}\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          showLimitFreePopup &&\n          <div className={'limit-free-cover'}>\n            <div className=\"free-popup\">\n              <div className=\"title\">\n                <span>{limitFreePopup.pop_descbition}</span>\n              </div>\n              <div className={'des'}>\n                <img className=\"qrcode\"\n                     src={limitFreePopup.wechat_img} alt=''/>\n                <span>长按/扫码识别</span>\n                <span>添加时请备注<span>{course.course_id}</span>哦</span>\n                <div className=\"no-prompt\">\n                  {\n                    isShowNeverShowPopupOption &&\n                    <label htmlFor=\"no-prompt\">\n                      <span\n                        className={`checkbox-label ${this.state.limitFreeNoPromptChecked ? 'checked' : 'unchecked'}`}>\n                        <i className={'iconfont iconiconfront-73'}/>\n                      </span>\n                      <input type=\"checkbox\" id={'no-prompt'} onChange={(e) => {\n                        this.setState({\n                          limitFreeNoPromptChecked: e.target.checked\n                        })\n                      }}/>\n                      <span>本课程不再提示</span>\n                    </label>\n                  }\n                </div>\n              </div>\n              <i className={'close-btn iconfont iconiconfront-2'} onClick={() => {\n                this.setState({\n                  showLimitFreePopup: false,\n                  isShowNeverShowPopupOption: true\n                })\n                const {courseId, limitFreePopupVideos} = this.state\n                localStorage.setItem('limit-free-popup-videos', JSON.stringify(\n                  limitFreePopupVideos ? [...limitFreePopupVideos, courseId] : [courseId]\n                ))\n                this.checkNeverShowLimitFreePopup()\n              }}/>\n            </div>\n          </div>\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, props.item)}>\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;\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            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":""}