{"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":"wTAOMA,EAAS,SAAC,GAAc,IAAZC,EAAW,EAAXA,KAChB,OACE,yBAAKC,UAAU,UACb,0BAAMA,UAAU,SAAhB,OAA0BD,EAAKE,QAC/B,0BAAMD,UAAU,eAAhB,OAAgCD,EAAKG,UAqE5BC,EAhEdC,a,+MAECC,MAAQ,CACNC,IAAK,GACLC,KAAM,GACNC,SAAU,M,EAOZC,kBAAoB,WAClBC,IACGC,IADH,UAEOC,IAAIC,KAFX,oCAE2C,EAAKC,MAAMC,UAFtD,gBAEuE,EAAKV,MAAMC,MAE/EU,MAAK,SAACC,GACL,IAAMC,EAAOD,EAAIC,KACC,MAAdA,EAAKC,KACP,EAAKC,SAAS,CACZb,KAAMc,MAAMC,QAAQJ,EAAKA,MAAQA,EAAKA,KAAO,KAG/C,IAAMK,KAAKL,EAAKM,S,EAKxBC,eAAiB,SAACC,GACI,EAAKZ,MAAjBa,QACAC,KAAR,qBAA2BF,K,kEAtB3BG,KAAKpB,sB,+BAyBG,IAAD,OACP,OAAOoB,KAAKxB,MAAME,KAAKuB,OACrB,yBAAK9B,UAAU,kBACb,yBAAKA,UAAW,SAAhB,4BACA,4BACG6B,KAAKxB,MAAME,KAAKwB,KAAI,SAAChC,GACpB,IAAMiC,EACJ,yBAAKhC,UAAU,QACb,uBAAGA,UAAU,yBAAyBD,EAAKkC,cAC3C,uBAAGjC,UAAU,uBAAuBD,EAAKmC,mBACzC,kBAAC,EAAD,CAAQnC,KAAMA,KAIlB,OACE,kBAAC,IAAD,CACEoC,IAAKpC,EAAKqC,UACVC,IAAKtC,EAAKuC,WACVC,YAAa,EAAKd,eAClBF,KAAMS,EACNN,GAAI3B,EAAKqC,iBAMjB,S,GA3DqBI,mB,4BCqHdC,E,4MA/HbF,YAAc,SAACG,GACb,EAAK5B,MAAM6B,YAAYD,I,uDAGf,IAAD,OACP,OACE,yBAAK1C,UAAU,iBACb,4BACG6B,KAAKf,MAAM8B,aAAab,KAAI,SAAChC,EAAM8C,GAClC,OACE,wBACEV,IAAKpC,EAAK2B,GACV1B,UAAW8C,IAAW,CACpBC,OAAQ,EAAKjC,MAAMkC,cAAgBH,KAGrC,yBACE7C,UAAU,cACViD,QAAS,EAAKV,YAAYW,KAAK,EAAML,IAErC,0BAAM7C,UAAU,yBAAyBD,EAAKoD,MAE9C,uBACEnD,UAAW8C,IAAW,WAAY,CACZ,IAApB/C,EAAKqD,WACD,qBACA,EAAKtC,MAAMkC,cAAgBH,EAC3B,cACA,mBAIT,EAAK/B,MAAMuC,OACVtD,EAAKqD,WACHrD,EAAKuD,UAAYvD,EAAKuD,SAASC,IAC7B,kBAAC,IAAD,CACEC,GAAI,CACFC,SAAU1D,EAAKuD,SAASI,UACpB,eACA,YACJC,OAAO,aAAD,OAAe5D,EAAK2B,GAApB,gBAA8B3B,EAAKuD,SAASC,KAClDlD,MAAO,CACLuD,KAAK,cAAD,OAAgBC,OAAOC,SAASH,WAIxC,yBAAK3D,UAAU,YACb,0BAAMA,UAAW,qBAAjB,iCACQD,EAAKuD,SAASS,OAEtB,uBACE/D,UAAW8C,IACT,WACA/C,EAAKuD,SAASI,UAAY,oBAAsB,QAKtD,KAEJ,uBAAGM,KAAK,sBACN,yBAAKhE,UAAU,YACb,0BAAMA,UAAW,qBAAjB,iCACQD,EAAKuD,SAASS,OAEtB,uBACE/D,UAAW8C,IACT,WACA,0BAOV/C,EAAKkE,gBAAgBlC,KAAI,SAACmC,EAAYrB,GACpC,OAAO9C,EAAKqD,WACV,kBAAC,IAAD,CACEI,GAAI,CACFC,SAAUS,EAAWR,UACjB,eACA,YACJC,OAAO,aAAD,OAAe5D,EAAK2B,GAApB,gBAA8BwC,EAAWX,KAC/ClD,MAAO,CACLuD,KAAK,cAAD,OAAgBC,OAAOC,SAASH,UAGxCxB,IAAKU,GAEL,yBAAK7C,UAAU,YACb,0BAAMA,UAAW,qBAAjB,iCACQkE,EAAWH,OAEnB,uBACE/D,UAAW8C,IACT,WACAoB,EAAWR,UAAY,oBAAsB,QAMrD,uBAAGM,KAAK,sBACN,yBAAKhE,UAAU,YACb,0BAAMA,UAAW,qBAAjB,iCACQkE,EAAWH,OAEnB,uBACE/D,UAAW8C,IACT,WACA,uC,GA/GHqB,a,2BCFrBC,G,8KAeM,IACAC,EAAUxC,KAAKf,MAAfuD,MACR,OACE,yBAAKrE,UAAU,iBACb,uBAAGA,UAAU,UAAb,8EACA,2BACGqE,GACCA,EAAMvC,QACNuC,EAAMtC,KAAI,SAAChC,EAAM8C,GACf,OACE,sBAAWyB,MAAX,CAAiBC,OAAQxE,EAAKyE,SAAUrC,IAAKU,GAC1C9C,EAAK0E,MAAM1C,KAAI,SAAChC,GACf,OACE,yBAAKoC,IAAKpC,EAAK2E,QAAS1E,UAAU,aAC/BD,EAAK4E,wB,GA7BHR,cAArBC,EACGQ,aAAe,CACpBP,MAAO,CACL,CACEG,SAAU,GACVC,MAAO,CACL,CACEE,UAAW,GACXD,QAAS,OAkCNN,Q,gFC5CTD,EAAYU,IAAQC,aAAa,aACjCC,EAASF,IAAQC,aAAa,UAE9BE,E,yKAEF,OAAO,gEAAe,MAAO,CAC3BhF,UAAW,mC,gCAKb6B,KAAKoD,MAAQpD,KAAKoD,IAAM,U,GARQd,GAY9Be,E,kDACJ,WAAYC,EAAQC,GAAU,IAAD,8BAC3B,cAAMD,EAAQC,IACTC,GAAG,MAAO,EAAKC,KAFO,E,uDAM3B,OAAO,gEACL,SACA,CACEtF,UAAW,0BAEb,CACEuF,KAAM,a,4BAMV1D,KAAK2D,QAAQC,S,gCAIT5D,KAAKoD,MACPpD,KAAK6D,IAAI,MAAO7D,KAAKyD,KACrBzD,KAAKoD,IAAM,U,GAzBcF,GA8B/BZ,EAAUwB,kBAAkB,mBAAoBT,GAEhDF,EAAsBY,UAAUC,SAAW,CACzCC,SAAU,CAAC,qBAGb3B,EAAUwB,kBAAkB,wBAAyBX,GClCrD,IAAIe,EAAQ,IAAMA,MAElB,SAASC,EAAmBlF,GAC1B,OACEA,EAAMmF,QACJ,yBAAKjG,UAAU,gCACb,yBAAKA,UAAU,wBACb,yBAAKA,UAAU,SAAf,4BACA,wBAAIA,UAAU,sBACZ,4BACE,yBAAKA,UAAU,SAAf,4BACA,yBAAKA,UAAU,UACb,0BAAMA,UAAU,OAAOc,EAAMI,KAAKgF,iBADpC,WAIF,4BACE,yBAAKlG,UAAU,SAAf,kCACA,yBAAKA,UAAU,UACb,0BAAMA,UAAU,OACbmG,WAAWrF,EAAMI,KAAKkF,eAF3B,OAQJ,yBAAKpG,UAAU,mBACb,yBAAKA,UAAU,SAAf,sBACA,4BACE,wBAAIA,UAAU,cACZ,uBAAGqG,MAAO,CAAEC,QAAS,SAAWtC,KAAMlD,EAAMI,KAAKqF,KAC/C,yBAAKvG,UAAU,QACb,uBAAGA,UAAU,8BAEf,yBAAKA,UAAU,QAAf,8BAGJ,wBAAIA,UAAU,cACZ,uBAAGqG,MAAO,CAAEC,QAAS,SAAWtC,KAAMlD,EAAMI,KAAKqF,KAC/C,yBAAKvG,UAAU,QACb,uBAAGA,UAAU,mCAEf,yBAAKA,UAAU,QAAf,0BAKR,uBACEA,UAAU,iCACViD,QAASnC,EAAM0F,oB,IAQrBC,E,4MAaJC,qBAAuB,E,EACvBC,oBAAsB,E,EACtBC,WAAY,E,EAIZC,yBAA0B,E,EAE1BC,YAAc,e,EAEdzG,MAAQ,CACN0D,MAAO,GACPvD,SAAU,KACVuG,UAAW,GACX1C,MAAO,GACPrB,YAAa,EACbgE,QAAQ,EACRC,OAAQ,GACRC,UAAW,KACXnG,UAAW,KACXoG,WAAW,EACXC,kBAAkB,EAClBC,UAAW,GACXC,WAAW,EACXC,SAAU,GACVC,WAAY,EACZC,SAAU,EACVC,WAAY,EACZC,0BAA0B,EAC1BC,oBAAoB,EACpBC,eAAgB,GAChBC,4BAA4B,EAC5BC,qBAAsBC,KAAKC,MACzBC,aAAaC,QAAQ,4BAEvBC,uBAAwB,I,EAmC1BC,MAAQ,WAAM,MAEY,EAAKhI,MAArB4G,cAFI,MAEK,GAFL,EAGZvG,IACGC,IADH,UACUC,IAAI,YADd,kCACmDqG,EAAO7E,UAD1D,MAEGpB,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,MACX,EAAKxH,MAAMa,QAAQC,KAAnB,oBAAqCqF,EAAO7E,WAAa,CACvDmG,OAAQ,IAGV,IAAMhH,KAAKN,EAAIC,KAAKM,IAAK,O,EAKjCgH,YAAc,SAACzI,GACb,EAAKqB,SAAS,CACZkG,WAAW,EACXE,WAAY,EACZD,SAAUxH,IAEZ8D,OAAOqE,aAAaO,QAAQ,WAAYT,KAAKU,UAAU3I,K,EAIzD4I,QAAU,SAACC,GACT,EAAKxH,SAAS,CAAEkG,UAAWsB,EAAKpB,WAAY,K,EAI9CqB,YAAc,WACZ,IAAMC,EAAK,eACNC,YAAS,SAGZ,EAAK3H,SAAS,CACZmG,SAAUS,KAAKC,MAAMpE,OAAOqE,aAAaC,QAAQ,eAEnDW,EAAME,kBAAoBC,aAAY,WACpCvI,IACGC,IADH,UACUC,IAAI,YADd,6BAC8CmI,YAAS,SACpD/H,MAAK,SAACC,GACkB,MAAnBA,EAAIC,KAAKoH,QACXY,cAAcJ,EAAME,mBACpBF,EAAME,kBAAoB,KAE1BtI,IACGC,IADH,UACUC,IAAI,YADd,+BACgDmI,YAAS,SACtD/H,MAAK,SAACC,GAC+B,MAAhCkI,OAAOlI,EAAIC,KAAKA,KAAKoH,OAEvBQ,EAAM1H,SAAS,CACboG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9BQ,EAAM1H,SAAS,CACboG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9BQ,EAAM1H,SAAS,CACboG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9BQ,EAAM1H,SAAS,CACbqG,SAAUxG,EAAIC,KAAKA,KAAKA,KAAKkI,UAC7B1B,WAAYzG,EAAIC,KAAKA,KAAKA,KAAKmI,sBAC/B7B,WAAY,IAGd,IAAMjG,KAAKN,EAAIC,KAAKA,KAAKM,IAAK,YAKzC,O,EAIP8H,YAAc,WACZ,IAAIR,EAAK,eACLS,EAAcR,YAAS,QAC3B,GAAIQ,EAAa,CACf,IAAKR,YAAS,OACZ,OAEA,EAAK3H,SAAS,CACZmG,SAAUS,KAAKC,MAAMpE,OAAOqE,aAAaC,QAAQ,eAGnDzH,IACGC,IADH,UAEOC,IAAI,YAFX,qCAEmDmI,YAC7C,OAHN,iBAIcQ,IAEXvI,MAAK,SAACC,GACL,GAAuB,IAAnBA,EAAIC,KAAKoH,MAAa,CACxB,IAAMpH,EAAOD,EAAIC,KAAKA,KAEtB,SAASsI,IACPC,eAAeC,OACb,uBACA,CACEC,MAAOzI,EAAKyI,MACZC,UAAW1I,EAAK0I,UAChBC,SAAU3I,EAAK2I,SACfC,QAAS5I,EAAK4I,QACdC,SAAU7I,EAAK6I,SACfC,QAAS9I,EAAK8I,UAEhB,SAAU/I,GACY,+BAAhBA,EAAIgJ,SACN,IAAM1I,KAAK,2BAAQ,GACnBuH,EAAME,kBAAoBC,aAAY,WACpCvI,IACGC,IADH,UAEOC,IAAI,YAFX,6BAE2CmI,YACrC,SAGH/H,MAAK,SAACC,GACkB,MAAnBA,EAAIC,KAAKoH,QACXY,cAAcJ,EAAME,mBACpBF,EAAME,kBAAoB,KAE1BtI,IACGC,IADH,UAGMC,IAAI,YAHV,+BAI2BmI,YAAS,SAEjC/H,MAAK,SAACC,GAC+B,MAAhCkI,OAAOlI,EAAIC,KAAKA,KAAKoH,OAEvBQ,EAAM1H,SAAS,CACboG,WAAY,IAGkB,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrBQ,EAAM1H,SAAS,CACboG,WAAY,IAGkB,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrBQ,EAAM1H,SAAS,CACboG,WAAY,IAGkB,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrBQ,EAAM1H,SAAS,CACbqG,SAAUxG,EAAIC,KAAKA,KAAKA,KAAKkI,UAC7B1B,WACEzG,EAAIC,KAAKA,KAAKA,KACXmI,sBACL7B,WAAY,IAGd,IAAMjG,KAAKN,EAAIC,KAAKA,KAAKM,IAAK,YAKzC,MAEHuE,EAAM,+BAMe,oBAAlB0D,eACLS,SAASC,iBACXD,SAASC,iBACP,sBACAX,GACA,GAEOU,SAASE,cAClBF,SAASE,YAAY,sBAAuBZ,GAC5CU,SAASE,YAAY,wBAAyBZ,IAGhDA,SAGF,IAAMjI,KAAKN,EAAIC,KAAKM,IAAK,Q,EAOrC6I,MAAQ,SAACC,GACP,EAAKlJ,SAAS,CACZmG,SAAUS,KAAKC,MAAMpE,OAAOqE,aAAaC,QAAQ,eAEnDzH,IAAKC,IAAL,UAAYC,IAAI,YAAhB,+BAAkD0J,IAAOtJ,MAAK,SAACC,GACzB,MAAhCkI,OAAOlI,EAAIC,KAAKA,KAAKoH,OAEvB,EAAKlH,SAAS,CACZoG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZoG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZoG,WAAY,IAE2B,MAAhC2B,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZqG,SAAUxG,EAAIC,KAAKA,KAAKA,KAAKkI,UAC7B1B,WAAYzG,EAAIC,KAAKA,KAAKA,KAAKmI,sBAC/B7B,WAAY,IAGd,IAAMjG,KAAKN,EAAIC,KAAKA,KAAKM,IAAK,O,EAMpC+I,QAAU,WACR,EAAKC,GAAK,IAAIC,UAAU7J,IAAI,gBAC5B,EAAK4J,GAAGL,iBAAiB,SAAS,WAChC,EAAKK,GAAK,QAEZ,EAAKA,GAAGL,iBAAiB,SAAS,WAC5B,EAAKvD,YACP,EAAK4D,GAAK,KACVE,YAAW,WACT,EAAKH,YACJ,MAELrB,cAAc,EAAKyB,OACnB,EAAKA,MAAQ,QAEf,EAAKH,GAAGL,iBAAiB,WAAW,SAACS,GACnC,IAAM1J,EAAO8G,KAAKC,MAAM2C,EAAE1J,MACZ,OAAdA,EAAKC,OAAkB,EAAKyF,WAAY,GACtB,IAAd1F,EAAKC,MAAcD,EAAKA,MAAQA,EAAKA,KAAK2J,UAC5C,EAAK1F,OAAO2F,YAAY5J,EAAKA,KAAK2J,c,EAKxCE,YAAc,SAACC,GACb,IAAIC,EAAa,EAAKT,GAAGS,WACvBnC,EAAK,eACP,GAAmB,IAAfmC,EACF,EAAKT,IAAM,EAAKA,GAAGU,KAAKlD,KAAKU,UAAUsC,SAClC,GAAmB,IAAfC,EAAkB,CAC3B,EAAKT,GAAGW,QACR,EAAKX,GAAK,KACV,IAAI5D,EAAY8D,YAAW,WACzBU,aAAaxE,GACbA,EAAY,KACZkC,EAAM0B,GAAK,IAAIC,UAAU7J,IAAI,kBAC5B,O,EAKPyK,qBAAuB,WACrB3K,IACGC,IADH,UAEOC,IAAI,YAFX,8BAE4C,EAAK0K,SAFjD,YAGM,EAAKjL,MAAM0G,UAAU,EAAK1G,MAAM2C,aAAhC,KAGHhC,MAAK,SAACC,GAAS,IACNC,EAASD,EAATC,KACW,MAAfA,EAAKoH,OACP,EAAKlH,SAAS,CAAEiG,UAAWnG,EAAKA,KAAMkG,kBAAkB,Q,EAMhEmE,cAAgB,WAAO,IAAD,EACuC,EAAKlL,MAAxD0G,EADY,EACZA,UAAW/D,EADC,EACDA,YAAajC,EADZ,EACYA,UADZ,IACuBkG,cADvB,MACgC,GADhC,EAEpB,GAAiC,IAA7BkC,OAAOlC,EAAO7E,YAAyC,KAArB6E,EAAO7E,UAA7C,CAGA,IAAIoJ,EAAQ,EACRvE,EAAOwE,UACTD,EAAQ,GAGV,EAAKT,YAAY,CACfW,MAAO,iBACPC,IAAK,EAAK7K,MAAM8K,KAAK1K,KAAKyK,IAC1BE,MAAO,EAAKA,MACZC,SAAU,EACVC,SAAUhF,EAAU/D,GAAV,GACVZ,UAAW,EAAK/B,MAAMG,SACtBwL,YAAajL,EACbyK,MAAOA,M,EAIXS,cAAgB,SAACC,EAAKC,GAAU,IAAD,EAC8B,EAAK9L,MAAxD0G,EADqB,EACrBA,UAAW/D,EADU,EACVA,YAAajC,EADH,EACGA,UADH,IACckG,cADd,MACuB,GADvB,EAO7B,GAAoB,IAAhBkC,OAAO+C,GAAX,CAGA,IAAIV,EAAQ,EACRvE,EAAOwE,UACTD,EAAQ,GAMV,EAAKT,YAAY,CACfW,MAAO,aACPS,OACAC,KAAMF,EACNH,SAAUhF,EAAU/D,GAAV,GACVZ,UAAW,EAAK/B,MAAMG,SACtBwL,YAAajL,EACb4K,IAAK,EAAK7K,MAAM8K,KAAK1K,KAAKyK,IAC1BE,MAAO,EAAKA,MACZC,SAAU,EACVjB,SAAUwB,SAAS,EAAKlH,OAAO2F,eAC/BU,MAAOA,M,EAIXc,WAAa,WACX,EAAKC,MAAQ,EACb,EAAKC,SAAW,EAChBtD,cAAc,EAAKyB,OACnB,EAAKA,MAAQ,KACb,EAAKA,MAAQ1B,aAAY,WACnB,EAAK9D,QAAU,EAAKA,OAAOA,WACV,IAAf,EAAKoH,OACP,EAAKN,cAAc,EAAKO,SAAU,EAAK7F,qBACvC,EAAK4F,MAAQ,EAAKC,SAAW,KAE5B,EAAKrH,OAAOsH,UAAY,EAAKD,YAC7B,EAAKrH,OAAOsH,UAAY,EAAKF,YAGjC,M,EAILG,iBAAmB,WACjB7I,OAAO8I,sBAAuB,EAC9B,EAAKxH,OAASN,YAAQ,EAAK+H,MAAO,CAChCC,UAAU,EACVC,QAAS,OACTC,eAAe,EACfC,kBAAkB,EAClBC,aAAa,EACbC,cAAc,EACdC,cAAe,CAAC,OAAQ,IAAK,MAAO,KACpCC,WAAY,CACVC,wBAAwB,KAG5B,EAAKlI,OAAOmI,SAAS,yBACrB,EAAKnI,OAAOE,GAAG,QAAQ,WAAO,IAAD,EACmB,EAAKhF,MAA3C0G,EADmB,EACnBA,UAAW/D,EADQ,EACRA,YAAajC,EADL,EACKA,UAE5B,EAAK8F,0BAEP,EAAKA,yBAA0B,EAE/B,EAAK2D,GAAGU,KACNlD,KAAKU,UAAU,CACbgD,MAAO,EAAK5E,YACZ6E,IAAK,EAAK7K,MAAM8K,KAAK1K,KAAKyK,IAC1BE,MAAO,EAAKA,MACZC,SAAU,EACVC,SAAUhF,EAAU/D,GAAV,GACVZ,UAAW,EAAK/B,MAAMG,SACtBwL,YAAajL,EACbwM,QAAS,MAIV,EAAK5C,OACR,EAAK2B,gBAGT,EAAKnH,OAAOE,GAAG,kBAAkB,WAC/B,IAAImI,EAAY3J,OAAO4J,eAAetF,QAAQ,yBAC1CgE,EAAOtI,OAAO4J,eAAetF,QAAQ,yBACrCqF,IACF,EAAKrI,OAAO2F,YAAY3B,OAAOqE,IAC/BrB,GAAQ,EAAKhH,OAAOuI,aAAavB,GACjCtI,OAAO4J,eAAeE,WAAW,yBACjC9J,OAAO4J,eAAeE,WAAW,6BAGrC,EAAKxI,OAAOE,GAAG,cAAc,WAC3B,EAAKsB,oBAAsB,EAAKxB,OAAOuI,eACvC,EAAKzB,cAAc,EAAKO,SAAU,EAAK9F,sBACvC,EAAK6F,MAAQ,EAAKC,SAAW,EAC7B,EAAK9F,qBAAuB,EAAKC,uBAEnC,EAAKxB,OAAOE,GAAG,SAAS,WACtB,EAAK4G,cAAc,EAAKO,SAAU,EAAK7F,qBACvC,EAAK4F,MAAQ,EAAKC,SAAW,EAC7B,EAAKjB,gBAED,EAAKlL,MAAM4G,OAAOwE,SACpB,EAAKJ,uBAEPnC,cAAc,EAAKyB,OACnB,EAAKA,MAAQ,KACT,EAAKtK,MAAMwH,eAAe+F,SAC5B,EAAKxM,SAAS,CACZwG,oBAAoB,OAI1B,EAAKzC,OAAOE,GAAG,SAAS,WACtB,EAAKwI,qBAAqB,MAE5B,EAAK1I,OAAOE,GAAG,WAAW,WACxB,EAAKwI,qBAAqB,S,EAI9BC,eAAiB,WACfpN,IAAKqN,KAAL,UAAanN,IAAIC,KAAjB,+BAAoD,CAClDmL,YAAa,EAAK3L,MAAM4G,OAAX,YACb8E,SAAU,EAAK1L,MAAM0G,UAAU,EAAK1G,MAAM2C,aAAatB,M,EAkB3DmM,qBAAuB,SAACG,GACtB5C,aAAa,EAAK6C,mBAClB,EAAKA,kBAAoBvD,YAAW,WAC9B,EAAKtC,wBAAyB,IAAI8F,MAAOC,YAC3CtK,OAAO4J,eAAehF,QACpB,wBACA,EAAKtD,OAAO2F,eAEdjH,OAAO4J,eAAehF,QACpB,wBACA,EAAKtD,OAAOuI,gBAEd,EAAKU,iBAENJ,I,EAILI,YAAc,WAAO,IAAD,EACiB,EAAK/N,MACpCgO,EAFc,EACVtH,UADU,EACC/D,aAEnBtC,IACGC,IADH,UACUC,IAAIC,KADd,4BACsCwN,EAAO3M,GAD7C,YACmD2M,EAAOrC,cACvDhL,MAAK,SAACC,GAAS,IAAD,EACeA,EAAIC,KAAxBA,EADK,EACLA,KAAMC,EADD,EACCA,KAAMK,EADP,EACOA,IAChB+E,EAAM,IAAI+H,IAAIpN,EAAKqF,KAAKgI,aACf,MAATpN,GACF,EAAKiH,uBACH7B,EAAIiI,IAAI,YAA2C,IAA7BrF,OAAO5C,EAAI5F,IAAI,YACvC,EAAK8N,aAAavN,EAAKqF,MAEvB,IAAMhF,KAAKC,O,EAMnBmB,YAAc,SAACE,GACTA,IAAU,EAAKxC,MAAM2C,cAGzB,EAAK6D,yBAA0B,EAC/B,EAAKoF,cAAc,EAAKO,SAAU,EAAK7F,qBACvC,EAAK4E,gBACL,EAAKe,aAEL,EAAKlL,SACH,CACE4B,YAAaH,IAEf,WACM,EAAK6L,QAAQ,EAAKrO,MAAM2C,cAC1B,EAAKoL,cACL,EAAKN,iBACL,EAAKa,aAEL,EAAKC,sB,EAMbC,kBAAoB,SAACC,GACnB,OAAO,EAAKzO,MAAM0G,UAAUgI,WAC1B,SAAChP,GAAD,OAAUoJ,OAAOpJ,EAAK2B,MAAQyH,OAAO2F,O,EAIzCE,aAAe,WACb,IAAIzI,EAAM,GACNwC,YAAS,aACXxC,EAAG,UAAM3F,IAAIC,KAAV,0BACD,EAAKyK,SAAW,aAAevC,YAAS,aAE1CrI,IAAKqN,KAAL,UAAanN,IAAI,YAAjB,2BAAuD,CACrDmL,SAAUhD,YAAS,eAGrBxC,EAAG,UAAM3F,IAAIC,KAAV,0BAAgC,EAAKyK,UAE1C5K,IAAKC,IAAI4F,GAAKvF,MAAK,SAACC,GAAS,IAAD,EACEA,EAAIC,KADN,IAClBA,YADkB,MACX,GADW,EAEb,MAFa,EACPC,MAEjB,EAAKC,UACH,SAACf,GAAD,MAAY,CACV0G,UAAW7F,EAAI,QACf+F,OAAQ/F,EAAK+F,OACbzG,SAAUU,EAAK+F,OAAL,UACVlG,UAAWG,EAAK+F,OAAL,YACXlD,MAAO7C,EAAK+F,OAAL,aACPE,WAAW,KAEb,EAAK8H,WAEP/N,EAAK+F,OAAO7E,WAAa,EAAK8M,kBAAkBhO,EAAK+F,OAAO7E,YAE5D,IAAMb,KAAKL,EAAKM,S,EAKtByN,UAAY,WAAM,MAEQ,EAAK5O,MAArB4G,cAFQ,MAEC,GAFD,EAGZ6B,EAAK,eACT,EAAKyB,UACL,EAAK+B,aACL,IAAI6C,EAAezE,YAAW,WAC5BU,aAAa+D,GACbA,EAAe,KACfrG,EAAMyC,kBACL,KACC1I,EAAQ,EAAKgM,kBAAkB5H,EAAOmI,eAC1CvM,EAAQA,GAAS,EAAIA,EAAQ,EAC7B,EAAKzB,SACH,CACE4B,YAAaH,IAEf,WACM,EAAKwM,gBAAgBxM,GACnB,EAAK6L,QAAQ7L,GACfyM,QAAQC,UAAUvO,MAAK,WACrB,EAAK0L,mBACL,EAAK8C,kBAGP,EAAKZ,iBAGP7I,EAAM,2BAAQ,GAAI,CAChB,CACE0J,KAAM,KACNC,QAAS,WACP,EAAK5O,MAAMa,QAAQC,KAAK,a,EAStC6M,aAAe,SAACkB,GACT,EAAKxK,QACR,EAAKuH,mBAEP,EAAKvH,OAAOwK,IAAI,CACdA,MACApK,KAAM,0BAER,EAAKJ,OAAOM,Q,EAGdkJ,UAAY,WACV,EAAKxJ,OAAOyK,OAAM,WAChB,EAAKzK,OAAOM,W,EAiBhB4J,gBAAkB,SAACxM,GACjB,OAAqD,IAA9C,EAAKxC,MAAM0G,UAAUlE,GAArB,Y,EAGT+L,eAAiB,WAAO,IAAD,EACG,EAAKvO,MAArB4G,cADa,MACJ,GADI,EAErBvG,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,6BAAyCoG,EAAO7E,YAAapB,MAAK,SAACC,GAAS,IAClEC,EAASD,EAATC,KACU,MAAdA,EAAKC,MACP,EAAKC,SAAS,CACZ8F,UAAWhG,EAAKA,KAAL,iB,EAMnBsO,aAAe,WAAO,IACZxM,EAAgB,EAAK3C,MAArB2C,YACJ,EAAK0L,QAAQ1L,IACf,EAAKoL,e,EAITM,QAAU,SAAC7L,GAKT,OAJsB,EAAKxC,MAAnB0G,UAEelE,GAEb,YACR,EAAKzB,SAAS,CACZ4F,QAAQ,KAEH,IAEP,EAAK5F,SAAS,CACZ4F,QAAQ,KAEH,I,EAIXkI,kBAAoB,SAACxN,GACnBhB,IACGqN,KADH,UACWnN,IAAIC,KADf,cACiC,CAC7BuB,UAAWV,IAEZV,MAAK,SAACC,GAAS,IAAD,EACeA,EAAIC,KAAxBC,EADK,EACLA,KAAMK,EADD,EACCA,IAAKN,EADN,EACMA,KACnB,GAAa,MAATC,EAAc,CAAC,IAAD,EAC2B,EAAKd,MAAxCG,EADQ,EACRA,SAAUuH,EADF,EACEA,qBAClB,EAAK3G,SAAS,CACZyG,eAAgB3G,EAChB4G,6BAA4BC,GACxBA,EAAqB8H,SAASrP,UAIpC,IAAMe,KAAKC,EAAK,EAAG,MAAM,O,EAIjCsO,6BAA+B,WACxB,EAAKzP,MAAMsH,0BAGhBjH,IACGqN,KADH,UACWnN,IAAIC,KADf,kBACqC,CACjCuB,UAAW,EAAK/B,MAAM4G,OAAO7E,YAE9BpB,MAAK,SAACC,GAAS,IAAD,EACSA,EAAIC,KAAlBC,EADK,EACLA,KAAMK,EADD,EACCA,IACD,MAATL,EACF,EAAKC,SAAS,CACZyG,eAAe,2BAAM,EAAKxH,MAAMwH,gBAAlB,IAAkC+F,QAAS,MAG3D,IAAMrM,KAAKC,EAAK,EAAG,MAAM,O,kEA1uB/B,GAAiC,WAA7BqC,OAAOC,SAASiM,SAMpB,GADAlO,KAAKyJ,SAAWvC,YAAS,MACpBlH,KAAKyJ,SAAV,CAIAzJ,KAAKT,SAAS,CACZZ,SAAUqB,KAAKyJ,WAZC,MAgBdzJ,KAAKf,MADPgD,SAAYzD,aAfI,MAeI,GAfJ,EAiBdA,EAAMiK,KACRzI,KAAKwI,MAAMhK,EAAMiK,MAEU,IAAzBvB,YAAS,aAAqBA,YAAS,eACzClH,KAAKgH,cAEHmH,IAAQC,UACVpO,KAAKyH,cAEPzH,KAAKgK,MAAQqE,IAASvP,IAAI,SAC1BkB,KAAKmN,eACLnN,KAAKsO,uBApBHtO,KAAKf,MAAMa,QAAQyO,QAAQ,UAN3BvM,OAAOC,SAASsM,QAAQ,OAASvM,OAAOC,SAASE,KAAKqM,MAAM,M,6CAoe9DxO,KAAKsD,QAAUtD,KAAKsD,OAAOmL,UAE3BpH,cAAcrH,KAAK8I,OACnB9I,KAAK8I,MAAQ,KACb9I,KAAK2I,IAAM3I,KAAK2I,GAAGW,QACnBtJ,KAAK2I,GAAK,KAEVtB,cAAcrH,KAAK0O,aACnB1O,KAAK2O,cAAgB3O,KAAK2O,aAAarF,QACvCtJ,KAAK2O,aAAe,O,wCAmKH,IAAD,OAChB9P,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,0BAAsCgB,KAAKyJ,WAAYtK,MAAK,SAACC,GAC3D,IAAMC,EAAOD,EAAIC,KACC,MAAdA,EAAKC,KACP,EAAKC,SAAS,CACZiD,MAAOnD,EAAKA,OAGd,IAAMK,KAAKL,EAAKM,U,+BAsFZ,IAAD,SAC4BK,KAAKf,MAAlC2P,EADC,EACDA,MAAO3M,EADN,EACMA,SAAUnC,EADhB,EACgBA,QADhB,EAaHE,KAAKxB,MAVP0G,EAHK,EAGLA,UACA/D,EAJK,EAILA,YACAgE,EALK,EAKLA,OACAE,EANK,EAMLA,UACAD,EAPK,EAOLA,OACAK,EARK,EAQLA,UACAE,EATK,EASLA,WACAI,EAVK,EAULA,mBACAC,EAXK,EAWLA,eACAC,EAZK,EAYLA,2BAEE4I,EAAS,GAIb,OAHI5M,EAASzD,OAASyD,EAASzD,MAAMmD,IAA4B,WAAtBM,EAASzD,MAAMmD,KACxDkN,EAAM,qBAAiBzJ,EAAO7E,YAG9B,yBAAKpC,UAAU,QACb,kBAAC2Q,EAAA,EAAD,CACE5M,MAAOlC,KAAKxB,MAAM0D,MAClB6M,OAAO,EACPF,OAAQ,WACNA,EACI/O,EAAQC,KAAK8O,EAAQ,CACnBlN,GAAI,aAEN7B,EAAQkP,IAAI,MAGpB,kBAAC,IAAD,CAAS1J,UAAWtF,KAAKxB,MAAM8G,WAC7B,yBAAKnH,UAAU,SACb,2BACEA,UAAW,WACX8Q,IAAK,SAACC,GAAD,OAAS,EAAKnE,MAAQmE,GAC3BC,qBAAmB,OACnBC,aAAa,EACbC,mBAAiB,QACjBC,uBAAqB,MAErB,4BAAQxB,IAAK,IAAKpK,KAAK,4BAEvByB,KAAYD,EAAU/D,GAAV,UACZ,yBAAKhD,UAAU,gBACb,yBAAKA,UAAU,QAAf,oGACA,yBAAKA,UAAU,QACb,4BACEuF,KAAK,SACLtC,QAASpB,KAAKwG,MACdrI,UAAU,kBAHZ,OAKIkH,EALJ,6BAOA,4BACE3B,KAAK,SACLtC,QAASpB,KAAK2G,YAAYtF,KACxBrB,KACAkF,EAAU/D,IAEZhD,UAAU,oBANZ,OAQI+G,EAAUjF,QAAUiF,EAAU/D,GAAV,YAAuC,IAR/D,+BAcJgE,KAAYC,EAAOwE,SACnB,yBAAKzL,UAAU,eACb,uBAAGA,UAAW,8BACd,uBAAGA,UAAW,QACX+G,EAAU/D,GAAV,iBAEH,uBAAGhD,UAAW,QAAd,uCAIN,yBAAKA,UAAU,OACb,6BACE,kBAAC,IAAD,CACEwD,GAAI,CACFC,SAAS,GAAD,OAAKgN,EAAMlK,IAAX,UACR5C,OAAO,OAAD,OAAS9B,KAAKyJ,WAEtB8E,SAAO,EACPgB,gBAAgB,UANlB,iBAWF,6BACE,kBAAC,IAAD,CACE5N,GAAI,CACFC,SAAS,GAAD,OAAKgN,EAAMlK,IAAX,UACR5C,OAAO,OAAD,OAAS9B,KAAKyJ,WAEtB8E,SAAO,EACPgB,gBAAgB,UANlB,kBAcH9J,GACC,kBAAC,IAAD,CACE9G,SAAUyG,EAAO7E,UACjBkF,UAAWzF,KAAKxB,MAAMiH,UACtBqB,QAAS9G,KAAK8G,QACdzH,KAAMW,KAAKxB,MAAMkH,SACjBC,WAAY3F,KAAKxB,MAAMmH,WACvB6J,UAAWpK,EAAO+E,YAClBsF,QAASzP,KAAKxB,MAAMkH,SAASwE,SAC7B1B,MAAOxI,KAAKwI,MACZtG,MAAOlC,KAAKxB,MAAMkH,SAASgK,cAIf,IAAf/J,GACC,kBAAC,IAAD,CACEhH,SAAUyG,EAAO7E,UACjBuG,QAAS9G,KAAK8G,QACdzH,KAAMW,KAAKxB,MAAMkH,SACjBC,WAAYA,EACZ6J,UAAWpK,EAAO+E,YAClBsF,QAASzP,KAAKxB,MAAMkH,SAASwE,SAC7BtE,SAAU5F,KAAKxB,MAAMoH,SACrBC,WAAY7F,KAAKxB,MAAMqH,cAI7B,kBAAC,IAAD,KACE,kBAAC,IAAD,CACE8J,OAAK,EACL5N,KAAM,QACNJ,GAAI,CACFC,SAAU,cACVE,OAAQG,EAASH,UAGrB,kBAAC,IAAD,CACE8N,KAAI,UAAKhB,EAAMgB,KAAX,UACJC,OAAQ,SAAC5Q,GACP,OACE,kBAAC,EAAD,eACEkC,YAAa,EAAK3C,MAAM2C,YACxBL,YAAa,EAAKA,YAClBC,aAAcmE,EACd1D,OAAQ4D,EAAOwE,SACX3K,OAKZ,kBAAC,IAAD,CACE2Q,KAAI,UAAKhB,EAAMgB,KAAX,UACJC,OAAQ,SAAC5Q,GACP,OAAO,kBAAC,EAAD,iBAAkBA,EAAlB,CAAyBuD,MAAO,EAAKhE,MAAMgE,aAIxD,kBAAC,IAAD,CACEqN,OAAQ,SAAC5Q,GACP,OAAO,EAAKT,MAAMU,UAChB,kBAAC,EAAD,iBAAoBD,EAApB,CAA2BC,UAAW,EAAKV,MAAMU,aAC/C,QAGR,kBAACiF,EAAD,CACEC,OAAQpE,KAAKxB,MAAM+G,iBACnBZ,gBAAiB,kBAAM,EAAKpF,SAAS,CAAEgG,kBAAkB,KACzDlG,KAAMW,KAAKxB,MAAMgH,YAElBO,GACC,yBAAK5H,UAAW,oBACd,yBAAKA,UAAU,cACb,yBAAKA,UAAU,SACb,8BAAO6H,EAAe8J,iBAExB,yBAAK3R,UAAW,OACd,yBACEA,UAAU,SACV2P,IAAK9H,EAAe+J,WACpBC,IAAI,KAEN,uEACA,qEACQ,8BAAO5K,EAAO7E,WADtB,UAGA,yBAAKpC,UAAU,aACZ8H,GACC,2BAAOgK,QAAQ,aACb,0BACE9R,UAAS,yBACP6B,KAAKxB,MAAMsH,yBACP,UACA,cAGN,uBAAG3H,UAAW,+BAEhB,2BACEuF,KAAK,WACL7D,GAAI,YACJqQ,SAAU,SAACnH,GACT,EAAKxJ,SAAS,CACZuG,yBAA0BiD,EAAEoH,OAAOC,aAIzC,+EAKR,uBACEjS,UAAW,qCACXiD,QAAS,WACP,EAAK7B,SAAS,CACZwG,oBAAoB,EACpBE,4BAA4B,IAHjB,MAK8B,EAAKzH,MAAxCG,EALK,EAKLA,SAAUuH,EALL,EAKKA,qBAClBG,aAAaO,QACX,0BACAT,KAAKU,UACHX,EAAoB,sBACZA,GADY,CACUvH,IAC1B,CAACA,KAGT,EAAKsP,yC,GA5gCH3L,aAuhCL/D,uBAAQ,SAACC,GAAD,MAAY,CAAEuL,KAAMvL,EAAMuL,QAAS,KAA3CxL,CAAiDqG,I,4DC7kCjDyL,IAlBD,SAACpR,GACb,OACE,wBACEd,UAAU,mBACViD,QAASnC,EAAMyB,YAAYW,U,EAAWpC,EAAMY,GAAIZ,EAAMf,OAEtD,yBAAKC,UAAU,WACb,yBAAKA,UAAU,SACZc,EAAMqR,OACP,yBAAKxC,IAAK7O,EAAMuB,IAAKwP,IAAI,MAE1B/Q,EAAMS,MAERT,EAAMsR,O,+NCHPC,E,kDACJ,WAAYvR,GAAQ,IAAD,8BACjB,cAAMA,IAmCRuJ,MAAQ,SAAC9E,GACP,EAAKnE,SAAS,CACZkR,QAAS/M,KAtCM,EA2CnBgN,MAAQ,WAAO,IACL/R,EAAa,EAAKM,MAAlBN,SACFgS,EAAU,EAAK1R,MAAMI,KAAK6K,UAAY,EAAKjL,MAAMI,KAAKQ,GAC5DhB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,iCAA6C2R,IAAWxR,MAAK,SAACC,GACtC,MAAlBA,EAAIC,KAAKC,MACX,EAAKC,SAAS,CACZqR,QAASxR,EAAIC,KAAKA,KAAKwR,WAEF,MAAvB,EAAKrS,MAAMiS,QACP,EAAKK,UAAU1R,EAAIC,KAAKA,KAAKwR,SAAUlS,GACvC,EAAKoS,UAAU3R,EAAIC,KAAKA,KAAKwR,WAEjC,IAAMnR,KAAKN,EAAIC,KAAKM,IAAK,OAvDZ,EA4DnBoR,UAAY,SAACH,GAEPzC,IAAQC,SACVpM,OAAOC,SAASE,KACd,6FACA6O,mBACEhP,OAAOC,SAASE,KAAO,cAAgByO,GACvCK,cACF,wEAGFpS,IACGC,IADH,UACUC,IAAI,YADd,qCACsD6R,IACnDzR,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,MACXzE,OAAOC,SAASE,KACd/C,EAAIC,KAAKA,KAAKqF,IACd,iBACAsM,mBACEhP,OAAOC,SAASE,KAAO,oBAAsByO,GAC7CK,cAEJ,IAAMvR,KAAKN,EAAIC,KAAKM,IAAK,OAlFhB,EAwFnBmR,UAAY,SAACF,EAASjS,GACpBE,IACGC,IADH,UACUC,IAAI,YADd,0CAC2D6R,IACxDzR,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,OACXzE,OAAOC,SAAW7C,EAAIC,KAAKA,KAAKqF,IAChC/F,GAAYqD,OAAOqE,aAAaO,QAAQ,YAAajI,IAErD,IAAMe,KAAKN,EAAIC,KAAKM,IAAK,OAhGd,EAsGnB8H,YAAc,WACZ,IAAIR,EAAK,eACLS,EAAcR,YAAS,QAC3B,GAAIQ,EAAa,CACf,IAAKR,YAAS,OACZ,OAEArI,IACGC,IADH,UAEOC,IAAI,YAFX,qCAEmDmI,YAC7C,OAHN,iBAIcQ,IAEXvI,MAAK,SAACC,GACL,GAAuB,IAAnBA,EAAIC,KAAKoH,MAAa,CAAC,IAGhBkB,EAAT,WACEC,eAAeC,OACb,uBACA,CACEC,MAAOzI,EAAKyI,MACZC,UAAW1I,EAAK0I,UAChBC,SAAU3I,EAAK2I,SACfC,QAAS5I,EAAK4I,QACdC,SAAU7I,EAAK6I,SACfC,QAAS9I,EAAK8I,UAEhB,SAAU/I,GACY,+BAAhBA,EAAIgJ,SACN,IAAM1I,KAAK,2BAAQ,GACnBuH,EAAME,kBAAoBC,aAAY,WAAa,IAAD,OAChDvI,IACGC,IADH,UAEOC,IAAI,YAFX,6BAE2CmI,YACrC,SAGH/H,MAAK,SAACC,GACkB,MAAnBA,EAAIC,KAAKoH,QACXY,cAAcJ,EAAME,mBACpBF,EAAME,kBAAoB,KAE1BtI,IACGC,IADH,UAGMC,IAAI,YAHV,+BAI2BmI,YAAS,SAEjC/H,MAAK,SAACC,GAC+B,MAAhCkI,OAAOlI,EAAIC,KAAKA,KAAKoH,OAEvB,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAGe,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrB,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAGe,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrB,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAGe,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAGrB,EAAKlH,SAAS,CACZqG,SAAUxG,EAAIC,KAAKA,KAAKA,KAAKkI,UAC7B1B,WACEzG,EAAIC,KAAKA,KAAKA,KACXmI,sBACL8I,OAAQ,EACRY,eAAe,IAGjB,IAAMxR,KAAKN,EAAIC,KAAKA,KAAKM,IAAK,YAKzC,MAEHuE,MAAM,gCA7ER7E,EAAOD,EAAIC,KAAKA,KAmFO,oBAAlBuI,eACLS,SAASC,iBACXD,SAASC,iBACP,sBACAX,GACA,GAEOU,SAASE,cAClBF,SAASE,YAAY,sBAAuBZ,GAC5CU,SAASE,YAAY,wBAAyBZ,IAGhDA,SAGF,IAAMjI,KAAKN,EAAIC,KAAKM,IAAK,QAvNlB,EA+NnBqH,YAAc,WACZ,IAAMC,EAAK,eACNC,YAAS,SAGZD,EAAME,kBAAoBC,aAAY,WAAa,IAAD,OAChDvI,IACGC,IADH,UACUC,IAAI,YADd,6BAC8CmI,YAAS,SACpD/H,MAAK,SAACC,GACkB,MAAnBA,EAAIC,KAAKoH,QACXY,cAAcJ,EAAME,mBACpBF,EAAME,kBAAoB,KAE1BtI,IACGC,IADH,UACUC,IAAI,YADd,+BACgDmI,YAAS,SACtD/H,MAAK,SAACC,GAC+B,MAAhCkI,OAAOlI,EAAIC,KAAKA,KAAKoH,OAEvB,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAEwB,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAEwB,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZ+Q,OAAQ,EACRY,eAAe,IAEwB,MAAhC5J,OAAOlI,EAAIC,KAAKA,KAAKoH,OAE9B,EAAKlH,SAAS,CACZqG,SAAUxG,EAAIC,KAAKA,KAAKA,KAAKkI,UAC7B1B,WAAYzG,EAAIC,KAAKA,KAAKA,KAAKmI,sBAC/B8I,OAAQ,EACRY,eAAe,IAGjB,IAAMxR,KAAKN,EAAIC,KAAKA,KAAKM,IAAK,YAKzC,OA/QY,EAoRnBwR,SAAW,aApRQ,EAsRnBC,eAAiB,WACf,IAAMC,QAAQ,uCAAU,GACxB,EAAKC,SAxRY,EA2RnBC,aAAe,WACb,EAAKC,cA5RY,EAgSnBA,WAAa,WACX,IAAInS,EAAO,CACTkB,UAAW2G,YAAS,OAEtBrI,IAAKqN,KAAL,UAAanN,IAAI,YAAjB,YAAwCM,GAAMF,MAAK,SAACC,GAC3B,IAAnBA,EAAIC,KAAKoH,OACX,EAAKlH,SAAS,CACZkS,aAAcrS,EAAIC,KAAKA,KAAKwR,WAE9B,EAAKa,eAAetS,EAAIC,KAAKA,KAAKwR,WAElC,IAAMnR,KAAKN,EAAIC,KAAKM,IAAK,OA3SZ,EAiTnB+R,eAAiB,SAAC7R,GAChBhB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,+BAA2Ca,IAAMV,MAAK,SAACC,GAC/B,MAAlBA,EAAIC,KAAKC,KACX,EAAKgN,QAAQlN,EAAIC,KAAKA,KAAKsS,cAE3B,IAAMjS,KAAKN,EAAIC,KAAKM,IAAK,OAtTZ,EA2TnB2M,QAAU,SAACzM,GACThB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,iCAA6Ca,IAAMV,MAAK,SAACC,GACjC,MAAlBA,EAAIC,KAAKC,KACX,EAAKC,SAAS,CACZqS,QAASxS,EAAIC,KAAKA,KAAKwS,SACvBvB,OAAQ,IAGV,IAAM5Q,KAAKN,EAAIC,KAAKM,IAAK,OAnUZ,EAyUnBmS,QAAU,WACR,EAAK7S,MAAMa,QAAQC,KAAnB,sBAAuC,EAAKvB,MAAMiT,gBA1UjC,EA8UnBH,MAAQ,WACN,EAAKrS,MAAM6H,SAAQ,GACnB,EAAKvH,SAAS,CACZ+Q,OAAQ,KA/UV,EAAK9R,MAAQ,CAEXoS,QAAS,GACThL,SAAU,GACVC,WAAY,GACZkM,KAAM,GACNC,IAAK,GACL3H,IAAK,GACLuH,QAAS,GACTH,aAAc,GACdhB,QAAS,IAETS,eAAe,GAdA,E,mHA4BOe,EAAWC,M,+BAyT3B,IAAD,OACP,GAAIlS,KAAKxB,MAAMoT,QAAS,CACtB,IAAIO,EAA4B,IAArBnS,KAAKxB,MAAMoT,QAClBQ,EAAM/F,KAAK+F,MACfhL,aAAY,WACV+K,GAAQ,IACR,IAAIE,EAAIC,YAAoB,IAAIjG,KAAK8F,GAAOC,GAAO,GACjDG,EAAIC,YAAoB,IAAInG,KAAK8F,GAAOC,GAAO,GAC/CK,EAAIC,YAAkB,IAAIrG,KAAK8F,GAAOC,GAAO,GAC/C,EAAK7S,SAAS,CACZwS,KAAMU,EACNT,IAAKO,EACLlI,IAAKgI,MAEN,KAGL,OACiB,IAFMrS,KAAKf,MAApB0G,YAGJ,6BACE,yBAAKxH,UAAU,aACb,yBAAKA,UAAU,6BACb,yBAAKA,UAAU,aACb,0DACA,2BAAI6B,KAAKf,MAAMI,KAAKsT,YAApB,WAEF,yBAAKxU,UAAU,eACb,uBAAGA,UAAU,mBACX,oDACC6B,KAAKf,MAAMiD,OAEd,uBAAG/D,UAAU,mBACX,oDACC6B,KAAKf,MAAMI,KAAKiC,OAGrB,yBAAKnD,UAAU,gBACb,iEACA,uBAAGiD,QAASpB,KAAKwI,MAAMnH,KAAKrB,KAAM,MAChC,uBAAG7B,UAAU,iCACb,0DACA,uBACEA,UAAS,iDACgB,MAAvB6B,KAAKxB,MAAMiS,QAAkB,UAAY,QAI7CtC,IAAQC,UACR,uBAAGhN,QAASpB,KAAKwI,MAAMnH,KAAKrB,KAAM,MAChC,uBAAG7B,UAAU,wBACb,oDACA,uBACEA,UAAS,iDACgB,MAAvB6B,KAAKxB,MAAMiS,QAAkB,UAAY,QAMnD,yBAAKtS,UAAU,iBAAiBiD,QAASpB,KAAK0Q,OAA9C,6BAIF,uBACEtP,QAASpB,KAAKsR,MACdnT,UAAW,yC,GAvZJmE,aAgaNsQ,gBACbrU,aAAQ,SAACC,GAAD,MAAY,CAAEuL,KAAMvL,EAAMuL,QAAS,MAC3C8I,IAFaD,CAGbpC,I,2KCnaIA,E,kDACJ,WAAYvR,GAAQ,IAAD,8BACjB,cAAMA,IA0BRuJ,MAAQ,SAAC9E,GACP,EAAKnE,SAAS,CACZkR,QAAS/M,KA7BM,EAkCnBgN,MAAQ,WACN,IAAMC,EAAU,EAAK1R,MAAMI,KAAK6K,UAAY,EAAKjL,MAAMI,KAAKQ,GAC5DhB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,iCAA6C2R,IAAWxR,MAAK,SAACC,GACtC,MAAlBA,EAAIC,KAAKC,MACX,EAAKC,SAAS,CACZqR,QAASxR,EAAIC,KAAKA,KAAKwR,WAEF,MAAvB,EAAKrS,MAAMiS,QACP,EAAKK,UAAU1R,EAAIC,KAAKA,KAAKwR,UAC7B,EAAKE,UAAU3R,EAAIC,KAAKA,KAAKwR,WAEjC,IAAMnR,KAAKN,EAAIC,KAAKM,IAAK,OA7CZ,EAkDnBoR,UAAY,SAACH,GAEPzC,IAAQC,SACVpM,OAAOC,SAASE,KACd,6FACA6O,mBACEhP,OAAOC,SAASE,KAAO,cAAgByO,GACvCK,cACF,wEAGFpS,IACGC,IADH,UACUC,IAAI,YADd,qCACsD6R,IACnDzR,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,MACXzE,OAAOC,SAASE,KACd/C,EAAIC,KAAKA,KAAKqF,IACd,iBACAsM,mBACEhP,OAAOC,SAASE,KAAO,oBAAsByO,GAC7CK,cAEJ,IAAMvR,KAAKN,EAAIC,KAAKM,IAAK,OAxEhB,EA8EnBmR,UAAY,SAACF,GACX,IAAMjS,EAAWuI,YAAS,MAC1BrI,IACGC,IADH,UACUC,IAAI,YADd,0CAC2D6R,IACxDzR,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,OACXzE,OAAOC,SAAW7C,EAAIC,KAAKA,KAAKqF,IAChC/F,GAAYqD,OAAOqE,aAAaO,QAAQ,YAAajI,IAErD,IAAMe,KAAKN,EAAIC,KAAKM,IAAK,OAvFd,EA6FnBwR,SAAW,SAAC3B,GACV,GAAiC,IAA7BlI,OAAO,EAAKrI,MAAM6T,OACpB,EAAK7T,MAAMa,QAAQC,KAAnB,oBAAqC,EAAKd,MAAMN,UAAY,CAAEoU,MAAO,QAChE,CACL,IAAIC,EAAS7M,KAAKU,UAAU,CAACS,OAAOkI,KACpC3Q,IACGC,IADH,UACUC,IAAI,YADd,iCACkDiU,IAC/C7T,MAAK,SAACC,GACkB,IAAnBA,EAAIC,KAAKoH,MACX,EAAKxH,MAAMa,QAAQC,KAAK,aAAeX,EAAIC,KAAKA,KAAK,GAAI,CACvDqH,OAAQ,IAGV,IAAMhH,KAAKN,EAAIC,KAAKM,IAAK,QA1GhB,EAgHnByR,eAAiB,WACf,IAAMC,QAAQ,uCAAU,GACxB,EAAKC,SAlHY,EAqHnBC,aAAe,WACb,EAAKC,cAtHY,EA0HnBA,WAAa,WACX,IAAInS,EAAO,CACTkB,UAAW2G,YAAS,OAEtBrI,IAAKqN,KAAL,UAAanN,IAAI,YAAjB,YAAwCM,GAAMF,MAAK,SAACC,GAC3B,IAAnBA,EAAIC,KAAKoH,OACX,EAAKlH,SAAS,CACZkS,aAAcrS,EAAIC,KAAKA,KAAKwR,WAE9B,EAAKa,eAAetS,EAAIC,KAAKA,KAAKwR,WAElC,IAAMnR,KAAKN,EAAIC,KAAKM,IAAK,OArIZ,EA2InB+R,eAAiB,SAAC7R,GAChBhB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,+BAA2Ca,IAAMV,MAAK,SAACC,GAC/B,MAAlBA,EAAIC,KAAKC,KACX,EAAKgN,QAAQlN,EAAIC,KAAKA,KAAKsS,cAE3B,IAAMjS,KAAKN,EAAIC,KAAKM,IAAK,OAhJZ,EAqJnB2M,QAAU,SAACzM,GACThB,IAAKC,IAAL,UAAYC,IAAIC,KAAhB,iCAA6Ca,IAAMV,MAAK,SAACC,GACjC,MAAlBA,EAAIC,KAAKC,KACX,EAAKC,SAAS,CACZqS,QAASxS,EAAIC,KAAKA,KAAKwS,SACvBvB,OAAQ,IAGV,IAAM5Q,KAAKN,EAAIC,KAAKM,IAAK,OA7JZ,EAmKnBmS,QAAU,WACR,EAAK7S,MAAMa,QAAQC,KAAnB,sBAAuC,EAAKvB,MAAMiT,gBApKjC,EAuKnBwB,QAAU,SAACzD,EAAWmB,GACpB,EAAK1R,MAAM6H,SAAQ,GACnB,EAAK7H,MAAMa,QAAQC,KAAnB,yBAA0CyP,EAA1C,qBAAgEmB,KAzK/C,EA6KnBW,MAAQ,WACN,EAAKrS,MAAM6H,SAAQ,GACnB,EAAKvH,SAAS,CACZ+Q,OAAQ,KA9KV,EAAK9R,MAAQ,CAEXoS,QAAS,GACThL,SAAU,GACVC,WAAY,GACZkM,KAAM,GACNC,IAAK,GACL3H,IAAK,GACLuH,QAAS,GACTH,aAAc,GACdhB,QAAS,KAZM,E,mHAmBOwB,EAAWC,M,+BAiK3B,IAAD,OACP,GAAIlS,KAAKxB,MAAMoT,QAAS,CACtB,IAAIO,EAA4B,IAArBnS,KAAKxB,MAAMoT,QAClBQ,EAAM/F,KAAK+F,MACfhL,aAAY,WACV+K,GAAQ,IACR,IAAIE,EAAIC,YAAoB,IAAIjG,KAAK8F,GAAOC,GAAO,GACjDG,EAAIC,YAAoB,IAAInG,KAAK8F,GAAOC,GAAO,GAC/CK,EAAIC,YAAkB,IAAIrG,KAAK8F,GAAOC,GAAO,GAC/C,EAAK7S,SAAS,CACZwS,KAAMU,EACNT,IAAKO,EACLlI,IAAKgI,MAEN,KAdE,IAgBC1M,EAAe3F,KAAKf,MAApB0G,WAEFgL,EAAU3Q,KAAKf,MAAMI,KAAK6K,UAAYlK,KAAKf,MAAMI,KAAKQ,GAC5D,OACE,yBAAK1B,UAAU,aACG,IAAfwH,GACC,yBAAKxH,UAAU,2BACb,yBAAKA,UAAU,UACb,uBAAGA,UAAU,qCACb,2DAEF,yBAAKA,UAAU,OAAf,+GACuB6B,KAAKf,MAAM2G,SADlC,4BAGA,yBAAKzH,UAAU,OAAf,kIAEG6B,KAAKf,MAAM4G,WAFd,wCAIA,0BACEzE,QAAS,kBAAM,EAAK6R,QAAQ,EAAKhU,MAAMuQ,UAAWmB,IAClDxS,UAAU,kBAFZ,4BAMA,yBACEA,UAAU,iBACViD,QAAS,WACP,EAAK+P,SAAS,EAAKlS,MAAMN,YAH7B,SAMIqB,KAAKf,MAAM2G,SANf,6BAUY,IAAfD,GACC,yBAAKxH,UAAU,gBACb,yBAAKA,UAAU,UACb,uBAAGA,UAAU,qCACb,2DAEF,yBAAKA,UAAU,OAAf,sHACA,yBAAKA,UAAU,iBAAiBiD,QAASpB,KAAKuR,cAA9C,wBAKY,IAAf5L,GACC,yBAAKxH,UAAU,gBACb,yBAAKA,UAAU,UACb,uBAAGA,UAAU,qCACb,2DAEF,yBAAKA,UAAU,OAAf,0GACA,yBAAKA,UAAU,iBAAiBiD,QAASpB,KAAKoR,gBAA9C,kBAKY,IAAfzL,GACC,yBAAKxH,UAAU,gBACb,yBAAKA,UAAU,UACb,uBAAGA,UAAU,qCACb,2DAGF,0BACEiD,QAAS,kBAAM,EAAK6R,QAAQ,EAAKhU,MAAMuQ,UAAWmB,IAClDxS,UAAU,kBAFZ,uBAQY,IAAfwH,GACC,yBAAKxH,UAAU,iBACb,yBAAKA,UAAU,UACb,uBAAGA,UAAU,qCACb,2DAEF,yBAAKA,UAAU,aACb,yBAAK2P,IAAK9N,KAAKf,MAAM8K,KAAK1K,KAAK6T,OAAQlD,IAAI,KAC3C,yBACElC,IAAI,qFACJkC,IAAI,KAEN,yBACElC,IAAI,qFACJkC,IAAI,MAGR,yBAAK7R,UAAU,mBAAmBiD,QAASpB,KAAK8R,SAAhD,eACKqB,OAAOnT,KAAKxB,MAAMuT,MAAMqB,SAAS,EAAG,GADzC,SAEGD,OAAOnT,KAAKxB,MAAMwT,KAAKoB,SAAS,EAAG,GAFtC,SAGGD,OAAOnT,KAAKxB,MAAM6L,KAAK+I,SAAS,EAAG,GAHtC,yCAQJ,uBACEhS,QAASpB,KAAKsR,MACdnT,UAAW,wC,GAzSAmE,aAgTNsQ,gBACbrU,aAAQ,SAACC,GAAD,MAAY,CAAEuL,KAAMvL,EAAMuL,QAAS,MAC3C8I,IAFaD,CAGbpC,I","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":""}