diff --git a/src/app/_components/SurveyScreen/ProgressBar.jsx b/src/app/_components/SurveyScreen/ProgressBar.jsx index 3de8aca..54a1317 100644 --- a/src/app/_components/SurveyScreen/ProgressBar.jsx +++ b/src/app/_components/SurveyScreen/ProgressBar.jsx @@ -1,8 +1,8 @@ export default function ProgressBar({ progress }) { return ( -
+
diff --git a/src/app/_components/SurveyScreen/SurveyOption.tsx b/src/app/_components/SurveyScreen/SurveyOption.tsx index 9ccba66..edd99ac 100644 --- a/src/app/_components/SurveyScreen/SurveyOption.tsx +++ b/src/app/_components/SurveyScreen/SurveyOption.tsx @@ -16,19 +16,18 @@ export default function SurveyOption({

{text}

- +
); } diff --git a/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts b/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts index e75ee67..3d56d07 100644 --- a/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts +++ b/src/app/_components/SurveyScreen/hooks/usePostSurvey.ts @@ -4,7 +4,7 @@ import { postSurvey } from "@/lib/apis/survey"; import { SurveyRequest } from "@/lib/type"; export function usePostSurvey() { - const [isLoading, setIsLoading] = useState(true); + const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); const router = useRouter(); @@ -34,8 +34,6 @@ export function usePostSurvey() { } catch (err) { console.error(err); setIsError(true); - } finally { - setIsLoading(false); } }; diff --git a/src/app/_components/SurveyScreen/hooks/useSurvey.ts b/src/app/_components/SurveyScreen/hooks/useSurvey.ts index 9bfb13e..0f94982 100644 --- a/src/app/_components/SurveyScreen/hooks/useSurvey.ts +++ b/src/app/_components/SurveyScreen/hooks/useSurvey.ts @@ -1,5 +1,4 @@ import { useState } from "react"; -import { useRouter } from "next/navigation"; import { surveyData } from "@/constants/surveyData"; interface UseSurveyProps { @@ -8,8 +7,6 @@ interface UseSurveyProps { } export function useSurvey({ type, routing }: UseSurveyProps) { - const router = useRouter(); - const questions = surveyData[type]; const storageKey = `${type}Answers`; @@ -19,11 +16,7 @@ export function useSurvey({ type, routing }: UseSurveyProps) { const [currentQuestion, setCurrentQuestion] = useState(0); - const progress = - ((questions.length - - answers.filter((element: string) => element === "").length) / - questions.length) * - 100; + const progress = ((currentQuestion + 1) / questions.length) * 100; const handleAnswerClick = (answer: string) => { const updatedAnswers = [...answers]; @@ -40,8 +33,6 @@ export function useSurvey({ type, routing }: UseSurveyProps) { if (currentQuestion === questions.length - 1) { 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 125fd1d..9d221a8 100644 --- a/src/app/_components/SurveyScreen/index.tsx +++ b/src/app/_components/SurveyScreen/index.tsx @@ -1,11 +1,12 @@ "use client"; import { useSurvey } from "./hooks/useSurvey"; +import { usePostSurvey } from "./hooks/usePostSurvey"; +import clsx from "clsx"; 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 TransitionScreen from "@/app/_components/TransitionScreen"; import ErrorScreen from "@/components/ErrorScreen"; interface SurveyScreenProps { @@ -29,31 +30,36 @@ export default function SurveyScreen({ type, routing }: SurveyScreenProps) { const isLastQuestion = type === "todayMood" && currentQuestion === questions.length - 1; + if (isLoading && isLastQuestion) { + return ; + } if (isError) return ; return ( -
+
-
-
-

- {questions[currentQuestion].title} -

-

- {questions[currentQuestion].contents} -

-
-
- {questions[currentQuestion].items.map((item, index) => ( - handleAnswerClick(item)} - /> - ))} +
+
+
+

+ {questions[currentQuestion].title} +

+

+ {questions[currentQuestion].contents} +

+
+
+ {questions[currentQuestion].items.map((item, index) => ( + handleAnswerClick(item)} + /> + ))} +
-
+
{currentQuestion > 0 && (
-
); } diff --git a/src/app/_components/TransitionScreen/index.tsx b/src/app/_components/TransitionScreen/index.tsx index 4915d38..e418de0 100644 --- a/src/app/_components/TransitionScreen/index.tsx +++ b/src/app/_components/TransitionScreen/index.tsx @@ -19,7 +19,7 @@ export default function TransitionScreen({ if (routing) { setTimeout(() => { routing("TodayMoodSurvey"); - }, 1000); + }, 1800); } }, [transitionContent, routing]); diff --git a/src/app/globals.css b/src/app/globals.css index 691d585..a2dc0ed 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,5 +1,13 @@ @import "tailwindcss"; +@media (hover: hover) { + .hover-underline:hover { + text-decoration: underline; + } +} + +@custom-variant hover (&:hover); + body { font-family: "Pretendard Variable", @@ -19,8 +27,6 @@ body { sans-serif; } -@import "tailwindcss"; - @theme { /* Display */ --text-display: 36px; diff --git a/src/app/recommend/_components/RecommendationPanel/SkeletonCard.tsx b/src/app/recommend/_components/RecommendationPanel/SkeletonCard.tsx new file mode 100644 index 0000000..83eb1a9 --- /dev/null +++ b/src/app/recommend/_components/RecommendationPanel/SkeletonCard.tsx @@ -0,0 +1,17 @@ +import Skeleton from "@/components/Loading/Skeleton"; + +export default function SkeletonCard() { + return ( +
+
+
+ + +
+ + +
+
+
+ ); +} diff --git a/src/app/recommend/_components/RecommendationPanel/SpaceCard.tsx b/src/app/recommend/_components/RecommendationPanel/SpaceCard.tsx index 8dc5127..35066f9 100644 --- a/src/app/recommend/_components/RecommendationPanel/SpaceCard.tsx +++ b/src/app/recommend/_components/RecommendationPanel/SpaceCard.tsx @@ -18,7 +18,7 @@ export default function SpaceCard({ onClick={() => { window.open(url, "_blank"); }} - className="flex h-full w-full cursor-pointer gap-2 hover:bg-[#D1D4DC] sm:flex-col sm:gap-3" + className="flex h-full w-full cursor-pointer gap-2 sm:flex-col sm:gap-3" > + ) : isLoading ? ( +
+ {Array.from({ length: 6 }).map((_, index) => ( + + ))} +
) : (
{spaceData.map((space, index) => ( diff --git a/src/app/recommend/_components/SatisfactionModalButton.tsx b/src/app/recommend/_components/SatisfactionModalButton.tsx new file mode 100644 index 0000000..78d3294 --- /dev/null +++ b/src/app/recommend/_components/SatisfactionModalButton.tsx @@ -0,0 +1,29 @@ +import Button from "@/components/Button"; + +export default function SatisfactionModalButton({ + onOpen, +}: { + onOpen: () => void; +}) { + return ( +
+
+ +
+
+

+ 서비스 이용은 어떠셨나요? +
+ 소중한 의견으로 더 나은 서비스를 만들게요! +

+
+
+
+ ); +} diff --git a/src/app/recommend/page.tsx b/src/app/recommend/page.tsx index 6215e38..cff850a 100644 --- a/src/app/recommend/page.tsx +++ b/src/app/recommend/page.tsx @@ -5,18 +5,15 @@ import { useGetRecommendation } from "./_hooks/useGetRecommendation"; import NavBar from "./_components/NavBar"; import RecommendationPanel from "./_components/RecommendationPanel"; import MapView from "./_components/MapView"; -import Button from "@/components/Button"; import Modal from "@/components/Modal"; import SatisfactionModalContent from "./_components/SatisfactionModalContent"; -import TransitionScreen from "@/app/_components/TransitionScreen"; +import SatisfactionModalButton from "./_components/SatisfactionModalButton"; export default function RecommendPage() { const [isOpen, setIsOpen] = useState(false); const { spaceData, isLoading, isError } = useGetRecommendation(); - if (isLoading) return ; - return ( <>
@@ -28,16 +25,14 @@ export default function RecommendPage() {
- +
- + setIsOpen(true)} />
diff --git a/src/app/submit-success/page.tsx b/src/app/submit-success/page.tsx index 8efde51..3c99f74 100644 --- a/src/app/submit-success/page.tsx +++ b/src/app/submit-success/page.tsx @@ -1,8 +1,12 @@ "use client"; import { useRouter } from "next/navigation"; -import Link from "next/link"; import Button from "@/components/Button"; +import Image from "next/image"; +import SurveyComplete from "@/assets/images/survey-complete.png"; + +const GOOGLE_FORM_LINK = + "https://docs.google.com/forms/d/e/1FAIpQLSe5OJjg2hqPTtCszkh10CwrS39eVCf_iFfmP-21ago8KUL42w/viewform?usp=dialog"; export default function SubmitSuccessPage() { const router = useRouter(); @@ -13,17 +17,38 @@ export default function SubmitSuccessPage() { }; return ( -
-

설문에 응해주셔서 감사합니다

- - 서비스를 평가하고 아메리카노를 받아가세요! - +
+
+ +
+

+ 설문 완료! +
+ 이제 커피 받으러 가볼까요? +

+ +
+
); diff --git a/src/assets/images/commute_recommendation.png b/src/assets/images/commute_recommendation.png index d144b3f..782d57e 100644 Binary files a/src/assets/images/commute_recommendation.png and b/src/assets/images/commute_recommendation.png differ diff --git a/src/assets/images/mood_finder.png b/src/assets/images/mood_finder.png index 7ccef91..6bce52e 100644 Binary files a/src/assets/images/mood_finder.png and b/src/assets/images/mood_finder.png differ diff --git a/src/assets/images/survey-complete.png b/src/assets/images/survey-complete.png new file mode 100644 index 0000000..5834098 Binary files /dev/null and b/src/assets/images/survey-complete.png differ diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index 065d598..829ecdb 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -22,8 +22,10 @@ export default function Button({