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("")));
}