Viktoriia 3 týždňov pred
rodič
commit
0f05fe8bc5

+ 1 - 0
src/modules/api/myRegions/queries/index.ts

@@ -7,3 +7,4 @@ export * from './use-post-get-visits-to-region';
 export * from './use-post-add-visit';
 export * from './use-post-update-visit';
 export * from './use-post-delete-visit';
+export * from './use-post-get-single-region';

+ 21 - 0
src/modules/api/myRegions/queries/use-post-get-single-region.tsx

@@ -0,0 +1,21 @@
+import { useMutation } from '@tanstack/react-query';
+
+import { regionsQueryKeys } from '../regions-query-keys';
+import { type PostDeleteVisit, type PostGetSingleRegionReturn, regionsApi } from '../regions-api';
+
+import type { BaseAxiosError } from '../../../../types';
+
+export const usePostGetSingleRegionMutation = () => {
+  return useMutation<
+    PostGetSingleRegionReturn,
+    BaseAxiosError,
+    PostDeleteVisit,
+    PostGetSingleRegionReturn
+  >({
+    mutationKey: regionsQueryKeys.getSingleRegion(),
+    mutationFn: async (data) => {
+      const response = await regionsApi.getSingleRegion(data);
+      return response.data;
+    }
+  });
+};

+ 14 - 1
src/modules/api/myRegions/regions-api.tsx

@@ -140,6 +140,17 @@ export interface PostDeleteVisit {
   id: number;
 }
 
+export interface PostGetSingleRegionReturn {
+  not_visited?: 0 | 1;
+  region?: {
+    best_visit_quality: number;
+    first_visited_in_year: number | null;
+    id: number;
+    last_visited_in_year: number | null;
+    no_of_visits: number;
+  };
+}
+
 export const regionsApi = {
   getMegaregions: (token: string) =>
     request.postForm<PostGetMegaReturn>(API.GET_MEGAREGIONS, { token }),
@@ -157,5 +168,7 @@ export const regionsApi = {
   ) => request.postForm<PostGetRegionsReturn>(API.GET_REGIONS, { megaregion, country, token }),
   addVisit: (data: PostAddVisit) => request.postForm<ResponseType>(API.ADD_VISIT, data),
   updateVisit: (data: PostUpdateVisit) => request.postForm<ResponseType>(API.UPDATE_VISIT, data),
-  deleteVisit: (data: PostDeleteVisit) => request.postForm<ResponseType>(API.DELETE_VISIT, data)
+  deleteVisit: (data: PostDeleteVisit) => request.postForm<ResponseType>(API.DELETE_VISIT, data),
+  getSingleRegion: (data: PostDeleteVisit) =>
+    request.postForm<PostGetSingleRegionReturn>(API.GET_SINGLE_REGION, data)
 };

+ 2 - 1
src/modules/api/myRegions/regions-query-keys.tsx

@@ -12,5 +12,6 @@ export const regionsQueryKeys = {
   ) => ['getRegions', { megaregion, country, token }] as const,
   addVisit: () => ['addVisit'] as const,
   updateVisit: () => ['updateVisit'] as const,
-  deleteVisit: () => ['deleteVisit'] as const
+  deleteVisit: () => ['deleteVisit'] as const,
+  getSingleRegion: () => ['getSingleRegion'] as const,
 };

+ 162 - 7
src/screens/InAppScreens/TravelsScreen/EditNmDataScreen/index.tsx

@@ -26,12 +26,15 @@ import {
   useGetVisitsQuery,
   usePostAddVisitMutation,
   usePostDeleteVisitMutation,
+  usePostGetSingleRegionMutation,
   usePostUpdateVisitMutation
 } from '@api/myRegions';
 import ActionSheet from 'react-native-actions-sheet';
 import { ButtonVariants } from 'src/types/components';
 import EditSvg from 'assets/icons/travels-screens/pen-to-square.svg';
 import TripIcon from 'assets/icons/travels-section/trip.svg';
+import { useRegion } from 'src/contexts/RegionContext';
+import { NmRegion } from '../utils/types';
 
 type DateMode = 'year' | 'month' | 'full';
 type QualityType = {
@@ -74,12 +77,15 @@ interface DatePickerState {
 
 const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }) => {
   const id = route.params?.regionId;
+  const isFromRegionsList = route.params?.regionsList ?? false;
+
   const token = storage.get('token', StoreType.STRING) as string;
 
   const { data: existingVisits } = useGetVisitsQuery(id, token, token ? true : false);
   const { mutateAsync: addVisit } = usePostAddVisitMutation();
   const { mutateAsync: updateVisitAsync } = usePostUpdateVisitMutation();
   const { mutateAsync: deleteVisitAsync } = usePostDeleteVisitMutation();
+  const { mutateAsync: getRegion } = usePostGetSingleRegionMutation();
 
   const [visits, setVisits] = useState<Visit[]>([]);
   const [showDatePicker, setShowDatePicker] = useState<DatePickerState | null>(null);
@@ -90,6 +96,8 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
   const [selectedMonth, setSelectedMonth] = useState<number | null>(null);
   const [selectedDay, setSelectedDay] = useState<number | null>(null);
 
+  const { userData, setUserData, nmRegions, setNmRegions } = useRegion();
+
   const [modalState, setModalState] = useState({
     isWarningVisible: false,
     type: 'success',
@@ -194,7 +202,47 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
             hidden: 0
           },
           {
-            onSuccess: (data) => {},
+            onSuccess: async (data) => {
+              await getRegion(
+                { token, id },
+                {
+                  onSuccess: (res) => {
+                    if (isFromRegionsList && res.region) {
+                      const updatedNM = nmRegions.map((item: NmRegion) => {
+                        if (item.id === id) {
+                          return {
+                            ...item,
+                            year: res.region?.first_visited_in_year,
+                            last: res.region?.last_visited_in_year,
+                            quality: res.region?.best_visit_quality,
+                            visits: res.region?.no_of_visits
+                          };
+                        }
+                        return item;
+                      });
+
+                      setNmRegions(updatedNM);
+                      return;
+                    }
+
+                    if (res.region) {
+                      const updatedNM = {
+                        ...userData,
+                        first_visit_year: res.region.first_visited_in_year,
+                        last_visit_year: res.region.last_visited_in_year,
+                        best_visit_quality: res.region.best_visit_quality,
+                        no_of_visits: res.region.no_of_visits,
+                        visited: true
+                      };
+                      setUserData(updatedNM);
+                    }
+                  },
+                  onError: (err) => {
+                    console.log('err', err);
+                  }
+                }
+              );
+            },
             onError: (error) => {
               console.log('updateVisitAsync error', error);
             }
@@ -211,8 +259,8 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
   );
 
   const deleteVisit = useCallback(
-    async (id: number): Promise<void> => {
-      const visitToDelete = visits.find((visit: Visit) => visit.id === id);
+    async (visitId: number): Promise<void> => {
+      const visitToDelete = visits.find((visit: Visit) => visit.id === visitId);
       if (!visitToDelete) return;
       if (visitToDelete.isExisting) {
         setModalState({
@@ -226,15 +274,82 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
                 id: visitToDelete.id
               },
               {
-                onSuccess: (res) => {
+                onSuccess: async (res) => {
                   Animated.timing(visitToDelete.animatedValue, {
                     toValue: 0,
                     duration: 300,
                     easing: Easing.in(Easing.quad),
                     useNativeDriver: false
                   }).start(() => {
-                    setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== id));
+                    setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== visitId));
                   });
+
+                  getRegion(
+                    { token, id },
+                    {
+                      onSuccess: (res) => {
+                        if (isFromRegionsList && res.not_visited) {
+                          const updatedNM = nmRegions.map((item: NmRegion) => {
+                            if (item.id === id) {
+                              return {
+                                ...item,
+                                year: 0,
+                                last: 0,
+                                quality: 3,
+                                visits: 0
+                              };
+                            }
+                            return item;
+                          });
+
+                          setNmRegions(updatedNM);
+                          return;
+                        } else if (isFromRegionsList && res.region) {
+                          const updatedNM = nmRegions.map((item: NmRegion) => {
+                            if (item.id === id) {
+                              return {
+                                ...item,
+                                year: res.region?.first_visited_in_year,
+                                last: res.region?.last_visited_in_year,
+                                quality: res.region?.best_visit_quality,
+                                visits: res.region?.no_of_visits
+                              };
+                            }
+                            return item;
+                          });
+
+                          setNmRegions(updatedNM);
+                          return;
+                        }
+                        if (res.not_visited) {
+                          const updatedNM = {
+                            ...userData,
+                            first_visit_year: 0,
+                            last_visit_year: 0,
+                            best_visit_quality: 3,
+                            no_of_visits: 0,
+                            visited: false
+                          };
+                          setUserData(updatedNM);
+                          return;
+                        }
+                        if (res.region) {
+                          const updatedNM = {
+                            ...userData,
+                            first_visit_year: res.region.first_visited_in_year,
+                            last_visit_year: res.region.last_visited_in_year,
+                            best_visit_quality: res.region.best_visit_quality,
+                            no_of_visits: res.region.no_of_visits,
+                            visited: true
+                          };
+                          setUserData(updatedNM);
+                        }
+                      },
+                      onError: (err) => {
+                        console.log('err', err);
+                      }
+                    }
+                  );
                 },
                 onError: (err) => {
                   console.log('delete err', err);
@@ -252,7 +367,7 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
           easing: Easing.in(Easing.quad),
           useNativeDriver: false
         }).start(() => {
-          setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== id));
+          setVisits((prevVisits) => prevVisits.filter((visit) => visit.id !== visitId));
         });
       }
     },
@@ -349,7 +464,47 @@ const EditNmDataScreen = ({ navigation, route }: { navigation: any; route: any }
             hidden: 0
           },
           {
-            onSuccess: (data) => {},
+            onSuccess: async (data) => {
+              await getRegion(
+                { token, id },
+                {
+                  onSuccess: (res) => {
+                    if (isFromRegionsList && res.region) {
+                      const updatedNM = nmRegions.map((item: NmRegion) => {
+                        if (item.id === id) {
+                          return {
+                            ...item,
+                            year: res.region?.first_visited_in_year,
+                            last: res.region?.last_visited_in_year,
+                            quality: res.region?.best_visit_quality,
+                            visits: res.region?.no_of_visits
+                          };
+                        }
+                        return item;
+                      });
+
+                      setNmRegions(updatedNM);
+                      return;
+                    }
+
+                    if (res.region) {
+                      const updatedNM = {
+                        ...userData,
+                        first_visit_year: res.region.first_visited_in_year,
+                        last_visit_year: res.region.last_visited_in_year,
+                        best_visit_quality: res.region.best_visit_quality,
+                        no_of_visits: res.region.no_of_visits,
+                        visited: true
+                      };
+                      setUserData(updatedNM);
+                    }
+                  },
+                  onError: (err) => {
+                    console.log('err', err);
+                  }
+                }
+              );
+            },
             onError: (error) => {
               console.log('addVisit error', error);
             }

+ 3 - 1
src/screens/InAppScreens/TravelsScreen/RegionsScreen/index.tsx

@@ -97,7 +97,9 @@ const RegionsScreen = () => {
       id: item.id
     });
     // setIsEditModalVisible(true);
-    navigation.navigate(...([NAVIGATION_PAGES.EDIT_NM_DATA, { regionId: item.id }] as never));
+    navigation.navigate(
+      ...([NAVIGATION_PAGES.EDIT_NM_DATA, { regionId: item.id, regionsList: true }] as never)
+    );
   };
 
   const handleUpdateTCC = useCallback(

+ 4 - 2
src/types/api.ts

@@ -219,7 +219,8 @@ export enum API_ENDPOINT {
   GET_VISITS_TO_REGION = 'get-visits-to-region',
   ADD_VISIT = 'add-visit',
   UPDATE_VISIT = 'update-visit',
-  DELETE_VISIT = 'delete-visit'
+  DELETE_VISIT = 'delete-visit',
+  GET_SINGLE_REGION = 'get-single-region'
 }
 
 export enum API {
@@ -412,7 +413,8 @@ export enum API {
   GET_REGIONS = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.GET_REGIONS}`,
   ADD_VISIT = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.ADD_VISIT}`,
   UPDATE_VISIT = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.UPDATE_VISIT}`,
-  DELETE_VISIT = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.DELETE_VISIT}`
+  DELETE_VISIT = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.DELETE_VISIT}`,
+  GET_SINGLE_REGION = `${API_ROUTE.QUICK_ENTER}/${API_ENDPOINT.GET_SINGLE_REGION}`
 }
 
 export type BaseAxiosError = AxiosError;