Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.90 KB | None | 0 0
  1. import React, { Fragment } from 'react';
  2. import { connect } from 'react-redux';
  3. import PropTypes from 'prop-types';
  4. import axios from 'axios';
  5. import { PullToRefresh, Div, Panel } from '@vkontakte/vkui';
  6.  
  7.  
  8. import Icon16Like from '@vkontakte/icons/dist/16/like';
  9. import Icon16LikeOutline from '@vkontakte/icons/dist/16/like_outline';
  10.  
  11. import '../../scss/MainStyle.scss';
  12. import freeDelivery from '../../img/freeDelivery.png';
  13. import sale from '../../img/sale.png';
  14.  
  15. import RightMenu from '../utils/RightMenu';
  16. import Search from '../utils/Search';
  17. import { setSearch } from '../../actions/searchAction';
  18. import { api, apiGetBouquetListUrl, apiKey, apiSendFavoritesUrl } from '../../constants/api';
  19.  
  20. import { setFilter } from '../../actions/filterAction';
  21. import { checkLocalStorage } from '../../utils/checkLocalStorage';
  22. import ButtonIcon from '../utils/ButtonIcon';
  23. import PanelHeader from '../utils/PanelHeader';
  24.  
  25. class ResultFilter extends React.Component {
  26. constructor(props) {
  27. super(props);
  28. this.state = {
  29. fetching: false,
  30. bouquetFiltered: [],
  31. search: !!this.props.filter && this.props.filter.search,
  32. total: '',
  33. limit: 50
  34. };
  35. this.getFilteredList = this.getFilteredList.bind(this);
  36. this.onRefresh = this.onRefresh.bind(this);
  37. this.onChange = this.onChange.bind(this);
  38. this.onKeyDown = this.onKeyDown.bind(this);
  39. this.sendFavorites = this.sendFavorites.bind(this);
  40. this.moreBouquet = this.moreBouquet.bind(this);
  41. }
  42.  
  43. componentDidMount() {
  44. this.getFilteredList();
  45. const { loadSpinner } = this.props;
  46. loadSpinner(true);
  47. }
  48.  
  49.  
  50. moreBouquet() {
  51. const { limit } = this.state;
  52. let limitCopy = limit;
  53. console.log('limit', limitCopy);
  54. limitCopy = limit + limit;
  55. this.setState({
  56. limit: limitCopy
  57. });
  58.  
  59. this.getFilteredList(limitCopy);
  60.  
  61. }
  62.  
  63. onKeyDown(e) {
  64. if (e.key === 'Enter') {
  65. console.log('нажал enter');
  66. const filter = {
  67. sorting: 'relevation',
  68. price: '',
  69. category: '',
  70. size: '',
  71. color: '',
  72. sale: '',
  73. type: '',
  74. delivery: '',
  75. search: this.state.search
  76. };
  77. console.log('filter', filter);
  78. this.props.onSetFilter(filter);
  79. this.getFilteredList();
  80. }
  81. }
  82.  
  83. onRefresh() {
  84. this.setState({ fetching: true });
  85.  
  86. setTimeout(() => {
  87. this.setState({
  88. fetching: false
  89. });
  90. }, this.getFilteredList);
  91. }
  92.  
  93. getFilteredList(limit = 50) {
  94. const { filter, loadSpinner } = this.props;
  95. console.log('filter props', filter);
  96. let copySale = '';
  97. if (filter.sale !== undefined) {
  98. if (filter.sale === true || filter.sale === false) {
  99. copySale = filter.sale === true ? 1 : 0;
  100. }
  101. }
  102.  
  103. let copyDelivery = '';
  104. if (filter.delivery !== undefined) {
  105. if (filter.delivery === true || filter.delivery === false) {
  106. copyDelivery = filter.sale === true ? 1 : 0;
  107. }
  108. }
  109.  
  110. const sendJSON = {
  111. apiKey,
  112. idCity: localStorage.getItem('codeCity'),
  113. sorting: filter.sorting !== undefined ? filter.sorting : '',
  114. min: filter.price !== undefined ? filter.price.min : '',
  115. max: filter.price !== undefined ? filter.price.max : '',
  116. category: filter.category !== undefined ? filter.category : '',
  117. size: filter.size !== undefined ? filter.size : '',
  118. color: filter.color !== undefined ? filter.color : '',
  119. sale: filter.sale !== undefined ? copySale : '',
  120. type: filter.type !== undefined ? filter.type : '',
  121. free: filter.delivery !== undefined ? copyDelivery : '',
  122. limit: limit,
  123. start: 0
  124. };
  125. console.log('sendJSON', sendJSON);
  126. console.log('filter for SendJSON', filter);
  127.  
  128. if (!!filter.search) {
  129. sendJSON.search = filter.search;
  130. }
  131.  
  132. if (checkLocalStorage('userId') && localStorage.getItem('userId'))
  133. sendJSON.userId = localStorage.getItem('userId');
  134.  
  135. axios
  136. .get(`${api}${apiGetBouquetListUrl}`, {
  137. params: sendJSON
  138. })
  139. .then(response => {
  140. console.log('response.data.bouquetList 1111', response);
  141. this.setState({
  142. bouquetFiltered: response.data.bouquetList,
  143. total: response.data.total
  144. });
  145. loadSpinner(false);
  146. })
  147. .catch(error => {
  148. console.log('error', error);
  149. loadSpinner(false);
  150. });
  151.  
  152.  
  153. //document.getElementById('hmtLeft').checked = true;
  154. }
  155.  
  156. sendFavorites(idBouquet, indexI) {
  157. const { bouquetFiltered } = this.state;
  158. axios.post(`${api}${apiSendFavoritesUrl}?apiKey=${apiKey}`, {
  159. userId: localStorage.getItem('userId'),
  160. token: localStorage.getItem('token'),
  161. idCity: localStorage.getItem('codeCity'),
  162. idBouquet
  163. })
  164. .then(response => {
  165. console.log('response', response);
  166. })
  167. .catch(error => {
  168. console.log('error', error);
  169. });
  170. let copyBouquet = JSON.parse(JSON.stringify(bouquetFiltered));
  171. copyBouquet[indexI].favorites = +!bouquetFiltered[indexI].favorites;
  172. this.setState({
  173. bouquetFiltered: copyBouquet
  174. });
  175.  
  176. }
  177.  
  178. onChange(e) {
  179. const name = e.target.name;
  180. const value = e.target.value;
  181.  
  182. if (name === 'search') {
  183. setTimeout(() => {
  184. this.getFilteredList();
  185. }, 1500);
  186.  
  187. setSearch(value);
  188.  
  189. this.setState({
  190. [name]: value
  191. });
  192. } else {
  193. this.setState({
  194. [name]: value
  195. });
  196. }
  197. }
  198.  
  199.  
  200. render() {
  201. const { id, go, goAuth } = this.props;
  202. const { fetching, bouquetFiltered, total, search } = this.state;
  203.  
  204. return (
  205. <Panel id={id}>
  206. <PanelHeader
  207. big
  208. left={
  209. <Fragment>
  210. <ButtonIcon type="back" onClick={go} dataStory="HomePage"/>
  211. <RightMenu go={go} goAuth={goAuth} getFilteredList={this.getFilteredList}/>
  212. </Fragment>
  213. }>
  214. <Search
  215. onKeyDown={this.onKeyDown}
  216. name='search' value={search}
  217. onChange={this.onChange}
  218. placeholder="Найти букеты..."
  219. />
  220. </PanelHeader>
  221.  
  222. <div>
  223. <div className="contentBlock">
  224.  
  225. <Div className='pt-0'>
  226. <span
  227. className='titleCategoryBouquet d-flex justify-content-center mt-1'>
  228. <b>Результаты поиска ({total})</b>
  229. </span>
  230.  
  231. <div className="row">
  232. {
  233. bouquetFiltered.map((valueI, indexI) => (
  234. <Fragment key={indexI}>
  235. <Div
  236. className="card w-100 rounded mt-0 mb-3 ml-3 mr-3 p-0">
  237. <div className="card-body p-0 row">
  238. <div className='col-6 position-relative'>
  239. <div className="blockImg photoWrap">
  240. <div className="overlay"/>
  241. <img onClick={() => go('InfoProduct', {
  242. productId: valueI.id,
  243. urlBack: 'ResultFilter'
  244. })}
  245. className="imgBouquetList"
  246. src={valueI.img}
  247. alt='Букет'>
  248. </img>
  249. <img
  250. className=" imgFreeDelivery d-flex justify-content-end"
  251. src={freeDelivery}
  252. alt='Бесплатная доставка'>
  253. </img>
  254.  
  255. {valueI.new_price !== valueI.price &&
  256. <img className='imgSale' src={sale}
  257. alt='Скидка'/>}
  258. </div>
  259. </div>
  260. <div className='col-6 pl-0'>
  261. <div onClick={() => go('InfoProduct', {
  262. productId: valueI.id,
  263. urlBack: 'ResultFilter'
  264. })}
  265. className='blockTitleBouquet mt-2'>
  266. <span
  267. className='titleListBouquet mt-2'>{valueI.title.length > 25 ?
  268. valueI.title.slice(0, 25).replace(/&quot;/g, '"') + '...' : valueI.title.replace(/&quot;/g, '"')}</span>
  269. <br/>
  270. <span className='rating'>{valueI.rating}
  271. <i className="material-icons ratingStar">
  272. star_rate
  273. </i>
  274. </span>
  275. </div>
  276.  
  277.  
  278. <div className='d-flex align-items-center mt-3'>
  279. <span
  280. className='newPrice font-weight-bold'>{Math.round(valueI.new_price).toLocaleString()}₽</span>
  281. {valueI.new_price !== valueI.price && <div
  282. className='oldPrice ml-2 font-weight-bold'>{Math.round(valueI.price).toLocaleString()}₽</div>}
  283. </div>
  284.  
  285.  
  286. {checkLocalStorage('token') && checkLocalStorage('userId') &&
  287. <div onClick={() => this.sendFavorites(valueI.id, indexI)}
  288. className='w-100 footerCard footerScroll d-flex'>
  289. <div
  290. className='roundLike mt-2 d-flex justify-content-center'>
  291. {valueI.favorites === 0 ?
  292. <Icon16LikeOutline className='styleLike'/> :
  293. <Icon16Like className='styleActiveLike'/>
  294. }
  295. </div>
  296. </div>
  297. }
  298.  
  299. </div>
  300. </div>
  301. </Div>
  302. {(indexI === this.state.limit - 1) &&
  303. <div className='w-100 ml-3 mr-3'>
  304. <div
  305. className='col-12 d-flex justify-content-center w-100'>
  306. <button onClick={this.moreBouquet}
  307. className='showMoreBouquet p-2'>
  308. Смотреть ещё
  309. </button>
  310. </div>
  311. <div className='divLine mb-3'/>
  312. </div>
  313. }
  314.  
  315. </Fragment>
  316. ))
  317. }
  318. </div>
  319.  
  320.  
  321. </Div>
  322. </div>
  323.  
  324. </div>
  325. </Panel>
  326.  
  327.  
  328. );
  329. }
  330. }
  331.  
  332. ResultFilter.propTypes = {
  333. id: PropTypes.string.isRequired,
  334. go: PropTypes.func.isRequired
  335. };
  336.  
  337. export default (connect(
  338. state => ({
  339. search: state.main.search,
  340. filter: state.main.filter
  341. }),
  342. dispatch => ({
  343. onSetSearch: (value) => {
  344. dispatch(setSearch(value));
  345. },
  346. onSetFilter: (value) => {
  347. dispatch(setFilter(value));
  348. }
  349. })
  350. )(ResultFilter));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement