Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.30 KB | None | 0 0
  1. import React, { PureComponent, Fragment } from 'react'
  2. import Select from 'react-select';
  3. import PropTypes from 'prop-types';
  4. import Button from '../../../components/Layout/Button';
  5. import { countries, selectStyles, bisChannels, eventsDummy, riskCategoriesDummy, betTypesDummy, transformDataForSelect } from './betScrollerUtils';
  6.  
  7. class BetScrollerFilter extends PureComponent {
  8. state = {
  9. selectEntities: {
  10. businessUnits: [],
  11. businessChannels: [],
  12. events: [],
  13. sports: [],
  14. riskCategories: [],
  15. betTypes: []
  16. }
  17. }
  18.  
  19. componentDidMount() {
  20. this.mapSelectValues();
  21. }
  22.  
  23. componentDidUpdate(prevProps) {
  24. if (prevProps.selectedBetScroller !== this.props.selectedBetScroller) {
  25. this.mapSelectValues()
  26. }
  27. }
  28.  
  29. mapSelectValues = () => {
  30. const { betScroller } = this.props;
  31. const nonSelecValues = ['id', 'name', 'betStakeMax', 'betStakeMin', 'takeoutMin', 'createdUserId', 'changedUserId'];
  32. const betScrollerCopy = Object.keys(betScroller).reduce((object, key) => {
  33. if (!nonSelecValues.includes(key)) {
  34. object[key] = transformDataForSelect(betScroller[key], key);
  35. }
  36. return object;
  37. }, {});
  38.  
  39. this.setState({ selectEntities: betScrollerCopy });
  40. }
  41.  
  42. deleteBetScroller = () => {
  43. this.props.deleteBetScroller(this.props.betScroller.id);
  44. this.resetSelectFields();
  45. this.props.setBetScrollerFilterObj(this.props.myBetScrollersSize())
  46. }
  47.  
  48. handleInputChange = (event) => {
  49. const { value, name } = event.target;
  50. this.props.updateFilter(value, name);
  51. }
  52.  
  53. bsNameExist = (betScrollers) => {
  54. const bsArr = betScrollers.map(bs => bs.name);
  55. const isDuplicate = bsArr.some((item, idx) => bsArr.indexOf(item) !== idx);
  56. return isDuplicate;
  57. }
  58.  
  59. createBetScrollerHandler = (e) => {
  60. e.preventDefault();
  61. const { createBetScroller, updateBScroller, betScroller, betScrollers, addNotificationMessage } = this.props;
  62. let { name, betStakeMin, betStakeMax, takeoutMin } = {
  63. ...betScroller,
  64. betStakeMin: betScroller.betStakeMin
  65. ? Number(betScroller.betStakeMin) * 100
  66. : null,
  67. betStakeMax: betScroller.betStakeMax
  68. ? Number(betScroller.betStakeMax) * 100
  69. : null,
  70. takeoutMin: betScroller.takeoutMin
  71. ? Number(betScroller.takeoutMin) * 100
  72. : null
  73. };
  74.  
  75. if (!name) {
  76. addNotificationMessage('You have to add a name!', 'warning', 'Warning');
  77. return;
  78. }
  79. if(!betStakeMin || !betStakeMax){
  80. addNotificationMessage('You have to add a Min Bet and Max Bet!', 'warning', 'Warning');
  81. return;
  82. }
  83. if(betStakeMin >= betStakeMax){
  84. addNotificationMessage('Bet stake max must be bigger then bet stake min!', 'warning', 'Warning');
  85. return;
  86. }
  87. if(betStakeMin <=0 || betStakeMax <= 1){
  88. addNotificationMessage('Bet Stake Min/Max must be bigger than zero!', 'warning', 'Warning');
  89. return;
  90. }
  91. if(takeoutMin && takeoutMin <= 1){
  92. addNotificationMessage('Take out must be bigger than zero!', 'warning', 'Warning');
  93. return;
  94. }
  95. if(this.bsNameExist(betScrollers)){
  96. addNotificationMessage('The Bet Scroller allready exist!', 'warning', 'Warning');
  97. return;
  98. }
  99.  
  100. if (this.props.wsConnectionStatus) {
  101. if (betScroller.hasOwnProperty('createdUserId')) {
  102. updateBScroller(betScroller, true);
  103. } else {
  104. // console.log(betScroller);
  105. createBetScroller(betScroller);
  106. }
  107. } else {
  108. alert(
  109. 'Web socket connection is not initialized yet. Please try again later.'
  110. );
  111. }
  112. }
  113.  
  114. selectDataChange = (type, dataType, value, { action, removedValue }) => {
  115. let entityToSave = [...this.props.betScroller[type]],
  116. selectEntitiesUpdate = { ...this.state.selectEntities },
  117. selectedEntitiesUpdate = [...selectEntitiesUpdate[type]];
  118.  
  119. switch (action) {
  120. case 'select-option':
  121. entityToSave = [...entityToSave, dataType === 'array' ? value[value.length - 1].value :
  122. { 'id': value[value.length - 1].id, 'code': value[value.length - 1].code }];
  123. selectedEntitiesUpdate = [...selectedEntitiesUpdate, value[value.length - 1]];
  124. entityToSave = [...new Set(entityToSave)];
  125. break;
  126. case 'remove-value':
  127. entityToSave = entityToSave.filter(entity => entity !== removedValue.value);
  128. selectedEntitiesUpdate = selectedEntitiesUpdate.filter(entity => entity.value !== removedValue.value);
  129. break;
  130. case 'pop-value':
  131. entityToSave = entityToSave.filter(entity => dataType === 'array' ? entity : entity.code !== removedValue.value);
  132. selectedEntitiesUpdate = selectedEntitiesUpdate.filter(entity => entity.value !== removedValue.value);
  133. break;
  134. case 'clear':
  135. selectedEntitiesUpdate = [];
  136. entityToSave = [];
  137. break;
  138. default:
  139. break;
  140. }
  141.  
  142. selectEntitiesUpdate[type] = selectedEntitiesUpdate;
  143. this.props.updateFilter(entityToSave, type);
  144. this.setState({ selectEntities: selectEntitiesUpdate });
  145. }
  146.  
  147. //locally resets the data user for viewing react-select fields and calls the parent function which resets the data itself.
  148. resetSelectFields = () => {
  149. const selectEntitiesEmpty = {
  150. businessUnits: [],
  151. businessChannels: [],
  152. events: [],
  153. sports: [],
  154. riskCategories: [],
  155. betTypes: []
  156. };
  157. this.setState({ selectEntities: selectEntitiesEmpty }, () => {
  158. this.props.resetFilter();
  159. });
  160. }
  161.  
  162. btnCss = (btnClassName) => {
  163. const { betScroller, ownerId } = this.props;
  164. return (
  165. betScroller.createdUserId !== ownerId &&
  166. betScroller.hasOwnProperty('createdUserId') ?
  167. `${btnClassName} efb-btn disabled` :
  168. `${btnClassName}`
  169. );
  170. }
  171.  
  172. render() {
  173. const { betScroller, sportOptions } = this.props;
  174. const { selectEntities } = this.state;
  175.  
  176. return (
  177. <div className="tab-content" id="betScrollerControllerContent">
  178. <div className="tab-pane card-body fade show active" id="betscroller-default" role="tabpanel" aria-labelledby="betscroller-default-tab">
  179. <div className="card card-accordion">
  180. <div id="betscroller-default-data" className="collapse show" aria-labelledby="betscroller-default-data-header">
  181. <div className="card-body">
  182. <form className="efb-form efb-form-bet-scroller-editor">
  183. <div className="form-row">
  184. <div className="form-label-group col">
  185. <input name="name"
  186. placeholder="BetScroller Name"
  187. type="text"
  188. required="required"
  189. className="form-control efb-input"
  190. value={betScroller.name}
  191. onChange={this.handleInputChange}
  192. id="betscroller-name"
  193. />
  194. <label htmlFor="betscroller-name">BetScroller Name</label>
  195. </div>
  196. </div>
  197. <hr />
  198. <div className="form-row">
  199. <div className="form-label-group col-lg-6">
  200. <Select
  201. value={selectEntities['businessUnits']}
  202. onChange={(e, actionMeta) => this.selectDataChange('businessUnits', 'array', e, actionMeta)}
  203. options={countries}
  204. styles={selectStyles}
  205. placeholder={'Select business units...'}
  206. isMulti={true}
  207. />
  208. </div>
  209. <div className="form-label-group col-lg-6">
  210. <Select
  211. value={selectEntities['businessChannels']}
  212. onChange={(e, actionMeta) => this.selectDataChange('businessChannels', 'array', e, actionMeta)}
  213. options={bisChannels}
  214. styles={selectStyles}
  215. placeholder={'Select business channels...'}
  216. isMulti={true}
  217. />
  218. </div>
  219. </div>
  220. <div className="form-row">
  221. <div className="form-label-group col-lg-6">
  222. <Select
  223. value={selectEntities['events']}
  224. onChange={(e, actionMeta) => this.selectDataChange('events', 'arrayOfObjects', e, actionMeta)}
  225. options={eventsDummy}
  226. styles={selectStyles}
  227. placeholder={'Select tournaments...'}
  228. isMulti={true}
  229. />
  230. </div>
  231. <div className="form-label-group col-lg-6">
  232. <Select
  233. value={selectEntities['sports']}
  234. onChange={(e, actionMeta) => this.selectDataChange('sports', 'arrayOfObjects', e, actionMeta)}
  235. options={sportOptions}
  236. styles={selectStyles}
  237. placeholder={'Select sports...'}
  238. isMulti={true}
  239. />
  240. </div>
  241. </div>
  242. <div className="form-row">
  243. <div className="form-label-group col-lg">
  244. <Select
  245. value={selectEntities['riskCategories']}
  246. onChange={(e, actionMeta) => this.selectDataChange('riskCategories', 'array', e, actionMeta)}
  247. options={riskCategoriesDummy}
  248. styles={selectStyles}
  249. placeholder={'Select risk categories...'}
  250. isMulti={true}
  251. />
  252. </div>
  253. <div className="form-label-group col-lg">
  254. <Select
  255. value={selectEntities['betTypes']}
  256. onChange={(e, actionMeta) => this.selectDataChange('betTypes', 'array', e, actionMeta)}
  257. options={betTypesDummy}
  258. styles={selectStyles}
  259. placeholder={'Select bet types...'}
  260. isMulti={true}
  261. />
  262. </div>
  263. </div>
  264. <hr />
  265. <div className="form-row">
  266. <div className="col">
  267. <h6>Bet Stake</h6>
  268. <div className="form-row">
  269. <div className="form-label-group col-md">
  270. <div className="input-group">
  271. <input type="number"
  272. name="betStakeMin"
  273. className="form-control efb-input"
  274. placeholder="Min"
  275. value={betScroller.betStakeMin ? betScroller.betStakeMin : ''}
  276. onChange={this.handleInputChange}
  277. required="required"
  278. id="filter-bstake-min"
  279. min="0"
  280. />
  281. <label htmlFor="filter-bstake-min">Min</label>
  282. <div className="input-group-append">
  283. <span className="input-group-text" id="basic-addon2">&euro;</span>
  284. </div>
  285. </div>
  286. </div>
  287. <div className="form-label-group col-md">
  288. <div className="input-group">
  289. <input type="number"
  290. name='betStakeMax'
  291. className="form-control efb-input"
  292. placeholder="Max"
  293. value={betScroller.betStakeMax ? betScroller.betStakeMax : ''}
  294. onChange={this.handleInputChange}
  295. required="required"
  296. id="filter-bstake-max"
  297. min="0"
  298. />
  299. <label htmlFor="filter-bstake-max">Max</label>
  300. <div className="input-group-append">
  301. <span className="input-group-text" id="basic-addon2">&euro;</span>
  302. </div>
  303. </div>
  304. </div>
  305. </div>
  306. </div>
  307. <div className="col">
  308. <h6>Takeout</h6>
  309. <div className="form-label-group">
  310. <div className="input-group">
  311. <input type="number"
  312. name='takeoutMin'
  313. className="form-control efb-input"
  314. placeholder="More than"
  315. value={betScroller.takeoutMin ? betScroller.takeoutMin : ''}
  316. onChange={this.handleInputChange}
  317. id="filter-takeout"
  318. min="0"
  319. />
  320. <label htmlFor="filter-takeout">More than</label>
  321. <div className="input-group-append">
  322. <span className="input-group-text" id="basic-addon2">&euro;</span>
  323. </div>
  324. </div>
  325. </div>
  326. </div>
  327. </div>
  328. <hr />
  329. <div className="form-group d-flex flex-row justify-content-end">
  330. <Fragment>
  331. <Button
  332. onClick={this.resetSelectFields}
  333. name="cancel"
  334. cssClass={this.btnCss('efb-btn__light')}
  335. disabled={this.btnCss('efb-btn__light').includes('disabled')}
  336. >
  337. Clear All
  338. </Button>
  339. <Button
  340. cssClass={this.btnCss('btn btn-danger')}
  341. disabled={this.btnCss('btn btn-danger').includes('disabled')}
  342. onClick={this.deleteBetScroller}>
  343. Delete BetScroller
  344. </Button>
  345. <Button
  346. onClick={this.createBetScrollerHandler}
  347. cssClass={this.btnCss('efb-btn__main')}
  348. disabled={this.btnCss('efb-btn__main').includes('disabled')}
  349. >
  350. Save BetScroller
  351. </Button>
  352. </Fragment>
  353. </div>
  354. </form>
  355. </div>
  356. </div>
  357. </div>
  358. </div>
  359. </div>
  360. )
  361. }
  362. }
  363.  
  364. BetScrollerFilter.propTypes = {
  365. betScroller: PropTypes.object,
  366. betScrollers: PropTypes.array,
  367. updateFilter: PropTypes.func,
  368. createBetScroller: PropTypes.func,
  369. deleteBetScroller: PropTypes.func,
  370. wsConnectionStatus: PropTypes.bool,
  371. sportOptions: PropTypes.array,
  372. bUnitsProps: PropTypes.array,
  373. resetFilter: PropTypes.func,
  374. updatedBSScroller: PropTypes.func,
  375. addNotificationMessage: PropTypes.func
  376. }
  377.  
  378. export default BetScrollerFilter;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement