diff --git a/src/app/recommend/_hooks/useSurveyRecommendation.ts b/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts similarity index 54% rename from src/app/recommend/_hooks/useSurveyRecommendation.ts rename to src/app/_components/SurveyScreen/hooks/usePostSurvey.ts index e477342..e75ee67 100644 --- a/src/app/recommend/_hooks/useSurveyRecommendation.ts +++ b/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts @@ -1,13 +1,15 @@ -import { useEffect, useState } from "react"; -import { fetchRecommendation } from "@/lib/apis/survey"; -import { RecommendationRequest, RecommendationResponse } from "@/lib/type"; +import { useState } from "react"; +import { useRouter } from "next/navigation"; +import { postSurvey } from "@/lib/apis/survey"; +import { SurveyRequest } from "@/lib/type"; -export function useSurveyRecommendation() { - const [spaceData, setSpaceData] = useState([]); +export function usePostSurvey() { const [isLoading, setIsLoading] = useState(true); const [isError, setIsError] = useState(false); - const fetchData = async () => { + const router = useRouter(); + + const handleSubmit = async () => { setIsLoading(true); setIsError(false); @@ -16,7 +18,7 @@ export function useSurveyRecommendation() { localStorage.getItem("onboardingAnswers") ?? "[]" ); - const payload: RecommendationRequest = { + const payload: SurveyRequest = { clientId, age: Number(onboarding[0]?.substr(0, 2) || 0), gender: onboarding[1], @@ -27,8 +29,8 @@ export function useSurveyRecommendation() { }; try { - const res = await fetchRecommendation(payload); - setSpaceData(res); + await postSurvey(payload); + router.push("/recommend"); } catch (err) { console.error(err); setIsError(true); @@ -37,9 +39,5 @@ export function useSurveyRecommendation() { } }; - useEffect(() => { - fetchData(); - }, []); - - return { spaceData, isLoading, isError }; + return { handleSubmit, isLoading, isError }; } diff --git a/src/app/_components/SurveyScreen/index.tsx b/src/app/_components/SurveyScreen/index.tsx index 85257e2..125fd1d 100644 --- a/src/app/_components/SurveyScreen/index.tsx +++ b/src/app/_components/SurveyScreen/index.tsx @@ -4,6 +4,9 @@ import { useSurvey } from "./hooks/useSurvey"; import ProgressBar from "@/app/_components/SurveyScreen/ProgressBar"; import SurveyOption from "./SurveyOption"; import Button from "@/components/Button"; +import clsx from "clsx"; +import { usePostSurvey } from "./hooks/usePostSurvey"; +import ErrorScreen from "@/components/ErrorScreen"; interface SurveyScreenProps { type: "onboarding" | "todayMood"; @@ -21,6 +24,13 @@ export default function SurveyScreen({ type, routing }: SurveyScreenProps) { handleNextClick, } = useSurvey({ type, routing }); + const { handleSubmit, isLoading, isError } = usePostSurvey(); + + const isLastQuestion = + type === "todayMood" && currentQuestion === questions.length - 1; + + if (isError) return ; + return (
@@ -55,11 +65,14 @@ export default function SurveyScreen({ type, routing }: SurveyScreenProps) { )}
diff --git a/src/app/recommend/_components/SatisfactionModalContent/hooks/useSatisfactionSubmit.ts b/src/app/recommend/_components/SatisfactionModalContent/hooks/usePatchSatisfaction.ts similarity index 72% rename from src/app/recommend/_components/SatisfactionModalContent/hooks/useSatisfactionSubmit.ts rename to src/app/recommend/_components/SatisfactionModalContent/hooks/usePatchSatisfaction.ts index 45bc48f..a6ad59c 100644 --- a/src/app/recommend/_components/SatisfactionModalContent/hooks/useSatisfactionSubmit.ts +++ b/src/app/recommend/_components/SatisfactionModalContent/hooks/usePatchSatisfaction.ts @@ -1,9 +1,9 @@ import { useState } from "react"; import { useRouter } from "next/navigation"; -import { UpdateRequest } from "@/lib/type"; -import { updateSatisfactionScore } from "@/lib/apis/survey"; +import { SatisfactionRequest } from "@/lib/type"; +import { patchSatisfaction } from "@/lib/apis/survey"; -export function useSatisfactionSubmit(onClose: () => void) { +export function usePatchSatisfaction(onClose: () => void) { const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); @@ -15,13 +15,13 @@ export function useSatisfactionSubmit(onClose: () => void) { const clientId = localStorage.getItem("userId") || ""; - const payload: UpdateRequest = { + const payload: SatisfactionRequest = { clientId, satisfactions, }; try { - await updateSatisfactionScore(payload); + await patchSatisfaction(payload); onClose(); router.push("/submit-success"); } catch (err) { diff --git a/src/app/recommend/_components/SatisfactionModalContent/index.tsx b/src/app/recommend/_components/SatisfactionModalContent/index.tsx index 2eda6d0..f5dbe0d 100644 --- a/src/app/recommend/_components/SatisfactionModalContent/index.tsx +++ b/src/app/recommend/_components/SatisfactionModalContent/index.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import { useSatisfactionSubmit } from "./hooks/useSatisfactionSubmit"; +import { usePatchSatisfaction } from "./hooks/usePatchSatisfaction"; import SatisfactionForm from "./SatisfactionForm"; import Button from "@/components/Button"; import ErrorScreen from "@/components/ErrorScreen"; @@ -11,7 +11,7 @@ export default function SatisfactionModalContent({ }) { const [satisfactionScores, setSatisfactionScores] = useState([0, 0, 0]); - const { handleSubmit, isLoading, isError } = useSatisfactionSubmit(onClose); + const { handleSubmit, isLoading, isError } = usePatchSatisfaction(onClose); return (
diff --git a/src/app/recommend/_hooks/useGetRecommendation.ts b/src/app/recommend/_hooks/useGetRecommendation.ts new file mode 100644 index 0000000..d151997 --- /dev/null +++ b/src/app/recommend/_hooks/useGetRecommendation.ts @@ -0,0 +1,32 @@ +import { useEffect, useState } from "react"; +import { getRecommendation } from "@/lib/apis/survey"; +import { RecommendationResponse } from "@/lib/type"; + +export function useGetRecommendation() { + const [spaceData, setSpaceData] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [isError, setIsError] = useState(false); + + const fetchData = async () => { + setIsLoading(true); + setIsError(false); + + const clientId = localStorage.getItem("userId") || ""; + + try { + const res = await getRecommendation(clientId); + setSpaceData(res); + } catch (err) { + console.error(err); + setIsError(true); + } finally { + setIsLoading(false); + } + }; + + useEffect(() => { + fetchData(); + }, []); + + return { spaceData, isLoading, isError }; +} diff --git a/src/app/recommend/page.tsx b/src/app/recommend/page.tsx index 405d847..6215e38 100644 --- a/src/app/recommend/page.tsx +++ b/src/app/recommend/page.tsx @@ -1,7 +1,7 @@ "use client"; import { useState } from "react"; -import { useSurveyRecommendation } from "./_hooks/useSurveyRecommendation"; +import { useGetRecommendation } from "./_hooks/useGetRecommendation"; import NavBar from "./_components/NavBar"; import RecommendationPanel from "./_components/RecommendationPanel"; import MapView from "./_components/MapView"; @@ -13,7 +13,7 @@ import TransitionScreen from "@/app/_components/TransitionScreen"; export default function RecommendPage() { const [isOpen, setIsOpen] = useState(false); - const { spaceData, isLoading, isError } = useSurveyRecommendation(); + const { spaceData, isLoading, isError } = useGetRecommendation(); if (isLoading) return ; diff --git a/src/lib/apis/survey.ts b/src/lib/apis/survey.ts index 7d1a0ed..81f592b 100644 --- a/src/lib/apis/survey.ts +++ b/src/lib/apis/survey.ts @@ -1,23 +1,33 @@ import axios from "@/lib/axiosInstance"; -import { RecommendationRequest, UpdateRequest } from "../type"; +import { SurveyRequest, SatisfactionRequest } from "../type"; // 사용자 설문 결과 요청 -export async function fetchRecommendation(payload: RecommendationRequest) { +export async function postSurvey(payload: SurveyRequest) { try { - const res = await axios.post("/survey/recommendation", payload); + await axios.post("/survey/recommendation", payload); + } catch (err) { + console.error("사용자 설문 결과 보내기 실패:", err); + throw err; + } +} + +// 사용자 설문 결과 반환 +export async function getRecommendation(clientId: string) { + try { + const res = await axios.get(`/survey?clientId=${clientId}`); return res.data; } catch (err) { - console.error("추천 API 실패:", err); + console.error("추천 장소 데이터 불러오기 실패:", err); throw err; } } // 사용자 설문 결과 만족도 반영 요청 -export async function updateSatisfactionScore(payload: UpdateRequest) { +export async function patchSatisfaction(payload: SatisfactionRequest) { try { await axios.patch("/survey/update", payload); } catch (err) { - console.error("만족도 API 호출 실패:", err); + console.error("사용자 만족도 조사 결과 보내기 실패:", err); throw err; } } diff --git a/src/lib/type.ts b/src/lib/type.ts index 90d49f2..183f3f6 100644 --- a/src/lib/type.ts +++ b/src/lib/type.ts @@ -1,4 +1,4 @@ -export interface RecommendationRequest { +export interface SurveyRequest { clientId: string; age: number; gender: "남자" | "여자"; @@ -20,7 +20,7 @@ export interface RecommendationResponse { } | null; } -export interface UpdateRequest { +export interface SatisfactionRequest { clientId: string; satisfactions: number[]; }