{"version":3,"sources":["components/search/recommendation/index.js","components/search/search-result.js","components/search/searchHead.js"],"names":["Recommendation","connect","state","courses","toCourseDetail","id","_this$props","_this","props","dispatch","history","push","concat","_this2","this","http","get","API","then","res","data","errno","setState","info","toast_default","a","msg","_this3","react_default","createElement","className","length","map","item","Bottom","common","key","img","title","bottom","toDetail","Component","withRouter","ForwardRefSearchHead","React","forwardRef","ref","searchHead","Object","assign","forwardedRef","_ref","price1","price0","SearchResult","prevScrollY","createRef","swipeUp","swipeDown","courseList","value","decodeURIComponent","getParam","searchHistory","JSON","parse","localStorage","getItem","fixedHeader","searchHeadStyle","top","swipeDirection","isHide","basicTop","getCourses","word","course","handleClick","handleSearch","handleChange","handleScroll","throttle","y","window","scrollY","h","current","offsetTop","offsetHeight","document","addEventListener","removeEventListener","_this$state","style","Info","course_title","simpledescription","search_result_Bottom","status","VList","image_name","course_id","search_recommendation","PureComponent","SearchHead","isFocus","returnPage","go","search","storeKeyword","_this$props$searchHis","some","setItem","stringify","changeFontColor","refs","focus","cls","classnames","submit-btn--active","react__WEBPACK_IMPORTED_MODULE_7___default","onClick","antd_mobile_lib_search_bar__WEBPACK_IMPORTED_MODULE_1___default","showCancelButton","cancelText","onChange","placeholder","onFocus","onBlur","onSubmit"],"mappings":"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","file":"mrstatic/js/SearchResult.0a6e5ca4.chunk.js","sourcesContent":["import React, { Component } from \"react\";\nimport {connect} from 'react-redux';\nimport './recommendation.scss'\nimport { Course } from \"@/common\";\nimport { http } from \"@/utils\";\nimport { Toast } from 'antd-mobile'\nimport {withRouter} from 'react-router-dom'\nimport {getCourses} from './../../detail/actions';\n\n@connect()\nclass Recommendation extends Component {\n\n state = {\n courses: []\n }\n\n componentDidMount() {\n http.get(`${API['search-api']}/search_hot_word`)\n .then(res => {\n if (res.data.errno === 0) {\n this.setState({\n courses: res.data.data.info.courses\n })\n } else {\n Toast.info(res.data.msg)\n }\n\n })\n\n }\n\n // handleClick = (id) => {\n // this.props.history.push(`/detail?id=${id}`)\n // }\n\n toCourseDetail = (id) => {\n const { dispatch, history } = this.props;\n // dispatch(getCourses(id, () => {\n history.push(`/detail?id=${id}`)\n // }));\n }\n\n render() {\n const {courses} = this.state\n return (\n <div className=\"recommendation\">\n <div className=\"title\">推荐课程</div>\n <div className=\"courses\">\n {\n courses.length > 0 &&\n courses.map((item) => {\n const Bottom = (\n <div className='bottom'>\n <span className='price'>{item['price1']}</span>\n <span className='old-price'>{item['price0']}</span>\n </div>\n )\n return (\n <Course\n className={'text-overflow-2'}\n key={item['course_id']}\n id={item['course_id']}\n img={item['image_name']}\n title={item['course_title']}\n bottom={Bottom}\n toDetail={this.toCourseDetail}\n />\n )\n })\n }\n\n </div>\n </div>\n )\n }\n}\n\nexport default withRouter(Recommendation)\n","import React, { PureComponent } from 'react';\nimport SearchHeader from './searchHead'\nimport VList from '@/common/VList'\nimport { http, getParam } from '@/utils'\nimport './search-result.scss'\nimport Recommendation from './recommendation'\nimport throttle from 'lodash/throttle'\n\n\nconst ForwardRefSearchHead = React.forwardRef((props, ref) => {\n return <SearchHeader {...props} forwardedRef={ref}/>\n})\n\nconst Bottom = ({item}) => {\n return (\n <div className='bottom'>\n <span className='price'>¥{item.price1}</span>\n <span className='stale-price'>¥{item.price0}</span>\n </div>\n )\n}\n\nclass SearchResult extends PureComponent {\n prevScrollY = 0\n searchHead = React.createRef()\n swipeUp = 'up'\n swipeDown = 'down'\n\n state = {\n courseList: [],\n value: decodeURIComponent(getParam('word')) || '',\n searchHistory: JSON.parse(localStorage.getItem('searchHistory')) || [],\n fixedHeader: false,\n searchHeadStyle: {top: 0},\n swipeDirection: this.swipeUp,\n isHide: false,\n basicTop: 0\n }\n\n componentDidMount() {\n this.getCourses(getParam('word'))\n document.addEventListener('scroll', this.handleScroll)\n }\n\n componentWillUnmount() {\n document.removeEventListener('scroll', this.handleScroll)\n }\n\n\n getCourses = (word) => {\n http.get(`${API['search-api']}/search/${word}?type=course&page=1`)\n .then(res => {\n const data = res.data\n\n if (data.errno === 0) {\n this.setState({\n courseList: data.data.info['search_data'].course\n });\n }\n })\n }\n\n handleClick = id => {\n this.props.history.push(`/detail?id=${id}`)\n }\n\n handleSearch = () => {\n this.state.value && this.getCourses(this.state.value)\n }\n\n handleChange = value => {\n this.setState({value})\n }\n\n toCourseDetail = (id) => {\n const {history} = this.props;\n history.push(`/detail?id=${id}`)\n }\n\n handleScroll = throttle(() => {\n let y = window.scrollY < 0? 0 : window.scrollY, \n headY = this.searchHead.current.offsetTop,\n h = this.searchHead.current.offsetHeight;\n if(y > this.prevScrollY) {\n this.setState({\n searchHeadStyle: {\n top : `${-h}px`\n }\n });\n }\n if(y < this.prevScrollY) {\n this.setState({\n searchHeadStyle: {\n top: 0\n }\n });\n }\n // if (y < this.prevScrollY) {\n // if (this.state.swipeDirection === this.swipeDown) {\n // y <= headY && this.state.searchHeadStyle.position !== 'fixed' && \n // this.setState({\n // searchHeadStyle: {\n // top: `0`,\n // position: 'fixed'\n // }\n // })\n // } else {\n // this.setState({\n // swipeDirection: this.swipeDown\n // }, () => {\n // if (this.state.swipeDirection === this.swipeDown) {\n // let h = y > document.querySelector('body').offsetHeight? document.querySelector('body').offsetHeight: y;\n // let h1 = this.searchHead.current.offsetHeight\n // this.setState({\n // searchHeadStyle: {\n // // top: `${h > headY ? h - h1 : h}px`\n // top: `${y}px`\n // }\n // })\n \n \n // }\n // })\n // }\n // } else {\n // this.state.swipeDirection !== this.swipeUp &&\n // this.setState({\n // swipeDirection: this.swipeUp,\n // searchHeadStyle: {\n // position: 'absolute',\n // top: `${y}px`\n // }\n // })\n // }\n this.prevScrollY = y;\n }, 0)\n\n render() {\n const { courseList, isHide } = this.state;\n\n return (\n <div\n className={'search-result'}>\n <ForwardRefSearchHead\n handleSearch={this.handleSearch}\n value={this.state.value}\n handleChange={this.handleChange}\n searchHistory={this.state.searchHistory}\n style={this.state.searchHeadStyle}\n ref={this.searchHead}\n isHide={isHide}\n />\n {\n\n courseList && courseList.length > 0 ?\n <ul>\n {\n courseList.map(item => {\n const Info = (\n <div className=\"info\">\n <p className='title'>{item.course_title}</p>\n <p className='des'>{item.simpledescription}</p>\n <Bottom\n item={item}\n />\n </div>\n )\n const status = (\n (item['bargain_num'] || item['groupon_num']) ?\n <div\n className='status'>\n {\n item['bargain_num'] === 0 ? `砍价减${item['groupon_num']}元` : `拼团减${item['bargain_num']}元`\n }\n </div>\n : null\n )\n return (\n <VList\n img={item.image_name}\n toDetail={this.toCourseDetail}\n key={item.course_id}\n info={Info}\n id={item['course_id']}\n status={status}\n />\n )\n })\n }\n </ul>\n : <div className=\"empty\">\n 抱歉!没有搜到相关内容\n </div>\n }\n <Recommendation/>\n\n </div>\n );\n }\n}\n\n\nexport default SearchResult;","import React, { PureComponent } from 'react'\nimport { SearchBar } from 'antd-mobile'\nimport { withRouter } from 'react-router-dom'\nimport classnames from 'classnames';\n\nimport './search_header.scss'\n\nclass SearchHead extends PureComponent {\n \n state = {\n isFocus: false\n }\n\n returnPage = () => {\n this.props.history.go(-1)\n }\n\n componentDidMount() {\n this.refs.search.focus();\n }\n\n search = () => {\n this.storeKeyword()\n this.props.handleSearch()\n }\n\n storeKeyword = () => {\n const {searchHistory = [], value} = this.props;\n const data = searchHistory.some(item =>item === value)? searchHistory : searchHistory.concat([value]);\n // value && localStorage.setItem('searchHistory', JSON.stringify([...searchHistory, value]))\n localStorage.setItem('searchHistory', JSON.stringify(data));\n }\n\n changeFontColor = (isFocus) => {\n this.setState({\n isFocus\n });\n }\n\n render() {\n const { isFocus } = this.state;\n const cls = classnames('submit-btn', {'submit-btn--active': isFocus})\n return (\n \n <div className=\"search-head\" style={this.props.style} ref={this.props.forwardedRef}>\n\n <div className=\"left\" onClick={this.returnPage}>\n <i className=\"iconfont iconiconfront-68\"/>\n </div>\n\n <div className=\"center\">\n <SearchBar\n value={this.props.value}\n showCancelButton\n cancelText={\" \"}\n ref=\"search\"\n focus={true}\n onChange={this.props.handleChange}\n placeholder=\"搜索课程\"\n onFocus={() => this.changeFontColor(true)}\n onBlur={() => this.changeFontColor(false)}\n onSubmit={ this.search }\n />\n </div>\n <div className=\"right right-btn\" onClick={this.search}>\n <div className={cls}>搜索</div>\n </div>\n </div>\n\n )\n }\n}\n\nexport default withRouter(SearchHead)"],"sourceRoot":""}