{"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","item","className","price1","price0","Recommendation","connect","state","num","list","courseId","getRecommendation","http","get","API","home","props","vCourseId","then","res","data","code","setState","Array","isArray","info","msg","toCourseDetail","id","history","push","this","length","map","Info","course_title","simpledescription","key","course_id","img","image_name","handleClick","PureComponent","VideoCatalog","i","selectVideo","videoCatalog","index","classnames","active","activeIndex","onClick","bind","name","video_auth","isAist","practice","qid","to","pathname","is_tested","search","from","window","location","title","href","practice_common","commonItem","Component","DatumCatalog","datum","Panel","header","dir_name","files","file_id","file_name","defaultProps","videojs","getComponent","Button","CustomPlayButtonCover","el_","CustomPlayButton","player","options","on","tap","type","player_","play","off","registerComponent","prototype","options_","children","alert","ProgressShareModal","isShow","learn_day_count","parseFloat","action_power","style","display","url","closeShareModal","Video","previousPlaybackRate","currentPlaybackRate","reconnect","isCurrentVideoFirstPlay","RECENTLEARN","videoList","isAuth","course","salePrice","isLoading","isShowShareModal","shareData","singleBox","singMess","singleType","nowPrice","laterPrice","limitFreeNoPromptChecked","showLimitFreePopup","limitFreePopup","isShowNeverShowPopupOption","limitFreePopupVideos","JSON","parse","localStorage","getItem","currentVideoExpireTime","tobuy","errno","simple","toSingleset","setItem","stringify","boxHide","val","payCallback","_this","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","getShareProgressInfo","courseID","countSchedule","ctype","is_aist","mtype","uid","user","token","platform","video_id","v_course_id","sendWatchTime","sec","rate","time","parseInt","setupTimer","count","watchSec","paused","initializePlayer","HELP_IMPROVE_VIDEOJS","video","controls","preload","bigPlayButton","textTrackDisplay","posterImage","errorDisplay","playbackRates","controlBar","pictureInPictureToggle","addChild","is_live","videoTime","sessionStorage","playbackRate","removeItem","is_free","handleVideoAuthError","sendLastRecord","post","interval","currentVideoTimer","Date","getTime","getVideoSrc","lesson","URL","searchParams","has","setPlayerSrc","hasAuth","playVideo","getCoursePrice","getLastVideoIndex","lastIndex","findIndex","getVideoList","playSetup","getLimitFreePopup","scheduleTime","last_video_id","lessonAvailable","Promise","resolve","playWithAuth","text","onPress","src","ready","includes","checkNeverShowLimitFreePopup","protocol","browser","isWeixin","jsCookie","getDatumCatalog","replace","slice","dispose","recordTimer","recordSocket","match","toHref","HeaderBar","arrow","go","ref","el","webkit-playsinline","playsInline","x-webkit-airplay","x5-video-player-type","activeClassName","vcourseId","videoId","course_tile","exact","path","render","pop_descbition","wechat_img","alt","htmlFor","onChange","target","checked","VList","status","tab","Single","payType","toBuy","videoID","orderId","order_id","alipayPay","weixinPay","encodeURIComponent","toLowerCase","showSingleBox","toBuyAll","zerobuyReceive","success","colse","zerogroupBuy","getOrderId","groupOrderId","getOrderStatus","pdd_order_id","endTime","end_time","toGroup","hour","min","nextProps","nextContext","date","now","s","differenceInSeconds","m","differenceInMinutes","h","differenceInHours","class_price","compose","withRouter","isPdd","group","cidArr","toLearn","avatar","String","padStart"],"mappings":"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","file":"mrstaticjs/video.b2a4c5e0.chunk.js","sourcesContent":["import React, { PureComponent } from \"react\"\nimport { connect } from \"react-redux\"\nimport \"./recommendation.scss\"\nimport { http } from \"src/utils\"\nimport { Toast } from \"antd-mobile\"\nimport VList from \"src/common/v-list-base\"\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\n      .get(\n        `${API.home}/m/play/recommend_course/${this.props.vCourseId}?num=${this.state.num}`\n      )\n      .then((res) => {\n        const data = res.data\n        if (data.code === 200) {\n          this.setState({\n            list: Array.isArray(data.data) ? data.data : [],\n          })\n        } else {\n          Toast.info(data.msg)\n        }\n      })\n  }\n\n  toCourseDetail = (id) => {\n    const { history } = this.props\n    history.push(`/detail?id=${id}`)\n  }\n\n  render() {\n    return this.state.list.length ? (\n      <div className=\"recommendation\">\n        <div className={\"title\"}>相关推荐</div>\n        <ul>\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 item={item} />\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        </ul>\n      </div>\n    ) : null\n  }\n}\n\nexport default Recommendation\n","/* eslint-disable jsx-a11y/anchor-is-valid, no-script-url */\nimport React, { Component } from \"react\"\nimport \"./video-catalog.scss\"\nimport { Link } from \"react-router-dom\"\nimport classnames from \"classnames\"\n\nclass VideoCatalog extends Component {\n  handleClick = (i) => {\n    this.props.selectVideo(i)\n  }\n\n  render() {\n    return (\n      <div className=\"video-catalog\">\n        <ul>\n          {this.props.videoCatalog.map((item, index) => {\n            return (\n              <li\n                key={item.id}\n                className={classnames({\n                  active: this.props.activeIndex === index,\n                })}\n              >\n                <div\n                  className=\"video-title\"\n                  onClick={this.handleClick.bind(this, index)}\n                >\n                  <span className=\"title text-overflow-2\">{item.name}</span>\n                  {/*<span className='duration'>{item.duration}</span>*/}\n                  <i\n                    className={classnames(`iconfont`, [\n                      item.video_auth === 0\n                        ? \"iconRectangleCopy1\"\n                        : this.props.activeIndex === index\n                        ? \"iconcelluar\"\n                        : \"icontimeout\",\n                    ])}\n                  />\n                </div>\n                {this.props.isAist ? (\n                  item.video_auth ? (\n                    item.practice && item.practice.qid ? (\n                      <Link\n                        to={{\n                          pathname: item.practice.is_tested\n                            ? \"/campResolve\"\n                            : \"/campTest\",\n                          search: `?keshi_id=${item.id}&qid=${item.practice.qid}`,\n                          state: {\n                            from: `/play/video${window.location.search}`,\n                          },\n                        }}\n                      >\n                        <div className=\"exercise\">\n                          <span className={\"text-overflow-one\"}>\n                            课后练习:{item.practice.title}\n                          </span>\n                          <i\n                            className={classnames(\n                              \"iconfont\",\n                              item.practice.is_tested ? \"iconRectangleCopy\" : \"\"\n                            )}\n                          />\n                        </div>\n                      </Link>\n                    ) : null\n                  ) : (\n                    <a href=\"javascript:void(0)\">\n                      <div className=\"exercise\">\n                        <span className={\"text-overflow-one\"}>\n                          课后练习:{item.practice.title}\n                        </span>\n                        <i\n                          className={classnames(\n                            \"iconfont\",\n                            \"iconRectangleCopy1\"\n                          )}\n                        />\n                      </div>\n                    </a>\n                  )\n                ) : (\n                  item.practice_common.map((commonItem, index) => {\n                    return item.video_auth ? (\n                      <Link\n                        to={{\n                          pathname: commonItem.is_tested\n                            ? \"/campResolve\"\n                            : \"/campTest\",\n                          search: `?keshi_id=${item.id}&qid=${commonItem.qid}`,\n                          state: {\n                            from: `/play/video${window.location.search}`,\n                          },\n                        }}\n                        key={index}\n                      >\n                        <div className=\"exercise\">\n                          <span className={\"text-overflow-one\"}>\n                            课后练习:{commonItem.title}\n                          </span>\n                          <i\n                            className={classnames(\n                              \"iconfont\",\n                              commonItem.is_tested ? \"iconRectangleCopy\" : \"\"\n                            )}\n                          />\n                        </div>\n                      </Link>\n                    ) : (\n                      <a href=\"javascript:void(0)\">\n                        <div className=\"exercise\">\n                          <span className={\"text-overflow-one\"}>\n                            课后练习:{commonItem.title}\n                          </span>\n                          <i\n                            className={classnames(\n                              \"iconfont\",\n                              \"iconRectangleCopy1\"\n                            )}\n                          />\n                        </div>\n                      </a>\n                    )\n                  })\n                )}\n              </li>\n            )\n          })}\n        </ul>\n      </div>\n    )\n  }\n}\n\nexport default VideoCatalog\n","import React, { Component } from \"react\"\nimport \"./datum-catalog.scss\"\nimport { Accordion } from \"antd-mobile\"\n\nclass DatumCatalog extends Component {\n  static defaultProps = {\n    datum: [\n      {\n        dir_name: \"\",\n        files: [\n          {\n            file_name: \"\",\n            file_id: 0,\n          },\n        ],\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          {datum &&\n            datum.length &&\n            datum.map((item, index) => {\n              return (\n                <Accordion.Panel header={item.dir_name} key={index}>\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                </Accordion.Panel>\n              )\n            })}\n        </Accordion>\n      </div>\n    )\n  }\n}\n\nexport default DatumCatalog\n","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(\n      \"button\",\n      {\n        className: \"vjs-custom-play-button\",\n      },\n      {\n        type: \"button\",\n      }\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\nComponent.registerComponent(\"CustomPlayButton\", CustomPlayButton)\n\nCustomPlayButtonCover.prototype.options_ = {\n  children: [\"CustomPlayButton\"],\n}\n\nComponent.registerComponent(\"CustomPlayButtonCover\", CustomPlayButtonCover)\n","import React, { Component } from \"react\"\nimport HeaderBar from \"src/common/HeaderBar\"\nimport \"./video.scss\"\nimport { NavLink, Route, Redirect, Switch } from \"react-router-dom\"\nimport { http, getParam, browser } from \"src/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 \"src/common\"\nimport { connect } from \"react-redux\"\nimport jsCookie from \"js-cookie\"\nimport Single from \"src/components/detail/single\"\nimport SingleSuccess from \"../detail/single/singleSuccess\"\nimport \"./CustomPlayButton\"\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\">\n                <span className=\"num\">{props.data.learn_day_count}</span>天\n              </div>\n            </li>\n            <li>\n              <div className=\"title\">行动力超过</div>\n              <div className=\"number\">\n                <span className=\"num\">\n                  {parseFloat(props.data.action_power)}\n                </span>\n                %\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\">\n                    <i className=\"iconfont iconweixinzhifu\" />\n                  </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\">\n                    <i className=\"iconfont iconpengyouquaniconx\" />\n                  </div>\n                  <div className=\"text\">朋友圈</div>\n                </a>\n              </li>\n            </ul>\n          </div>\n          <i\n            className=\"iconfont iconiconfront-2 close\"\n            onClick={props.closeShareModal}\n          />\n        </div>\n      </div>\n    )\n  )\n}\n\nclass Video extends Component {\n  video //video element\n  player //video player instance\n  currentVideoTimer\n  currentVideoExpireTime\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  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    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(\n      localStorage.getItem(\"limit-free-popup-videos\")\n    ),\n    currentVideoExpireTime: \"\",\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 {\n      location: { state = {} },\n    } = 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\n      .get(`${API[\"base-api\"]}/m/cart/addtopreorder/[${course.course_id}]`)\n      .then((res) => {\n        if (res.data.errno === 0) {\n          this.props.history.push(`/order?id=${course.course_id}`, {\n            simple: 1,\n          })\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\n          .get(`${API[\"base-api\"]}/m/orderState/oid/${getParam(\"oid\")}`)\n          .then((res) => {\n            if (res.data.errno === 401) {\n              clearInterval(_this.intervalPayStatus)\n              _this.intervalPayStatus = null\n              // 获取课程类型\n              http\n                .get(`${API[\"base-api\"]}/class_order_status/${getParam(\"oid\")}`)\n                .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\n          .get(\n            `${API[\"base-api\"]}/pay/wxpay/pub_charge/oid/${getParam(\n              \"oid\"\n            )}/code/${weixin_code}`\n          )\n          .then((res) => {\n            if (res.data.errno === 0) {\n              const data = res.data.data\n\n              function onBridgeReady() {\n                WeixinJSBridge.invoke(\n                  \"getBrandWCPayRequest\",\n                  {\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\n                          .get(\n                            `${API[\"base-api\"]}/m/orderState/oid/${getParam(\n                              \"oid\"\n                            )}`\n                          )\n                          .then((res) => {\n                            if (res.data.errno === 401) {\n                              clearInterval(_this.intervalPayStatus)\n                              _this.intervalPayStatus = null\n                              // 获取课程类型\n                              http\n                                .get(\n                                  `${\n                                    API[\"base-api\"]\n                                  }/class_order_status/${getParam(\"oid\")}`\n                                )\n                                .then((res) => {\n                                  if (Number(res.data.data.errno) === 200) {\n                                    // 正常购买单集成功\n                                    _this.setState({\n                                      singleType: 6,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 201\n                                  ) {\n                                    // 0元参团\n                                    _this.setState({\n                                      singleType: 4,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 202\n                                  ) {\n                                    // 0元购\n                                    _this.setState({\n                                      singleType: 3,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 203\n                                  ) {\n                                    // 三天内特价\n                                    _this.setState({\n                                      nowPrice: res.data.data.data.now_price,\n                                      laterPrice:\n                                        res.data.data.data\n                                          .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(\n                    \"WeixinJSBridgeReady\",\n                    onBridgeReady,\n                    false\n                  )\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      } 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  // 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 && data.data && data.data.position) {\n        this.player.currentTime(data.data.position)\n      }\n    })\n  }\n\n  sendMessage = (message) => {\n    let readyState = this.ws.readyState,\n      _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(API[\"process-api\"])\n      }, 500)\n    }\n  }\n\n  //视频结束请求接口\n  getShareProgressInfo = () => {\n    http\n      .get(\n        `${API[\"base-api\"]}/m/aist/share_data/${this.courseID}/${\n          this.state.videoList[this.state.activeIndex][\"id\"]\n        }`\n      )\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  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  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 } = this.state\n      // 当视频播放时 看是否是第一次播放(初次进入页面 刷新页面 切换视频 都是第一次播放  需要获取上次的播放时间)\n      if (this.isCurrentVideoFirstPlay) {\n        // 当某些原因导致视频暂停时(用户暂停 网络不好等) 再播放时不需要发送\n        this.isCurrentVideoFirstPlay = false\n        // 发送消息 recent_learn\n        this.ws.send(\n          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      }\n      if (!this.timer) {\n        this.setupTimer()\n      }\n    })\n    this.player.on(\"durationchange\", () => {\n      let videoTime = window.sessionStorage.getItem(\"videoTimeBeforeReload\")\n      let rate = window.sessionStorage.getItem(\"videoRateBeforeReload\")\n      if (videoTime) {\n        this.player.currentTime(Number(videoTime))\n        rate && this.player.playbackRate(rate)\n        window.sessionStorage.removeItem(\"videoTimeBeforeReload\")\n        window.sessionStorage.removeItem(\"videoRateBeforeReload\")\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    this.player.on(\"error\", () => {\n      this.handleVideoAuthError(0)\n    })\n    this.player.on(\"waiting\", () => {\n      this.handleVideoAuthError(3000)\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  handleVideoAuthError = (interval) => {\n    clearTimeout(this.currentVideoTimer)\n    this.currentVideoTimer = setTimeout(() => {\n      if (this.currentVideoExpireTime < new Date().getTime()) {\n        window.sessionStorage.setItem(\n          \"videoTimeBeforeReload\",\n          this.player.currentTime()\n        )\n        window.sessionStorage.setItem(\n          \"videoRateBeforeReload\",\n          this.player.playbackRate()\n        )\n        this.getVideoSrc()\n      }\n    }, interval)\n  }\n\n  //请求签名视频地址\n  getVideoSrc = () => {\n    const { videoList, activeIndex } = this.state\n    let lesson = videoList[activeIndex]\n    http\n      .get(`${API.home}/web/check_video/${lesson.id}/${lesson.v_course_id}`)\n      .then((res) => {\n        const { data, code, msg } = res.data\n        let url = new URL(data.url).searchParams\n        if (code === 200) {\n          this.currentVideoExpireTime =\n            url.has(\"Expires\") && Number(url.get(\"Expires\")) * 1000\n          this.setPlayerSrc(data.url)\n        } else {\n          Toast.info(msg)\n        }\n      })\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        if (this.hasAuth(this.state.activeIndex)) {\n          this.getVideoSrc()\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(\n      (item) => Number(item.id) === Number(lastIndex)\n    )\n  }\n\n  getVideoList = () => {\n    let url = \"\"\n    if (getParam(\"video_id\")) {\n      url = `${API.home}/m/course/play/${\n        this.courseID + \"?video_id=\" + getParam(\"video_id\")\n      }`\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            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  playSetup = () => {\n    // is_aist,是否AI特训营\n    const { course = {} } = this.state\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    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            {\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    this.player.play()\n  }\n\n  playVideo = () => {\n    this.player.ready(() => {\n      this.player.play()\n    })\n  }\n\n  getDatumCatalog() {\n    http.get(`${API.home}/m/course/data/${this.courseID}`).then((res) => {\n      const data = res.data\n      if (data.code === 200) {\n        this.setState({\n          datum: data.data,\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}`).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 { activeIndex } = this.state\n    if (this.hasAuth(activeIndex)) {\n      this.getVideoSrc()\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  getLimitFreePopup = (id) => {\n    http\n      .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          const { courseId, limitFreePopupVideos } = this.state\n          this.setState({\n            limitFreePopup: data,\n            isShowNeverShowPopupOption: limitFreePopupVideos\n              ? limitFreePopupVideos.includes(courseId)\n              : false,\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\n      .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        } else {\n          Toast.info(msg, 2, null, false)\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\n          title={this.state.title}\n          arrow={true}\n          toHref={() => {\n            toHref\n              ? history.push(toHref, {\n                  to: \"classify\",\n                })\n              : history.go(-1)\n          }}\n        />\n        <Loading isLoading={this.state.isLoading}>\n          <div className=\"video\">\n            <video\n              className={\"video-js\"}\n              ref={(el) => (this.video = el)}\n              webkit-playsinline=\"true\"\n              playsInline={true}\n              x-webkit-airplay=\"allow\"\n              x5-video-player-type=\"h5\"\n            >\n              <source src={\"/\"} type=\"application/x-mpegURL\" />\n            </video>\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(\n                      this,\n                      videoList[activeIndex]\n                    )}\n                    className=\"purchase-episode\"\n                  >\n                    ¥{videoList.length && videoList[activeIndex][\"class_price\"]}{\" \"}\n                    购买单集\n                  </button>\n                </div>\n              </div>\n            )}\n            {!isAuth && !!course.is_aist && (\n              <div className=\"is-aist-box\">\n                <i className={\"iconfont iconiconfront-21\"}></i>\n                <p className={\"time\"}>\n                  {videoList[activeIndex][\"aist_start_time\"]}\n                </p>\n                <p className={\"time\"}>请耐心等待...</p>\n              </div>\n            )}\n          </div>\n          <div className=\"tab\">\n            <div>\n              <NavLink\n                to={{\n                  pathname: `${match.url}/video`,\n                  search: `?id=${this.courseID}`,\n                }}\n                replace\n                activeClassName=\"active\"\n              >\n                视频\n              </NavLink>\n            </div>\n            <div>\n              <NavLink\n                to={{\n                  pathname: `${match.url}/datum`,\n                  search: `?id=${this.courseID}`,\n                }}\n                replace\n                activeClassName=\"active\"\n              >\n                资料\n              </NavLink>\n            </div>\n          </div>\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        </Loading>\n        <Switch>\n          <Redirect\n            exact\n            from={\"/play\"}\n            to={{\n              pathname: \"/play/video\",\n              search: location.search,\n            }}\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\n            path={`${match.path}/datum`}\n            render={(props) => {\n              return <DatumCatalog {...props} datum={this.state.datum} />\n            }}\n          />\n        </Switch>\n        <Route\n          render={(props) => {\n            return this.state.vCourseId ? (\n              <Recommendation {...props} vCourseId={this.state.vCourseId} />\n            ) : null\n          }}\n        />\n        <ProgressShareModal\n          isShow={this.state.isShowShareModal}\n          closeShareModal={() => this.setState({ isShowShareModal: false })}\n          data={this.state.shareData}\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\n                  className=\"qrcode\"\n                  src={limitFreePopup.wechat_img}\n                  alt=\"\"\n                />\n                <span>长按/扫码识别</span>\n                <span>\n                  添加时请备注<span>{course.course_id}</span>哦\n                </span>\n                <div className=\"no-prompt\">\n                  {isShowNeverShowPopupOption && (\n                    <label htmlFor=\"no-prompt\">\n                      <span\n                        className={`checkbox-label ${\n                          this.state.limitFreeNoPromptChecked\n                            ? \"checked\"\n                            : \"unchecked\"\n                        }`}\n                      >\n                        <i className={\"iconfont iconiconfront-73\"} />\n                      </span>\n                      <input\n                        type=\"checkbox\"\n                        id={\"no-prompt\"}\n                        onChange={(e) => {\n                          this.setState({\n                            limitFreeNoPromptChecked: e.target.checked,\n                          })\n                        }}\n                      />\n                      <span>本课程不再提示</span>\n                    </label>\n                  )}\n                </div>\n              </div>\n              <i\n                className={\"close-btn iconfont iconiconfront-2\"}\n                onClick={() => {\n                  this.setState({\n                    showLimitFreePopup: false,\n                    isShowNeverShowPopupOption: true,\n                  })\n                  const { courseId, limitFreePopupVideos } = this.state\n                  localStorage.setItem(\n                    \"limit-free-popup-videos\",\n                    JSON.stringify(\n                      limitFreePopupVideos\n                        ? [...limitFreePopupVideos, courseId]\n                        : [courseId]\n                    )\n                  )\n                  this.checkNeverShowLimitFreePopup()\n                }}\n              />\n            </div>\n          </div>\n        )}\n      </div>\n    )\n  }\n}\n\nexport default connect((state) => ({ user: state.user }), null)(Video)\n","import React from \"react\"\nimport \"./index.scss\"\n\nconst VList = (props) => {\n  return (\n    <li\n      className=\"v-list-base-item\"\n      onClick={props.handleClick.bind(this, props.id, props.item)}\n    >\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 \"src/utils\"\nimport { Toast } from \"antd-mobile\"\nimport { withRouter } from \"react-router-dom\"\nimport { compose } from \"redux\"\nimport { connect } from \"react-redux\"\nimport {\n  differenceInHours,\n  differenceInMinutes,\n  differenceInSeconds,\n} from \"date-fns\"\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\"\n          ? this.alipayPay(res.data.data.order_id, courseId)\n          : 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 =\n        \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=\" +\n        encodeURIComponent(\n          window.location.href + \"&aa=bb&oid=\" + orderId\n        ).toLowerCase() +\n        \"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect\"\n    } else {\n      // 微信外部-支付\n      http\n        .get(`${API[\"base-api\"]}/pay/wxpay/wap_charge/oid/${orderId}`)\n        .then((res) => {\n          if (res.data.errno === 0) {\n            window.location.href =\n              res.data.data.url +\n              \"&redirect_url=\" +\n              encodeURIComponent(\n                window.location.href + \"&weixinpay=1&oid=\" + orderId\n              ).toLowerCase()\n          } else {\n            Toast.info(res.data.msg, 2)\n          }\n        })\n    }\n  }\n  // 支付宝支付\n  alipayPay = (orderId, courseId) => {\n    http\n      .get(`${API[\"base-api\"]}/pay/alipay/wap_charge_new/oid/${orderId}`)\n      .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\n          .get(\n            `${API[\"base-api\"]}/pay/wxpay/pub_charge/oid/${getParam(\n              \"oid\"\n            )}/code/${weixin_code}`\n          )\n          .then((res) => {\n            if (res.data.errno === 0) {\n              const data = res.data.data\n\n              function onBridgeReady() {\n                WeixinJSBridge.invoke(\n                  \"getBrandWCPayRequest\",\n                  {\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\n                          .get(\n                            `${API[\"base-api\"]}/m/orderState/oid/${getParam(\n                              \"oid\"\n                            )}`\n                          )\n                          .then((res) => {\n                            if (res.data.errno === 401) {\n                              clearInterval(_this.intervalPayStatus)\n                              _this.intervalPayStatus = null\n                              // 获取课程类型\n                              http\n                                .get(\n                                  `${\n                                    API[\"base-api\"]\n                                  }/class_order_status/${getParam(\"oid\")}`\n                                )\n                                .then((res) => {\n                                  if (Number(res.data.data.errno) === 200) {\n                                    // 正常购买单集成功\n                                    this.setState({\n                                      status: 6,\n                                      showSingleBox: true,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 201\n                                  ) {\n                                    // 0元参团\n                                    this.setState({\n                                      status: 4,\n                                      showSingleBox: true,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 202\n                                  ) {\n                                    // 0元购\n                                    this.setState({\n                                      status: 3,\n                                      showSingleBox: true,\n                                    })\n                                  } else if (\n                                    Number(res.data.data.errno) === 203\n                                  ) {\n                                    // 三天内特价\n                                    this.setState({\n                                      nowPrice: res.data.data.data.now_price,\n                                      laterPrice:\n                                        res.data.data.data\n                                          .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(\n                    \"WeixinJSBridgeReady\",\n                    onBridgeReady,\n                    false\n                  )\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\n          .get(`${API[\"base-api\"]}/m/orderState/oid/${getParam(\"oid\")}`)\n          .then((res) => {\n            if (res.data.errno === 401) {\n              clearInterval(_this.intervalPayStatus)\n              _this.intervalPayStatus = null\n              // 获取课程类型\n              http\n                .get(`${API[\"base-api\"]}/class_order_status/${getParam(\"oid\")}`)\n                .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  toBuyAll = () => {}\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    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\">\n                  <span>课程:</span>\n                  {this.props.title}\n                </p>\n                <p className=\"text-overflow-1\">\n                  <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\n                    className={`iconfont icondanseshixintubiao-5 redio ${\n                      this.state.payType === \"0\" ? \"redioed\" : \"\"\n                    }`}\n                  ></i>\n                </p>\n                {!browser.isWeixin && (\n                  <p onClick={this.check.bind(this, \"1\")}>\n                    <i className=\"iconfont iconalipay\"></i>\n                    <span>支付宝</span>\n                    <i\n                      className={`iconfont icondanseshixintubiao-5 redio ${\n                        this.state.payType === \"1\" ? \"redioed\" : \"\"\n                      }`}\n                    ></i>\n                  </p>\n                )}\n              </div>\n              <div className=\"btn btn-18B4ED\" onClick={this.toBuy}>\n                确认购买\n              </div>\n            </div>\n            <i\n              onClick={this.colse}\n              className={\"iconfont iconiconfront-2 close\"}\n            ></i>\n          </div>\n        </div>\n      )\n    )\n  }\n}\n\nexport default compose(\n  connect((state) => ({ user: state.user }), null),\n  withRouter\n)(Single)\n","import React, { Component } from \"react\"\nimport \"./index.scss\"\nimport { getParam, http, browser } from \"src/utils\"\nimport { Toast } from \"antd-mobile\"\nimport { withRouter } from \"react-router-dom\"\nimport { compose } from \"redux\"\nimport { connect } from \"react-redux\"\nimport {\n  differenceInHours,\n  differenceInMinutes,\n  differenceInSeconds,\n} from \"date-fns\"\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  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\"\n          ? this.alipayPay(res.data.data.order_id)\n          : 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 =\n        \"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx23dac6775ac82877&redirect_uri=\" +\n        encodeURIComponent(\n          window.location.href + \"&aa=bb&oid=\" + orderId\n        ).toLowerCase() +\n        \"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect\"\n    } else {\n      // 微信外部-支付\n      http\n        .get(`${API[\"base-api\"]}/pay/wxpay/wap_charge/oid/${orderId}`)\n        .then((res) => {\n          if (res.data.errno === 0) {\n            window.location.href =\n              res.data.data.url +\n              \"&redirect_url=\" +\n              encodeURIComponent(\n                window.location.href + \"&weixinpay=1&oid=\" + orderId\n              ).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\n      .get(`${API[\"base-api\"]}/pay/alipay/wap_charge_new/oid/${orderId}`)\n      .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\n        .get(`${API[\"base-api\"]}/m/cart/addtopreorder/${cidArr}`)\n        .then((res) => {\n          if (res.data.errno === 0) {\n            this.props.history.push(\"/order?id=\" + res.data.data[0], {\n              simple: 1,\n            })\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  colse = () => {\n    this.props.boxHide(false)\n    this.setState({\n      status: 1,\n    })\n  }\n\n  render() {\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        {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\">\n              · 3天内购买全集,可直接抵扣该集费用,{this.props.nowPrice}元购买。\n            </div>\n            <div className=\"dec\">\n              · 超过3天,按照未购集数/全部集数等比例计费,\n              {this.props.laterPrice}元购买全集。\n            </div>\n            <span\n              onClick={() => this.toLearn(this.props.vcourseId, videoID)}\n              className=\"btn btn-18B4ED\"\n            >\n              开始学习\n            </span>\n            <div\n              className=\"btn btn-FF4000\"\n              onClick={() => {\n                this.toBuyAll(this.props.courseId)\n              }}\n            >\n              ¥{this.props.nowPrice}购买全集\n            </div>\n          </div>\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}>\n              0元参团\n            </div>\n          </div>\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}>\n              0元购\n            </div>\n          </div>\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\n              onClick={() => this.toLearn(this.props.vcourseId, videoID)}\n              className=\"btn btn-18B4ED\"\n            >\n              去学习\n            </span>\n          </div>\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://cdn.julyedu.com/images/weekend/train7/ellipsis.png\"\n                alt=\"\"\n              />\n              <img\n                src=\"https://cdn.julyedu.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)}:\n              {String(this.state.min).padStart(2, 0)}:\n              {String(this.state.sec).padStart(2, 0)}\n              邀请好友参团\n            </div>\n          </div>\n        )}\n        <i\n          onClick={this.colse}\n          className={\"iconfont iconiconfront-2 close\"}\n        ></i>\n      </div>\n    )\n  }\n}\n\nexport default compose(\n  connect((state) => ({ user: state.user }), null),\n  withRouter\n)(Single)\n"],"sourceRoot":""}