diff --git a/src/app/_components/SurveyScreen/hooks/useSurvey.ts b/src/app/_components/SurveyScreen/hooks/useSurvey.ts index 86a0929..dd03636 100644 --- a/src/app/_components/SurveyScreen/hooks/useSurvey.ts +++ b/src/app/_components/SurveyScreen/hooks/useSurvey.ts @@ -1,12 +1,15 @@ import { useState } from "react"; +import { useRouter } from "next/navigation"; import { surveyData } from "@/constants/surveyData"; interface UseSurveyProps { type: "onboarding" | "todayMood"; - routing: (page: string) => void; + routing?: (page: string) => void; } export default function useSurvey({ type, routing }: UseSurveyProps) { + const router = useRouter(); + const questions = surveyData[type]; const storageKey = `${type}Answers`; @@ -35,9 +38,11 @@ export default function useSurvey({ type, routing }: UseSurveyProps) { const handleNextClick = () => { if (currentQuestion === questions.length - 1) { - routing( - type === "onboarding" ? "ToMoodTransition" : "ToRecommendTransition" - ); + if (routing) { + routing("ToMoodTransition"); + } else { + router.push("/recommend"); + } } else { setCurrentQuestion((prev) => prev + 1); } diff --git a/src/app/_components/SurveyScreen/index.tsx b/src/app/_components/SurveyScreen/index.tsx index 3a32dc8..cc8599e 100644 --- a/src/app/_components/SurveyScreen/index.tsx +++ b/src/app/_components/SurveyScreen/index.tsx @@ -7,7 +7,7 @@ import Button from "@/components/Button"; interface SurveyScreenProps { type: "onboarding" | "todayMood"; - routing: (page: string) => void; + routing?: (page: string) => void; } export default function SurveyScreen({ type, routing }: SurveyScreenProps) { diff --git a/src/app/_components/TransitionScreen/index.tsx b/src/app/_components/TransitionScreen/index.tsx index 1e13781..44fc895 100644 --- a/src/app/_components/TransitionScreen/index.tsx +++ b/src/app/_components/TransitionScreen/index.tsx @@ -1,7 +1,6 @@ "use client"; import { useEffect } from "react"; -import { useRouter } from "next/navigation"; import { transitionData } from "@/constants/transitionData"; import Image from "next/image"; @@ -14,18 +13,15 @@ export default function TransitionScreen({ type, routing, }: TransitionScreenProps) { - const router = useRouter(); const transitionContent = transitionData[type]; useEffect(() => { - setTimeout(() => { - if (routing) { + if (routing) { + setTimeout(() => { routing("TodayMoodSurvey"); - } else { - router.push("/recommend"); - } - }, 1000); - }, [transitionContent, routing, router]); + }, 1000); + } + }, [transitionContent, routing]); return (
diff --git a/src/app/lib/api.ts b/src/app/lib/api.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/app/lib/type.ts b/src/app/lib/type.ts deleted file mode 100644 index dcd93f1..0000000 --- a/src/app/lib/type.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface RecommendationResponse { - title: string; - position: string; - category: string; - image: string; - url: string; -} diff --git a/src/app/map/PopupTestPage/PopupTestPage.jsx b/src/app/map/PopupTestPage/PopupTestPage.jsx index 1b4e350..8bfbd82 100644 --- a/src/app/map/PopupTestPage/PopupTestPage.jsx +++ b/src/app/map/PopupTestPage/PopupTestPage.jsx @@ -22,10 +22,10 @@ export default function PopupTestPage({ routing }) { }; const handleSubmitClick = async () => { - const USID = localStorage.getItem("USID") || ""; + const userId = localStorage.getItem("userId") || ""; const payload = { - clientId: USID, + clientId: userId, satisfactions: satisfactions, }; diff --git a/src/app/page.tsx b/src/app/page.tsx index bdb274e..ff44937 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -18,13 +18,10 @@ export default function Home() { ToMoodTransition: () => ( ), - ToRecommendTransition: () => , OnboardingSurvey: () => ( ), - TodayMoodSurvey: () => ( - - ), + TodayMoodSurvey: () => , }; return
{pageMapping[currentPage]?.()}
; diff --git a/src/app/recommend/_components/SidePanel/SpaceCard.tsx b/src/app/recommend/_components/SidePanel/SpaceCard.tsx index 1a17655..8a43112 100644 --- a/src/app/recommend/_components/SidePanel/SpaceCard.tsx +++ b/src/app/recommend/_components/SidePanel/SpaceCard.tsx @@ -1,6 +1,6 @@ import Image from "next/image"; import Temp from "@/assets/icons/temp.jpg"; -import { RecommendationResponse } from "@/app/lib/type"; +import { RecommendationResponse } from "@/lib/type"; export default function SpaceCard({ spaceData, diff --git a/src/app/recommend/_components/SidePanel/index.tsx b/src/app/recommend/_components/SidePanel/index.tsx index a6454ff..c5b91fb 100644 --- a/src/app/recommend/_components/SidePanel/index.tsx +++ b/src/app/recommend/_components/SidePanel/index.tsx @@ -1,7 +1,7 @@ import SpaceCard from "./SpaceCard"; import Image from "next/image"; import ChevronLeft from "@/assets/icons/chevron-left.png"; -import { RecommendationResponse } from "@/app/lib/type"; +import { RecommendationResponse } from "@/lib/type"; export default function SidePanel({ spaceData, diff --git a/src/app/recommend/_hooks/useSurveyRecommendation.ts b/src/app/recommend/_hooks/useSurveyRecommendation.ts new file mode 100644 index 0000000..00ea439 --- /dev/null +++ b/src/app/recommend/_hooks/useSurveyRecommendation.ts @@ -0,0 +1,44 @@ +// hooks/useSurveyRecommendation.ts +import { useEffect, useState } from "react"; +import { fetchRecommendation } from "@/lib/apis/survey"; +import { RecommendationRequest, RecommendationResponse } from "@/lib/type"; + +export function useSurveyRecommendation() { + const [spaceData, setSpaceData] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + const userId = localStorage.getItem("userId") || ""; + const onboarding = JSON.parse( + localStorage.getItem("onboardingAnswers") ?? "[]" + ); + + const payload: RecommendationRequest = { + clientId: userId, + age: Number(onboarding[0]?.substr(0, 2) || 0), + gender: onboarding[1], + resident: onboarding[2], + city: onboarding[3], + want: onboarding[5], + mood: onboarding[6], + }; + + setIsLoading(true); + setError(null); + + fetchRecommendation(payload) + .then((data) => { + setSpaceData(data); + }) + .catch((err) => { + console.error(err); + setError("추천 정보를 불러오는 데 실패했어요."); + }) + .finally(() => { + setIsLoading(false); + }); + }, []); + + return { spaceData, isLoading, error }; +} diff --git a/src/app/recommend/page.tsx b/src/app/recommend/page.tsx index 194333e..a05b774 100644 --- a/src/app/recommend/page.tsx +++ b/src/app/recommend/page.tsx @@ -1,46 +1,19 @@ "use client"; -import { useEffect, useState } from "react"; -import axios from "axios"; import SideBar from "./_components/SideBar"; import SidePanel from "./_components/SidePanel"; import BackToSurveyButton from "./_components/BackToSurveyButton"; import MapView from "./_components/MapView"; +import TransitionScreen from "@/app/_components/TransitionScreen"; +import { useSurveyRecommendation } from "./_hooks/useSurveyRecommendation"; export default function RecommendPage() { - const [spaceData, setSpaceData] = useState([]); + const { spaceData, isLoading, error } = useSurveyRecommendation(); - useEffect(() => { - const submitTodayMood = async () => { - const USID = localStorage.getItem("USID") || ""; - const onboarding = JSON.parse( - localStorage.getItem("onboardingAnswers") ?? "[]" - ); + if (isLoading) return ; - const payload = { - clientId: USID, - age: Number(onboarding[0]?.substr(0, 2) || 0), - gender: onboarding[1], - resident: onboarding[2], - city: onboarding[3], - want: onboarding[5], - mood: onboarding[6], - }; - - try { - const res = await axios.post( - "https://saegil.store/api/survey/recommendation", - payload - ); - setSpaceData(res.data); - } catch (err) { - console.error("추천 API 실패:", err); - alert("추천 정보를 불러오는 데 실패했어요."); - } - }; - - submitTodayMood(); - }, []); + // 에러 페이지 시안 완성되면 변경 + if (error) return
{error}
; return (
diff --git a/src/constants/surveyData.js b/src/constants/surveyData.ts similarity index 100% rename from src/constants/surveyData.js rename to src/constants/surveyData.ts diff --git a/src/constants/transitionData.js b/src/constants/transitionData.ts similarity index 100% rename from src/constants/transitionData.js rename to src/constants/transitionData.ts diff --git a/src/lib/apis/survey.ts b/src/lib/apis/survey.ts new file mode 100644 index 0000000..65cca9f --- /dev/null +++ b/src/lib/apis/survey.ts @@ -0,0 +1,23 @@ +import axios from "@/lib/axiosInstance"; +import { RecommendationRequest, UpdateRequest } from "../type"; + +// 사용자 설문 결과 요청 +export async function fetchRecommendation(payload: RecommendationRequest) { + try { + const res = await axios.post("/survey/recommendation", payload); + return res.data; + } catch (err) { + console.error("추천 API 실패:", err); + throw err; + } +} + +// 사용자 설문 결과 만족도 반영 요청 +export async function updateSatisfactionScore(payload: UpdateRequest) { + try { + await axios.post("/survey/update", payload); + } catch (err) { + console.error("만족도 API 호출 실패:", err); + throw err; + } +} diff --git a/src/lib/axiosInstance.ts b/src/lib/axiosInstance.ts new file mode 100644 index 0000000..016975b --- /dev/null +++ b/src/lib/axiosInstance.ts @@ -0,0 +1,7 @@ +import axios from "axios"; + +const axiosInstance = axios.create({ + baseURL: process.env.NEXT_PUBLIC_API_URL, +}); + +export default axiosInstance; diff --git a/src/lib/type.ts b/src/lib/type.ts new file mode 100644 index 0000000..b22e65f --- /dev/null +++ b/src/lib/type.ts @@ -0,0 +1,22 @@ +export interface RecommendationRequest { + clientId: string; + age: number; + gender: "남자" | "여자"; + resident: "새만금" | "군산" | "김제" | "부안"; + city: "새만금" | "군산" | "김제" | "부안"; + want: string; + mood: string; +} + +export interface RecommendationResponse { + title: string; + position: string; + category: "FESTIVAL" | "EVENT" | "TOUR" | "CULTURE"; + image: string; + url: string; +} + +export interface UpdateRequest { + clientId: string; + satisfactions: number[]; +} diff --git a/src/utils/createNewUser.ts b/src/utils/createNewUser.ts index b6cce27..1519702 100644 --- a/src/utils/createNewUser.ts +++ b/src/utils/createNewUser.ts @@ -1,6 +1,6 @@ export function createNewUser() { const time = new Date(); - const userID = + const userId = "" + time.getFullYear() + time.getMonth() + @@ -11,7 +11,7 @@ export function createNewUser() { time.getMilliseconds() + Math.floor(Math.random() * 1000); - localStorage.setItem("USID", userID); + localStorage.setItem("userId", userId); localStorage.setItem("onboardingAnswers", JSON.stringify(Array(7).fill(""))); localStorage.setItem("todayMoodAnswers", JSON.stringify(Array(2).fill(""))); }