RegionContext.tsx 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import { usePostSetSlowMutation } from '@api/countries';
  2. import { usePostSetDareRegionMutation } from '@api/myDARE';
  3. import { usePostSetNmRegionMutation } from '@api/myRegions';
  4. import React, { createContext, useContext, useState, useCallback } from 'react';
  5. import { DareRegion, NmRegion, SlowData } from 'src/screens/InAppScreens/TravelsScreen/utils/types';
  6. import { StoreType, storage } from 'src/storage';
  7. const RegionContext = createContext<any>(null);
  8. export const useRegion = () => useContext(RegionContext);
  9. export const RegionProvider = ({ children }: { children: React.ReactNode }) => {
  10. const [userData, setUserData] = useState({});
  11. const [nmRegions, setNmRegions] = useState<NmRegion[]>([]);
  12. const [dareRegions, setDareRegions] = useState<DareRegion[] | null>([]);
  13. const [slow, setSlow] = useState<SlowData[]>([]);
  14. const token = storage.get('token', StoreType.STRING) as string;
  15. const { mutate: updateNM } = usePostSetNmRegionMutation();
  16. const { mutate: updateDARE } = usePostSetDareRegionMutation();
  17. const { mutate: updateSlow } = usePostSetSlowMutation();
  18. const handleUpdateNM = useCallback(
  19. (region: number, first: number, last: number, visits: number, quality: number) => {
  20. const updatedNM = {
  21. ...userData,
  22. first_visit_year: first,
  23. last_visit_year: last,
  24. best_visit_quality: quality,
  25. no_of_visits: visits,
  26. visited: visits > 0 ? true : false
  27. };
  28. const updatedNMData = {
  29. token,
  30. region,
  31. first,
  32. last,
  33. visits,
  34. quality
  35. };
  36. updateNM(updatedNMData);
  37. updatedNM && setUserData(updatedNM);
  38. },
  39. [userData, token]
  40. );
  41. const handleUpdateDare = useCallback(
  42. (region: number, visits: 0 | 1) => {
  43. const updatedDARE = { ...userData, visited: visits > 0 ? true : false };
  44. const updatedDareData = {
  45. token,
  46. region,
  47. visits
  48. };
  49. updateDARE(updatedDareData);
  50. updatedDARE && setUserData(updatedDARE);
  51. },
  52. [userData, token]
  53. );
  54. const handleUpdateSlow = useCallback(
  55. (id: number, v: boolean, s11: boolean, s31: boolean, s101: boolean) => {
  56. const updatedSlow = {
  57. type: 'countries',
  58. visited: v,
  59. slow11: !v ? 0 : (Number(s11) as 0 | 1),
  60. slow31: !v ? 0 : (Number(s31) as 0 | 1),
  61. slow101: !v ? 0 : (Number(s101) as 0 | 1)
  62. };
  63. const updatedSlowData = {
  64. token,
  65. id,
  66. v,
  67. s11: !v ? false : s11,
  68. s31: !v ? false : s31,
  69. s101: !v ? false : s101
  70. };
  71. updateSlow(updatedSlowData);
  72. setUserData(updatedSlow);
  73. },
  74. [userData, token]
  75. );
  76. const handleUpdateNMList = useCallback(
  77. (id: number, first: number, last: number, visits: number, quality: number) => {
  78. const updatedNM = nmRegions.map((item) => {
  79. if (item.id === id) {
  80. return {
  81. ...item,
  82. year: first,
  83. last,
  84. quality,
  85. visits
  86. };
  87. }
  88. return item;
  89. });
  90. const updatedNMData = {
  91. token,
  92. region: id,
  93. first,
  94. last,
  95. visits,
  96. quality
  97. };
  98. updateNM(updatedNMData);
  99. updatedNM && setNmRegions(updatedNM);
  100. },
  101. [nmRegions]
  102. );
  103. const handleUpdateDareList = useCallback(
  104. (region: number, visits: 0 | 1) => {
  105. const updatedDARE = dareRegions?.map((item) => {
  106. if (item.id === region) {
  107. return {
  108. ...item,
  109. visited: String(visits)
  110. };
  111. }
  112. return item;
  113. });
  114. const updatedDareData = {
  115. token,
  116. region,
  117. visits
  118. };
  119. updateDARE(updatedDareData);
  120. updatedDARE && setDareRegions(updatedDARE);
  121. },
  122. [dareRegions]
  123. );
  124. const handleUpdateSlowList = useCallback(
  125. (id: number, v: boolean, s11: boolean, s31: boolean, s101: boolean) => {
  126. const updatedSlow = slow?.map((item) => {
  127. if (item.country_id === id) {
  128. return {
  129. ...item,
  130. visited: Number(v) as 0 | 1,
  131. slow11: !v ? 0 : (Number(s11) as 0 | 1),
  132. slow31: !v ? 0 : (Number(s31) as 0 | 1),
  133. slow101: !v ? 0 : (Number(s101) as 0 | 1)
  134. };
  135. }
  136. return item;
  137. });
  138. const updatedSlowData = {
  139. token,
  140. id,
  141. v,
  142. s11: !v ? false : s11,
  143. s31: !v ? false : s31,
  144. s101: !v ? false : s101
  145. };
  146. updateSlow(updatedSlowData);
  147. updatedSlow && setSlow(updatedSlow);
  148. },
  149. [slow]
  150. );
  151. return (
  152. <RegionContext.Provider
  153. value={{
  154. userData,
  155. setUserData,
  156. setNmRegions,
  157. nmRegions,
  158. setDareRegions,
  159. dareRegions,
  160. handleUpdateNM,
  161. handleUpdateDare,
  162. handleUpdateNMList,
  163. handleUpdateDareList,
  164. handleUpdateSlow,
  165. handleUpdateSlowList,
  166. slow,
  167. setSlow
  168. }}
  169. >
  170. {children}
  171. </RegionContext.Provider>
  172. );
  173. };