{"version":3,"sources":["components/study/myCourses/index.js","common/course-base/index.js","components/study/freeCourses/index.js","components/study/index.js","common/v-list-base/index.js"],"names":["AddCourse","React","memo","_ref","addCourseClick","react_default","a","createElement","className","onClick","Record","_ref2","_ref2$record","record","seconds","lesson_name","result","matchResult","exec","studyTime","hour","Math","floor","min","sec","getStudyTime","String","padStart","length","concat","Bottom","_ref3","item","ago","date","Date","time","isToday","format","MyCourses","state","isLoading","handleClick","id","history","_this","props","mode","course_id","push","loadFunc","debounce","courseList","fetchCoursesListIfNeeded","this","switchTab","_this2","_this$props","user","common","Fragment","hasError","data","uid","react_infinite_scroller_default","pageStart","hasMore","loadMore","useWindow","ref","el","list","map","index","Info","course_title","is_restricted","is_aist","assist_weixin","contact_type","course_qq","aist_schedule","style","width","parseFloat","myCourses_Bottom","status","course_expire","v_list_base","Object","assign","img","image_name","key","info","react_router_dom","to","Component","connect","myCourses","Course","bind","top","src","alt","title","bottom","text","audience","FreeCourse","page","num","courses","live","getFreeCourses","http","get","API","home","getFreeLive","toLive","room_id","live_status","window","location","toast_default","setState","then","res","code","Array","isArray","msg","isEmpty","_this3","element","threshold","fill","classnames","LiveStatus","common_course_base","logo","freeCourses_Bottom","category","PureComponent","Study","position","match","url","replace","activeClassName","react_router","exact","from","path","component","FreeCourses","compose","WithFullSize","WithTab","VList","react__WEBPACK_IMPORTED_MODULE_0___default","tab"],"mappings":"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","file":"mrstatic/js/study.a7251b7d.chunk.js","sourcesContent":["import React, { Component } from \"react\"\nimport VList from '@/common/v-list-base'\nimport './my-courses.scss'\nimport { isToday, format } from \"date-fns\"\nimport { connect } from \"react-redux\"\nimport { fetchCoursesListIfNeeded, switchTab } from \"./actions\"\nimport InfiniteScroll from 'react-infinite-scroller'\nimport { debounce } from 'lodash'\nimport { Link } from 'react-router-dom'\nimport { Loading } from \"@/common\";\n\n\nfunction getStudyTime(seconds) {\n return {\n hour: Math.floor(seconds / (60 * 60)),\n min: Math.floor(seconds / 60) % 60,\n sec: seconds % 60\n }\n}\n\nconst AddCourse = React.memo(({addCourseClick}) => (\n <div className='add-course'>\n <button className='add' onClick={addCourseClick}>添加课程+</button>\n </div>\n))\n\nfunction Record({record: {seconds, lesson_name}}) {\n let re = /第[\\s\\S]+?课/,\n result = ''\n\n if (lesson_name) {\n let matchResult = re.exec(lesson_name)\n result += (matchResult && matchResult[0]) ? matchResult[0] : ''\n }\n\n if (seconds) {\n let studyTime = getStudyTime(seconds)\n let hour = studyTime.hour ? String(studyTime.hour).padStart(2, '0') + ':' : '',\n min = studyTime.min ? String(studyTime.min).padStart(2, '0') + ':' : '',\n sec = studyTime.sec ? String(studyTime.sec).padStart(2, '0') : ''\n\n result += hour + min + sec\n }\n\n return (\n <span className={'record'}>\n {\n result.length ? `学习到${result}` : null\n }\n </span>\n )\n}\n\n\nconst Bottom = React.memo(({item}) => {\n if (item.ago || item.seconds) {\n let date = new Date(item.ago * 1000)\n let time = isToday(date) ? format(date, 'HH时mm分') : format(date, 'MM月dd日')\n return (\n <div className=\"des\">\n <span className='time'>{time}</span>\n <Record record={item}/>\n </div>\n )\n }\n return (\n <button className='start-learn'>开始学习</button>\n )\n})\n\nclass MyCourses extends Component {\n\n list\n\n state = {\n isLoading: true\n }\n\n handleClick = (id, item) => {\n const {history} = this.props\n const {mode, course_id} = item\n if (mode && mode == 6) {\n history.push(`/python?id=${course_id}`)\n return\n }\n history.push(`/play/video?id=${id}`)\n }\n addCourseClick = () => {\n this.props.history.push('/classify')\n }\n\n componentDidMount() {\n this.props.switchTab(false)\n this.props.fetchCoursesListIfNeeded()\n }\n\n componentWillUnmount() {\n this.props.switchTab(true);\n }\n\n loadFunc = debounce(() => {\n if (this.props.courseList.length % 10 === 0) {\n this.props.fetchCoursesListIfNeeded()\n }\n }, 200)\n\n render() {\n let {courseList, user} = this.props\n\n return <Loading isLoading={this.props.isLoading}>\n {\n courseList && courseList.length !== 0\n ?\n <>\n <div className=\"my-course-uid\">\n {`加群请备注您的学号:${!user.hasError && this.props.user.data.uid}`}\n </div>\n <InfiniteScroll\n pageStart={0}\n hasMore={true}\n loadMore={this.loadFunc}\n useWindow={false}\n >\n <ul ref={el => this.list = el}>\n {\n courseList.map((item, index) => {\n\n const Info = (\n <div className=\"info\">\n <div className='title'>{item.course_title}</div>\n {\n !item.is_restricted && item.is_aist &&\n <div className='contact'>助教微信:{item.assist_weixin}</div>\n }\n {\n !item.is_restricted && !item.is_aist && item.contact_type == 1 && item.course_qq &&\n <div className='contact'>QQ群:{item.course_qq}</div>\n }\n {\n !item.is_restricted && !item.is_aist && item.contact_type == 2 && item.course_qq &&\n <div className='contact'>班主任微信:{item.course_qq}</div>\n }\n\n {\n item.is_aist && item.aist_schedule &&\n <div className=\"process-status\">\n <div className=\"process-wrapper\">\n <div className=\"process-bar\"\n style={{width: `${parseFloat(item.aist_schedule)}%`}}/>\n </div>\n <div className=\"process-text\">{item.aist_schedule}</div>\n </div>\n }\n <Bottom item={item}/>\n </div>\n )\n\n const status = (\n item.is_aist\n ? <span className='status'>返现</span>\n : item.course_expire\n ? <span className='course-expire'>{item.course_expire}</span>\n : null\n )\n return (\n <VList img={item.image_name}\n handleClick={this.handleClick}\n {...item}\n key={index}\n info={Info}\n status={status}\n item={item}\n id={item['v_course_id']}\n />\n )\n })\n }\n </ul>\n </InfiniteScroll>\n {\n courseList.length % 10 !== 0 ?\n <AddCourse addCourseClick={this.addCourseClick}/>\n : null\n }\n </>\n :\n <div className=\"empty\">\n <p><i className='iconfont iconfish'/></p>\n <p className='empty-prompt'>您还没有课程哦,赶快去选课吧~</p>\n <p>\n <Link className='select-course' to='/classify'>去选课</Link>\n </p>\n </div>\n }\n </Loading>\n\n }\n}\n\nexport default connect(\n state => ({\n courseList: state.myCourses.courseList,\n user: state.user,\n isLoading: state.myCourses.isLoading\n }),\n {\n fetchCoursesListIfNeeded,\n switchTab\n })(MyCourses)\n","import React from 'react'\nimport './course-base.scss'\n\nconst Course = (props) => {\n return (\n <li className={`course-base-item ${props.className}`} onClick={props.handleClick.bind(this, props.id)}>\n {props.top}\n <img src={props.img} alt=\"\"/>\n <p className=\"course-title\">{props.title}</p>\n {props.bottom}\n </li>\n );\n};\n\nexport default Course;\n\n","import React, { PureComponent } from 'react'\nimport { Tag } from '../../../common'\nimport Course from '@/common/course-base'\nimport { http } from '@/utils'\nimport { Toast } from \"antd-mobile\";\nimport classnames from 'classnames'\nimport { isEmpty } from 'lodash'\nimport InfiniteScroll from \"react-infinite-scroller\";\nimport {HashLoader} from 'react-spinners'\n\n\nimport './free-courses.scss'\n\nconst Bottom = (props) => (\n <div className='bottom'>\n <Tag className={props.className}>{props.text}</Tag>\n <span>{props.audience}人观看</span>\n </div>\n)\n\nclass FreeCourse extends PureComponent {\n\n page = 1\n num = 10\n state = {\n courses: [],\n live: [],\n page: 1,\n hasMore: false\n }\n\n componentDidMount() {\n this.getFreeCourses()\n .then(res => {\n let data = res.data\n if (data.code == 200) {\n this.setState({\n courses: data.data,\n hasMore: true\n })\n } else {\n Toast.info(data.msg)\n }\n })\n this.getFreeLive()\n .then(res => {\n let data = res.data\n if (data.code == 200) {\n this.setState({\n live: isEmpty(data.data) ? [] : data.data\n })\n } else {\n Toast.info(data.msg, 2, null, false)\n }\n })\n }\n\n handleClick = id => {\n this.props.history.push(`/play/video?id=${id}`)\n }\n\n getFreeCourses = () => {\n return http.get(`${API.home}/m/free_course/${this.page++}/${this.num}`)\n }\n\n getFreeLive = () => {\n return http.get(`${API.home}/m/live/free_list`)\n }\n\n toLive = live => {\n const {room_id, live_status} = live\n if (live_status) {\n window.location.assign(`http://www.julyedu.com/live/m_room/${room_id}`)\n } else {\n Toast.info('直播即将开始,敬请期待', 2, null, false)\n }\n }\n\n loadFunc = () => {\n if (this.state.hasMore) {\n this.setState({\n hasMore: this.state.courses.length % 10 === 0\n }, () => {\n this.getFreeCourses()\n .then(res => {\n let data = res.data\n if (data.code == 200) {\n Array.isArray(data.data) && this.setState({\n courses: this.state.courses.concat(data.data),\n hasMore: data.data.length % 10 === 0\n })\n } else {\n Toast.info(data.msg)\n }\n })\n })\n }\n }\n\n render() {\n return (\n <InfiniteScroll\n pageStart={0}\n loadMore={this.loadFunc}\n useWindow={false}\n className={'free-courses'}\n element={'ul'}\n hasMore={this.state.hasMore}\n threshold={250}\n >\n {\n this.state.live.map((item, index) => {\n const Bottom = (\n <div className=\"bottom\">\n <div className=\"animation-box\">\n {new Array(4).fill('a').map((item, index) => {\n return <i key={index} className={classnames('column', `column-${index + 1}`)}/>\n })}\n </div>\n <div className=\"time\">{`${item['live_start_time']}`}</div>\n </div>\n )\n\n const LiveStatus = (\n item['live_status'] == 0 ? <Tag className={'tag-soon top'}>即将开始</Tag> :\n <Tag className={'tag-playing top'}>正在直播</Tag>\n )\n return (\n <Course\n img={item['live_cover']}\n title={item['live_title']}\n top={LiveStatus}\n bottom={Bottom}\n key={item['live_id']}\n className={'live'}\n handleClick={this.toLive.bind(this, item)}\n id={index}\n />\n )\n })\n }\n {\n this.state.courses.map((item, index) => (\n <Course\n img={item.logo}\n title={item['video_course_name']}\n handleClick={this.handleClick}\n bottom={\n <Bottom audience={item['play_times']} className={'tag-category'} text={item.category}/>\n }\n id={item['v_course_id']}\n key={index}\n className={'course-item'}\n />\n ))\n }\n </InfiniteScroll>\n )\n }\n}\n\n\nexport default FreeCourse","import React, { Component } from 'react'\nimport './study.scss'\n\nimport { NavLink, Route, Switch, Redirect } from \"react-router-dom\"\nimport MyCourses from \"./myCourses\"\nimport FreeCourses from './freeCourses'\nimport WithTab from '@/HOCs/WithTab'\nimport WithFullSize from '@/HOCs/WithFullSize'\nimport { compose } from 'redux'\n\n\nclass Study extends Component {\n\n state = {\n position: {}\n }\n\n render() {\n const {match} = this.props;\n return (\n <section id='study'>\n <div className='tab'>\n <div>\n <NavLink to={`${match.url}/my-course`}\n replace\n activeClassName='active'\n >我的课程</NavLink>\n </div>\n <div>\n <NavLink to={`${match.url}/free-course`}\n replace\n activeClassName='active'\n >免费课程</NavLink>\n </div>\n </div>\n <div className=\"study-container\">\n <Switch>\n <Redirect exact from='/study' to='study/my-course'/>\n <Route path={`${this.props.match.path}/my-course`} component={MyCourses}/>\n <Route path={`${this.props.match.path}/free-course`} component={FreeCourses}/>\n </Switch>\n </div>\n </section>\n )\n }\n\n}\n\nexport default compose(\n WithFullSize,\n WithTab\n)(Study)","import React from 'react';\nimport './index.scss'\n\nconst VList = (props) => {\n return (\n <li className='v-list-base-item' onClick={props.handleClick.bind(this, props.id, props.item)}>\n <div className=\"content\">\n <div className=\"cover\">\n {props.status}\n <img src={props.img} alt=\"\"/>\n </div>\n {props.info}\n </div>\n {props.tab}\n </li>\n );\n};\n\nexport default VList;\n"],"sourceRoot":""}