diff --git a/packages/react-native/src/apis/mutations/useSelectedSpotAddMutation.ts b/packages/react-native/src/apis/mutations/useSelectedSpotAddMutation.ts new file mode 100644 index 00000000..e8ca51c7 --- /dev/null +++ b/packages/react-native/src/apis/mutations/useSelectedSpotAddMutation.ts @@ -0,0 +1,36 @@ +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { SpotResponse } from '../queries/spot/useSpotDetailQuery'; +import useAuthAxios from '../useAuthAxios'; +import QUERY_KEYS from '@/constants/QUERY_KEYS'; + +interface AddSpotToPlanRequest { + planId: number; + spotList: SpotResponse[]; +} + +export default function useSelectedSpotAddMutation() { + const authAxios = useAuthAxios(); + const queryClient = useQueryClient(); + + const addSpotToPlan = async ({ planId, spotList }: AddSpotToPlanRequest) => { + await authAxios.post( + `/api/schedule/selected-spot/${planId}`, + spotList.map((spot) => ({ + title: spot.title, + addr1: spot.addr1, + addr2: spot.addr2, + contentId: spot.contentId, + image: spot.image, + dist: spot.dist, + contentTypeId: spot.contentTypeId, + })), + ); + }; + + return useMutation({ + mutationFn: addSpotToPlan, + onSuccess: () => { + queryClient.invalidateQueries({ queryKey: [QUERY_KEYS.TRIP_PLANS] }); + }, + }); +} diff --git a/packages/react-native/src/apis/queries/detail/useDetailQuery.ts b/packages/react-native/src/apis/queries/detail/useDetailQuery.ts index 2bc7b280..b9b3c337 100644 --- a/packages/react-native/src/apis/queries/detail/useDetailQuery.ts +++ b/packages/react-native/src/apis/queries/detail/useDetailQuery.ts @@ -18,6 +18,8 @@ interface DetailResponse { isLiked: boolean; likeCount: number; posterUrl: string; + contentTypeId: string; + dist: string; } export default function useDetailQuery({ diff --git a/packages/react-native/src/apis/queries/spot/useSpotDetailQuery.ts b/packages/react-native/src/apis/queries/spot/useSpotDetailQuery.ts index 3c888869..52f65e46 100644 --- a/packages/react-native/src/apis/queries/spot/useSpotDetailQuery.ts +++ b/packages/react-native/src/apis/queries/spot/useSpotDetailQuery.ts @@ -16,6 +16,8 @@ export interface SpotResponse { latitude: number; longitude: number; overview: string; + contentTypeId: string; + dist: string; } export default function useSpotDetailQuery({ id }: UseSpotDetailQueryParams) { diff --git a/packages/react-native/src/pages/Detail.tsx b/packages/react-native/src/pages/Detail.tsx index 72b8d36a..d2118b59 100644 --- a/packages/react-native/src/pages/Detail.tsx +++ b/packages/react-native/src/pages/Detail.tsx @@ -34,6 +34,8 @@ const Detail = withSuspense(() => { isLiked, city, region, + dist, + contentTypeId, } = data; const handleAddPlan = () => { @@ -50,6 +52,8 @@ const Detail = withSuspense(() => { longitude, latitude, overview, + dist, + contentTypeId, }, ], }); diff --git a/packages/react-native/src/pages/HomeSpotAdd.tsx b/packages/react-native/src/pages/HomeSpotAdd.tsx index ac9c6f06..2f8c68c3 100644 --- a/packages/react-native/src/pages/HomeSpotAdd.tsx +++ b/packages/react-native/src/pages/HomeSpotAdd.tsx @@ -1,14 +1,15 @@ import { useState } from 'react'; import { Dimensions, View } from 'react-native'; import { Button, FloatingPlusButton, Font } from 'design-system'; -import { useRoute } from '@react-navigation/native'; +import { useNavigation, useRoute } from '@react-navigation/native'; import useTripPlansQuery from '@/apis/queries/tripPlan/useTripPlansQuery'; import Header from '@/components/common/Header'; import withSuspense from '@/components/HOC/withSuspense'; import EmptyPlan from '@/components/tripPlan/EmptyPlan'; import TripPlanCard, { CARD_GAP } from '@/components/tripPlan/TripPlanCard'; import BackGroundGradient from '@/layouts/BackGroundGradient'; -import { StackRouteProps } from '@/types/navigation'; +import { StackNavigation, StackRouteProps } from '@/types/navigation'; +import useSelectedSpotAddMutation from '@/apis/mutations/useSelectedSpotAddMutation'; const { height } = Dimensions.get('window'); @@ -17,6 +18,15 @@ export default withSuspense(function HomeSpotAdd() { const { data } = useTripPlansQuery(); const [tripId, setTripId] = useState(); const isEmpty = data.length === 0; + const { mutateAsync } = useSelectedSpotAddMutation(); + const navigation = useNavigation>(); + + const add = () => { + if (!tripId) return; + + mutateAsync({ planId: tripId, spotList: route.params.spots }); + navigation.goBack(); + }; return ( <> @@ -58,13 +68,17 @@ export default withSuspense(function HomeSpotAdd() { - - {}} /> + navigation.navigate('TripPlanner/Post')} + /> ); });