reducers.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545
  1. import * as types from '../actionsTypes/actionsTypes'
  2. import {postNewDoctorForm,postNewServiceForm} from '../utils/formFields'
  3. const defaultState = {
  4. user:localStorage.getItem('id') ? localStorage.getItem('id') : null,
  5. doctors:[],
  6. services:[],
  7. servicesArray:{
  8. 'Хирургия':[],
  9. 'Детская стоматология':[],
  10. 'Ортодонтия':[],
  11. 'Терапия':[],
  12. 'Имплантология': [],
  13. 'Эндодонтия':[]
  14. },
  15. orders:[],
  16. users:[],
  17. reviews: [],
  18. postNewShedule:{
  19. data:null,
  20. doctor:null
  21. },
  22. postNewDoctor:postNewDoctorForm,
  23. postNewService:postNewServiceForm,
  24. changeDoctorId:null,
  25. changeServiceId:null,
  26. appointment:{
  27. shedule:null,
  28. time:null,
  29. doctor:null,
  30. spec:null,
  31. comment:''
  32. },
  33. timeArray:[],
  34. isFetching:false,
  35. error: null,
  36. };
  37. // -----------------------------------------------------------------------------------------------------------------
  38. export const appReducer = (state = defaultState,action) => {
  39. switch (action.type) {
  40. // -----------------------------------------------------------------------------------------------------------------
  41. case types.CHANGE_INPUT_VALUE_DOCTOR_FORM : {
  42. return {
  43. ...state,
  44. postNewDoctor: state.postNewDoctor.map(el => el.id === +action.payload.target.id ? {
  45. ...el,
  46. value:el.name === 'speciality' ? JSON.parse(action.payload.target.value) : action.payload.target.value
  47. } : el)
  48. };
  49. }
  50. // -----------------------------------------------------------------------------------------------------------------
  51. case types.CHANGE_INPUT_VALUE_SERVICE_FORM : {
  52. return {
  53. ...state,
  54. postNewService: state.postNewService.map(el => el.id === +action.payload.target.id ? {
  55. ...el,
  56. value:action.payload.target.value
  57. } : el)
  58. };
  59. }
  60. // -----------------------------------------------------------------------------------------------------------------
  61. case types.CHANGE_SELECTED_DOCTOR_ID : {
  62. let doctor = state.doctors.find(el => el.name === action.payload)
  63. let result = Object.keys(doctor).map(key => {
  64. return [key, doctor[key]];
  65. });
  66. return {
  67. ...state,
  68. changeDoctorId: state.doctors.find(el => el.name === action.payload)._id,
  69. postNewDoctor:state.postNewDoctor.map(el => result.find(item => item[0] === el.name) ? {
  70. ...el,
  71. value:result.find(item => item[0] === el.name)[1]
  72. } : el)
  73. };
  74. }
  75. // -----------------------------------------------------------------------------------------------------------------
  76. case types.CHANGE_SELECTED_SERVICE_ID : {
  77. let service = state.services.find(el => el.name === action.payload)
  78. let result = Object.keys(service).map(key => {
  79. return [key, service[key]];
  80. });
  81. return {
  82. ...state,
  83. changeServiceId: service._id,
  84. postNewService: state.postNewService.map(el => result.find(item => item[0] === el.name) ? {
  85. ...el,
  86. value:result.find(item => item[0] === el.name)[1]
  87. } : el)
  88. };
  89. }
  90. // -----------------------------------------------------------------------------------------------------------------
  91. case types.CHANGE_APPOINTMENT_SHEDULE : {
  92. let timeArray =[];
  93. let doctor = state.doctors.find(el => el._id === state.appointment.doctor);
  94. let shedule = doctor.shedule.find(el => el.data === action.payload);
  95. let duration = state.services.find(el => el._id === state.appointment.spec).duration;
  96. console.log(shedule,action.payload)
  97. for (let index in shedule) {
  98. let check = true;
  99. for (let x=0;x < duration; x++){
  100. if (shedule[`${+index.split(':')[0]+x < 10 ? '0' +(+index.split(':')[0] + x) + ':00' : +index.split(':')[0]+ x + ':00'}`] !== true){
  101. check = false
  102. }
  103. }
  104. if (check) timeArray.push({[`${index}`]:shedule[`${index}`]});
  105. }
  106. return {
  107. ...state,
  108. appointment:{
  109. ...state.appointment,
  110. shedule:shedule._id
  111. },
  112. timeArray:timeArray
  113. };
  114. }
  115. case types.CHANGE_APPOINTMENT_DOCTOR : {
  116. return {
  117. ...state,
  118. appointment:{
  119. ...state.appointment,
  120. doctor:action.payload
  121. }
  122. };
  123. }
  124. case types.CHANGE_APPOINTMENT_TIME : {
  125. return {
  126. ...state,
  127. appointment:{
  128. ...state.appointment,
  129. time:action.payload
  130. }
  131. };
  132. }
  133. case types.CHANGE_APPOINTMENT_SPEC : {
  134. return {
  135. ...state,
  136. appointment:{
  137. ...state.appointment,
  138. spec:state.services.find(el => el.name === action.payload)._id,
  139. shedule:null,
  140. time:null
  141. }
  142. };
  143. }
  144. case types.CHANGE_APPOINTMENT_COMMENT : {
  145. return {
  146. ...state,
  147. appointment:{
  148. ...state.appointment,
  149. comment:action.payload
  150. }
  151. };
  152. }
  153. case types.CLEAR_APPOINTMENT : {
  154. return {
  155. ...state,
  156. appointment: defaultState.appointment
  157. };
  158. }
  159. // -----------------------------------------------------------------------------------------------------------------
  160. case types.CHANGE_SHEDULE_DOCTOR : {
  161. let doctor = state.doctors.find(el=>el.name === action.payload);
  162. let array = [[],[],[],[],[],[],[],[],[],[],[],[]];
  163. // eslint-disable-next-line array-callback-return
  164. doctor.shedule.map(el => {
  165. array[new Date(el.data).getMonth()].push(el)
  166. });
  167. return {
  168. ...state,
  169. postNewShedule: {
  170. ...state.postNewShedule,
  171. doctor:doctor._id
  172. },
  173. sheduleMonthArray: array
  174. };
  175. }
  176. // -----------------------------------------------------------------------------------------------------------------
  177. // -----------------------------------------------------------------------------------------------------------------
  178. case types.GET_DOCTORS_REQUEST : {
  179. return {
  180. ...state,
  181. isFetching: true
  182. };
  183. }
  184. case types.GET_DOCTORS_REQUEST_SUCCESS : {
  185. return {
  186. ...state,
  187. doctors:action.payload.doctors,
  188. isFetching: false
  189. }
  190. }
  191. case types.GET_DOCTORS_REQUEST_FAIL : {
  192. return {
  193. ...state,
  194. error:action.payload,
  195. isFetching: false
  196. }
  197. }
  198. // -----------------------------------------------------------------------------------------------------------------
  199. case types.GET_SERVICES_REQUEST : {
  200. return {
  201. ...state,
  202. isFetching: true
  203. };
  204. }
  205. case types.GET_SERVICES_REQUEST_SUCCESS : {
  206. action.payload.services.sort((a,b) => {
  207. if (a.name.slice(0,1) < b.name.slice(0,1)) {return -1;}
  208. if(a.name.slice(0,1) > b.name.slice(0,1)) {return 1;}
  209. return 0
  210. });
  211. action.payload.services.map(el => {
  212. switch (el.description){
  213. case "Ортодонтия" : {
  214. return {
  215. ...state,
  216. servicesArray:{
  217. ...state.servicesArray,
  218. 'Ортодонтия':state.servicesArray['Ортодонтия'].push(el)
  219. }
  220. }
  221. }
  222. case "Детская стоматология" : {
  223. return {
  224. ...state,
  225. servicesArray:{
  226. ...state.servicesArray,
  227. 'Детская стоматология':state.servicesArray['Детская стоматология'].push(el)
  228. }
  229. }
  230. }
  231. case "Протезирование" : {
  232. return {
  233. ...state,
  234. servicesArray:{
  235. ...state.servicesArray,
  236. 'Имплантология':state.servicesArray['Имплантология'].push(el)
  237. }
  238. }
  239. }
  240. case "Имплантация" : {
  241. return {
  242. ...state,
  243. servicesArray:{
  244. ...state.servicesArray,
  245. 'Имплантология':state.servicesArray['Имплантология'].push(el)
  246. }
  247. }
  248. }
  249. case "Хирургия" : {
  250. return {
  251. ...state,
  252. servicesArray:{
  253. ...state.servicesArray,
  254. 'Хирургия':state.servicesArray['Хирургия'].push(el)
  255. }
  256. }
  257. }
  258. case "Эндодонтическое лечение с помощью микроскопа" : {
  259. return {
  260. ...state,
  261. servicesArray:{
  262. ...state.servicesArray,
  263. 'Эндодонтия':state.servicesArray['Эндодонтия'].push(el)
  264. }
  265. }
  266. }
  267. case "Лечение пародонтита" : {
  268. return {
  269. ...state,
  270. servicesArray:{
  271. ...state.servicesArray,
  272. 'Терапия':state.servicesArray['Терапия'].push(el)
  273. }
  274. }
  275. }
  276. default: return el
  277. }
  278. });
  279. return {
  280. ...state,
  281. services:action.payload.services,
  282. isFetching: false
  283. }
  284. }
  285. case types.GET_SERVICES_REQUEST_FAIL : {
  286. return {
  287. ...state,
  288. error:action.payload,
  289. isFetching: false
  290. }
  291. }
  292. // -----------------------------------------------------------------------------------------------------------------
  293. // -----------------------------------------------------------------------------------------------------------------
  294. case types.POST_DOCTORS_REQUEST : {
  295. return {
  296. ...state,
  297. isFetching: true
  298. };
  299. }
  300. case types.POST_DOCTORS_REQUEST_SUCCESS : {
  301. return {
  302. ...state,
  303. postNewDoctor:postNewDoctorForm,
  304. isFetching: false
  305. }
  306. }
  307. case types.POST_DOCTORS_REQUEST_FAIL : {
  308. return {
  309. ...state,
  310. error: action.payload,
  311. isFetching: false
  312. }
  313. }
  314. // -----------------------------------------------------------------------------------------------------------------
  315. case types.POST_SHEDULE_REQUEST : {
  316. return {
  317. ...state,
  318. isFetching: true
  319. };
  320. }
  321. case types.POST_SHEDULE_REQUEST_SUCCESS : {
  322. return {
  323. ...state,
  324. postNewShedule:{
  325. ...state.postNewShedule,
  326. data:null,
  327. },
  328. isFetching: false
  329. }
  330. }
  331. case types.POST_SHEDULE_REQUEST_FAIL : {
  332. return {
  333. ...state,
  334. error: action.payload,
  335. isFetching: false
  336. }
  337. }
  338. // -----------------------------------------------------------------------------------------------------------------
  339. case types.POST_SERVICES_REQUEST : {
  340. return {
  341. ...state,
  342. isFetching: true
  343. };
  344. }
  345. case types.POST_SERVICES_REQUEST_SUCCESS : {
  346. return {
  347. ...state,
  348. isFetching: false
  349. }
  350. }
  351. case types.POST_SERVICES_REQUEST_FAIL : {
  352. return {
  353. ...state,
  354. error: action.payload,
  355. isFetching: false
  356. }
  357. }
  358. // -----------------------------------------------------------------------------------------------------------------
  359. case types.POST_ORDERS_REQUEST : {
  360. return {
  361. ...state,
  362. isFetching: true
  363. };
  364. }
  365. case types.POST_ORDERS_REQUEST_SUCCESS : {
  366. return {
  367. ...state,
  368. appointment: defaultState.appointment,
  369. orders:action.payload,
  370. isFetching: false
  371. }
  372. }
  373. case types.POST_ORDERS_REQUEST_FAIL : {
  374. return {
  375. ...state,
  376. error:action.payload,
  377. isFetching: false
  378. }
  379. }
  380. // -----------------------------------------------------------------------------------------------------------------
  381. // -----------------------------------------------------------------------------------------------------------------
  382. case types.PUT_DOCTORS_REQUEST : {
  383. return {
  384. ...state,
  385. isFetching: true
  386. };
  387. }
  388. case types.PUT_DOCTORS_REQUEST_SUCCESS : {
  389. return {
  390. ...state,
  391. postNewDoctor:postNewDoctorForm,
  392. changeId:null,
  393. isFetching: false
  394. }
  395. }
  396. case types.PUT_DOCTORS_REQUEST_FAIL : {
  397. return {
  398. ...state,
  399. error: action.payload,
  400. isFetching: false
  401. }
  402. }
  403. // -----------------------------------------------------------------------------------------------------------------
  404. case types.PUT_SERVICES_REQUEST : {
  405. return {
  406. ...state,
  407. isFetching: true
  408. };
  409. }
  410. case types.PUT_SERVICES_REQUEST_SUCCESS : {
  411. return {
  412. ...state,
  413. postNewService:postNewServiceForm,
  414. changeId:null,
  415. isFetching: false
  416. }
  417. }
  418. case types.PUT_SERVICES_REQUEST_FAIL : {
  419. return {
  420. ...state,
  421. error: action.payload,
  422. isFetching: false
  423. }
  424. }
  425. // -----------------------------------------------------------------------------------------------------------------
  426. // -----------------------------------------------------------------------------------------------------------------
  427. case types.DELETE_DOCTORS_REQUEST : {
  428. return {
  429. ...state,
  430. isFetching: true
  431. };
  432. }
  433. case types.DELETE_DOCTORS_REQUEST_SUCCESS : {
  434. return {
  435. ...state,
  436. changeId:null,
  437. isFetching: false
  438. }
  439. }
  440. case types.DELETE_DOCTORS_REQUEST_FAIL : {
  441. return {
  442. ...state,
  443. error: action.payload,
  444. isFetching: false
  445. }
  446. }
  447. // -----------------------------------------------------------------------------------------------------------------
  448. case types.DELETE_SERVICES_REQUEST : {
  449. return {
  450. ...state,
  451. isFetching: true
  452. };
  453. }
  454. case types.DELETE_SERVICES_REQUEST_SUCCESS : {
  455. return {
  456. ...state,
  457. changeId:null,
  458. isFetching: false
  459. }
  460. }
  461. case types.DELETE_SERVICES_REQUEST_FAIL : {
  462. return {
  463. ...state,
  464. error: action.payload,
  465. isFetching: false
  466. }
  467. }
  468. // -----------------------------------------------------------------------------------------------------------------
  469. // -----------------------------------------------------------------------------------------------------------------
  470. default:
  471. return state
  472. }
  473. };