From 93f7444df6780e7b0d57bcc61fc178b64db9eb59 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Sun, 12 Oct 2025 17:59:47 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[style]=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=8A=AC=EB=9D=BC=EC=9D=B4=EB=93=9C=20?= =?UTF-8?q?=ED=8D=BC=EB=B8=94=EB=A6=AC=EC=8B=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/page.tsx | 3 + src/domains/main/mainSlide/MainSlide.tsx | 16 ++++ src/domains/main/mainSlide/MainSlideAbv.tsx | 74 ++++++++++++++++ .../main/mainSlide/MainSlideCommunity.tsx | 19 +++++ src/domains/main/mainSlide/MainSlideIntro.tsx | 8 ++ src/domains/main/mainSlide/MainSlideTest.tsx | 65 ++++++++++++++ .../components/MainSlideDummyCard.tsx | 32 +++++++ .../mainSlide/components/MainSsuryDrunk.tsx | 32 +++++++ .../mainSlide/components/MainTestDummy.tsx | 79 ++++++++++++++++++ src/domains/mypage/hook/useProfileSsury.tsx | 2 +- src/shared/assets/images/ssuryExam1.webp | Bin 0 -> 5334 bytes src/shared/assets/images/ssuryExam2.webp | Bin 0 -> 5574 bytes src/shared/assets/images/ssuryExam3.webp | Bin 0 -> 3962 bytes 13 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 src/domains/main/mainSlide/MainSlide.tsx create mode 100644 src/domains/main/mainSlide/MainSlideAbv.tsx create mode 100644 src/domains/main/mainSlide/MainSlideCommunity.tsx create mode 100644 src/domains/main/mainSlide/MainSlideIntro.tsx create mode 100644 src/domains/main/mainSlide/MainSlideTest.tsx create mode 100644 src/domains/main/mainSlide/components/MainSlideDummyCard.tsx create mode 100644 src/domains/main/mainSlide/components/MainSsuryDrunk.tsx create mode 100644 src/domains/main/mainSlide/components/MainTestDummy.tsx create mode 100644 src/shared/assets/images/ssuryExam1.webp create mode 100644 src/shared/assets/images/ssuryExam2.webp create mode 100644 src/shared/assets/images/ssuryExam3.webp diff --git a/src/app/page.tsx b/src/app/page.tsx index 14d51b21..5e7664f5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,7 +1,10 @@ +import MainSlide from "@/domains/main/mainSlide/MainSlide"; + export default function Home() { return (

메인페이지

+
); } diff --git a/src/domains/main/mainSlide/MainSlide.tsx b/src/domains/main/mainSlide/MainSlide.tsx new file mode 100644 index 00000000..ef845020 --- /dev/null +++ b/src/domains/main/mainSlide/MainSlide.tsx @@ -0,0 +1,16 @@ +import MainSlideAbv from "./MainSlideAbv"; +import MainSlideCommunity from "./MainSlideCommunity"; +import MainSlideIntro from "./MainSlideIntro"; +import MainSlideTest from "./MainSlideTest"; + +function MainSlide() { + return ( +
+ + + + +
+ ); +} +export default MainSlide \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideAbv.tsx b/src/domains/main/mainSlide/MainSlideAbv.tsx new file mode 100644 index 00000000..95a7f8d6 --- /dev/null +++ b/src/domains/main/mainSlide/MainSlideAbv.tsx @@ -0,0 +1,74 @@ +import Ssury1 from '@/shared/assets/ssury/ssury_level1.webp'; +import Ssury2 from '@/shared/assets/ssury/ssury_level2.webp'; +import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; +import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; +import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; +import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; +import MainSsuryDrunk from './components/MainSsuryDrunk'; + +function MainSlideAbv() { + + const SSURY_DRUNK = [ + { + id: 1, + src: Ssury1, + abv:5 + }, + { + id: 2, + src: Ssury2, + abv:11 + }, + { + id: 3, + src: Ssury3, + abv:26 + }, + { + id: 4, + src: Ssury4, + abv:46 + }, + { + id: 5, + src: Ssury5, + abv:66 + }, + { + id: 6, + src: Ssury6, + abv:86 + }, + ]; + + return ( +
+ 3 +
+

+ 내 알콜도수 +

+

+ 5도 부터 시작하는 내 알콜도수
글 작성,댓글,좋아요 / 킵 횟수에 따른 점수로 내 + 알콜도수를 올릴 수 있어요. +

+

+ 내 알콜 도수에 따른 쑤리(Ssury)의 변화를 보는 것도
또 하나의 재미요소! +

+
+
+
    + {SSURY_DRUNK.map(({ id, src, abv }) => ( +
  • + +
  • + ))} +
+
+
+ +
+
+ ); +} +export default MainSlideAbv \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideCommunity.tsx b/src/domains/main/mainSlide/MainSlideCommunity.tsx new file mode 100644 index 00000000..522456a3 --- /dev/null +++ b/src/domains/main/mainSlide/MainSlideCommunity.tsx @@ -0,0 +1,19 @@ +function MainSlideCommunity() { + return ( +
+ 2 +
+

+ 칵테일과 소통, 커뮤니티 +

+

+ 칵테일에 대해 물어볼 곳이 없어 목이 말라가는 당신!
+ 초보자부터 애호가까지 이용하는 Ssoul에선 보다 폭 넓은 칵테일 소통이 가능합니다.{' '} +

+

회원들과 소통하며 내 칵테일 솜씨를 뽐내주어도 좋아요.

+
+ +
+ ); +} +export default MainSlideCommunity \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideIntro.tsx b/src/domains/main/mainSlide/MainSlideIntro.tsx new file mode 100644 index 00000000..2fdcf7a5 --- /dev/null +++ b/src/domains/main/mainSlide/MainSlideIntro.tsx @@ -0,0 +1,8 @@ +function MainSlideIntro() { + return ( +
+

저희 사이트는여...

+
+ ); +} +export default MainSlideIntro \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideTest.tsx b/src/domains/main/mainSlide/MainSlideTest.tsx new file mode 100644 index 00000000..4e3c55e8 --- /dev/null +++ b/src/domains/main/mainSlide/MainSlideTest.tsx @@ -0,0 +1,65 @@ +import MainTestDummy from "./components/MainTestDummy"; + +const DUMMY_TEST = [ + { + id: 1, + message: '질문형 취향 찾기', + active:false + }, + { + id: 2, + message:'단계별 취향 찾기', + active:true + } +] + + + +function MainSlideTest() { + return ( +
+ 1 +
+

+ AI기반 취향테스트 +

+

+ AI쑤리가 도와주는 당신의 칵테일 취향테스트
+ 칵테일을 마시러 가면 어려운 이름,설명에 지쳐 내 취향 칵테일을 찾을 기회도 없지 않으셨나요?{' '} +
+ AI쑤리(Ssury)가 당신이 궁금했던 칵테일에 대한 정보들을 해결해줄거예요! +

+
+
+
    + + 안녕하세요! 🍹바텐더 쑤리에요. +
    + 취향에 맞는 칵테일을 추천해드릴게요.
    + 어떤 유형으로 찾아드릴까요? + + } + option={DUMMY_TEST} + type="option" + /> + + + 짠🎉🎉
    + 칵테일의 자세한 정보는 '상세보기'를 클릭해서 확인할 수 있어요.
    + 마음에 드는 칵테일은 '킵' 버튼을 눌러 나만의 Bar에 저장해보세요! + + } + + type="text" + /> +
+
+
+
+ ); +} +export default MainSlideTest \ No newline at end of file diff --git a/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx b/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx new file mode 100644 index 00000000..7a206468 --- /dev/null +++ b/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx @@ -0,0 +1,32 @@ +import Keep from '@/shared/assets/icons/keep_36.svg'; +import Image from 'next/image' + +interface Props { + id:number + src: string + cocktailName:string +} + +function MainSlideDummyCard({ src,cocktailName}:Props) { + return ( +
+
+ +
+ +
+ {cocktailName} + + 상세보기 +
+ +
+ ); +} +export default MainSlideDummyCard; diff --git a/src/domains/main/mainSlide/components/MainSsuryDrunk.tsx b/src/domains/main/mainSlide/components/MainSsuryDrunk.tsx new file mode 100644 index 00000000..8efee652 --- /dev/null +++ b/src/domains/main/mainSlide/components/MainSsuryDrunk.tsx @@ -0,0 +1,32 @@ +import Image, { StaticImageData } from 'next/image' + +interface Props{ + src: StaticImageData + abv:number +} +function MainSsuryDrunk({ src, abv }: Props) { + const className = (abv:number) => { + switch (abv) { + case 5: return 'text-stone-100' + case 11: return 'text-rose-100' + case 26: return 'text-rose-50' + case 46: return 'text-rose-200' + case 66 : return 'text-rose-300' + case 86 : return 'text-red-600' + } + } + return ( +
+

+ {abv} + {abv !== 86 ? ( + % + ) : ( + %~ + )} +

+ +
+ ); +} +export default MainSsuryDrunk \ No newline at end of file diff --git a/src/domains/main/mainSlide/components/MainTestDummy.tsx b/src/domains/main/mainSlide/components/MainTestDummy.tsx new file mode 100644 index 00000000..0f164e92 --- /dev/null +++ b/src/domains/main/mainSlide/components/MainTestDummy.tsx @@ -0,0 +1,79 @@ +import Image from 'next/image'; +import Ssury from '@/shared/assets/ssury/ssury_shaker.webp'; +import clsx from 'clsx'; +import MainSlideDummyCard from './MainSlideDummyCard'; +type Dummy = { + id: number, + message: string, + active:boolean +} + +interface Props{ + message: React.ReactNode + option?: Dummy[] + type:'text'|'option' +} + +const DUMMY_CARD = [ + { + id: 1, + src: 'https://www.thecocktaildb.com/images/media/drink/fwpd0v1614006733.jpg', + cocktailName: '윈터 리타', + }, + { + id: 2, + src: 'https://www.thecocktaildb.com/images/media/drink/lnjoc81619696191.jpg', + cocktailName: '핑크 문', + }, + { + id: 3, + src: 'https://www.thecocktaildb.com/images/media/drink/pbw4e51606766578.jpg', + cocktailName: '피기 타임', + }, +]; + +function MainTestDummy({ message, option, type}:Props) { + return ( +
  • +
    +
    + 쑤리아바타 +
    +

    쑤리

    +
    +
    +

    {message}

    + +
    + {type == 'option' && + option && + option.map(({ id, message, active }) => ( + + {message} + + ))} +
    +
    + {type == 'text' && ( +
    + {DUMMY_CARD.map(({ id, src, cocktailName }) => ( + + ))} +
    + )} +
  • + ); +} +export default MainTestDummy; diff --git a/src/domains/mypage/hook/useProfileSsury.tsx b/src/domains/mypage/hook/useProfileSsury.tsx index d683fb66..08d3f7fa 100644 --- a/src/domains/mypage/hook/useProfileSsury.tsx +++ b/src/domains/mypage/hook/useProfileSsury.tsx @@ -4,7 +4,7 @@ import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; -import Image, { StaticImageData } from 'next/image'; +import { StaticImageData } from 'next/image'; const SSURY_MAP: Record = { 1: Ssury1, diff --git a/src/shared/assets/images/ssuryExam1.webp b/src/shared/assets/images/ssuryExam1.webp new file mode 100644 index 0000000000000000000000000000000000000000..0121f9d3e96704bc3ae676b1519b33bf65891ae2 GIT binary patch literal 5334 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 literal 0 HcmV?d00001 diff --git a/src/shared/assets/images/ssuryExam2.webp b/src/shared/assets/images/ssuryExam2.webp new file mode 100644 index 0000000000000000000000000000000000000000..b093d69b83744f58a8cf4dbba578cf0f6ab9c567 GIT binary patch literal 5574 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 UPTx!JEGcH;PZYcG#{V&d01 Date: Sun, 12 Oct 2025 20:49:06 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[style]=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=8A=AC=EB=9D=BC=EC=9D=B4=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/main/mainSlide/MainSlide.tsx | 62 +++++++++++++++++-- src/domains/main/mainSlide/MainSlideAbv.tsx | 2 +- .../main/mainSlide/MainSlideCommunity.tsx | 2 +- src/domains/main/mainSlide/MainSlideIntro.tsx | 2 +- src/domains/main/mainSlide/MainSlideTest.tsx | 2 +- 5 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/domains/main/mainSlide/MainSlide.tsx b/src/domains/main/mainSlide/MainSlide.tsx index ef845020..8cc007ca 100644 --- a/src/domains/main/mainSlide/MainSlide.tsx +++ b/src/domains/main/mainSlide/MainSlide.tsx @@ -1,15 +1,67 @@ +'use client' +import { useLayoutEffect, useRef } from "react"; import MainSlideAbv from "./MainSlideAbv"; import MainSlideCommunity from "./MainSlideCommunity"; import MainSlideIntro from "./MainSlideIntro"; import MainSlideTest from "./MainSlideTest"; +import gsap from 'gsap' +import { ScrollTrigger } from 'gsap/ScrollTrigger'; +gsap.registerPlugin(ScrollTrigger); function MainSlide() { + const root = useRef(null); + useLayoutEffect(() => { + + const el = root.current! + const stage = el.querySelector('.stage') as HTMLElement; + const ctx = gsap.context(() => { + const panels = Array.from(el.querySelectorAll('.panel')) + const contents = Array.from(el.querySelectorAll('.slide-content')) + + // 화면(섹션) 폭만큼 우측으로 숨기기 + gsap.set(contents, { x: () => el.clientWidth }) // ← 핵심 + + const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } }) + panels.forEach((panel, i) => { + const c = panel.querySelector('.slide-content') + if (!c) return + +const getW = (t: HTMLElement) => t.getBoundingClientRect().width; + +tl.fromTo( + c, + { x: () => stage.clientWidth }, // 오른쪽 완전 숨김 + { x: () => stage.clientWidth - getW(c), duration: 1, immediateRender: false }, // 자기 너비만큼만 노출 + i +); + }) + + ScrollTrigger.create({ + trigger: el, start: 'top top', + end: `+=${panels.length * 100}%`, + pin: true, scrub: true, animation: tl, + }) + }, root) + return () => ctx.revert() +}, []) + + return ( -
    - - - - +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    ); } diff --git a/src/domains/main/mainSlide/MainSlideAbv.tsx b/src/domains/main/mainSlide/MainSlideAbv.tsx index 95a7f8d6..a9c2263d 100644 --- a/src/domains/main/mainSlide/MainSlideAbv.tsx +++ b/src/domains/main/mainSlide/MainSlideAbv.tsx @@ -42,7 +42,7 @@ function MainSlideAbv() { ]; return ( -
    +
    3

    diff --git a/src/domains/main/mainSlide/MainSlideCommunity.tsx b/src/domains/main/mainSlide/MainSlideCommunity.tsx index 522456a3..f0d575f0 100644 --- a/src/domains/main/mainSlide/MainSlideCommunity.tsx +++ b/src/domains/main/mainSlide/MainSlideCommunity.tsx @@ -1,6 +1,6 @@ function MainSlideCommunity() { return ( -
    +
    2

    diff --git a/src/domains/main/mainSlide/MainSlideIntro.tsx b/src/domains/main/mainSlide/MainSlideIntro.tsx index 2fdcf7a5..b5bee91e 100644 --- a/src/domains/main/mainSlide/MainSlideIntro.tsx +++ b/src/domains/main/mainSlide/MainSlideIntro.tsx @@ -1,6 +1,6 @@ function MainSlideIntro() { return ( -
    +

    저희 사이트는여...

    ); diff --git a/src/domains/main/mainSlide/MainSlideTest.tsx b/src/domains/main/mainSlide/MainSlideTest.tsx index 4e3c55e8..db790d93 100644 --- a/src/domains/main/mainSlide/MainSlideTest.tsx +++ b/src/domains/main/mainSlide/MainSlideTest.tsx @@ -17,7 +17,7 @@ const DUMMY_TEST = [ function MainSlideTest() { return ( -
    +
    1

    From 5475d830386294599863f4e6f6ec2df7e70e777c Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Sun, 12 Oct 2025 21:16:28 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[docs]provider=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/layout.tsx | 2 +- src/app/recipe/[id]/page.tsx | 3 ++- .../mypage/components/pages/my-active/MyPost.tsx | 2 -- .../mypage/components/pages/my-alarm/MyAlarm.tsx | 16 +++++++++------- .../{ => components}/details/DetailItem.tsx | 5 +++-- .../{ => components}/details/DetailList.tsx | 3 ++- .../{ => components}/details/DetailMain.tsx | 4 ++-- .../{ => components}/details/DetailRecipe.tsx | 3 ++- .../details/DetailRecommendList.tsx | 0 .../{ => components}/details/DetailsHeader.tsx | 3 ++- .../recipe/components/main/CocktailFilter.tsx | 2 +- src/shared/{api => provider}/Provider.tsx | 0 12 files changed, 24 insertions(+), 19 deletions(-) rename src/domains/recipe/{ => components}/details/DetailItem.tsx (96%) rename src/domains/recipe/{ => components}/details/DetailList.tsx (95%) rename src/domains/recipe/{ => components}/details/DetailMain.tsx (96%) rename src/domains/recipe/{ => components}/details/DetailRecipe.tsx (97%) rename src/domains/recipe/{ => components}/details/DetailRecommendList.tsx (100%) rename src/domains/recipe/{ => components}/details/DetailsHeader.tsx (96%) rename src/shared/{api => provider}/Provider.tsx (100%) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 1097658b..ca186166 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -5,7 +5,7 @@ import Header from '@/shared/components/header/Header'; import FooterWrapper from '@/shared/components/footer/FooterWrapper'; import ScrollTopBtnWrapper from '@/shared/components/scroll-top/ScrollTopBtnWrapper'; import KaKaoScript from './api/kakao/KaKaoScript'; -import Provider from '@/shared/api/Provider'; +import Provider from '@/shared/provider/Provider'; import ClientInitHook from '@/domains/login/components/ClientInitHook'; export const metadata: Metadata = { diff --git a/src/app/recipe/[id]/page.tsx b/src/app/recipe/[id]/page.tsx index ad217540..45957480 100644 --- a/src/app/recipe/[id]/page.tsx +++ b/src/app/recipe/[id]/page.tsx @@ -1,5 +1,6 @@ import { getApi } from '@/app/api/config/appConfig'; -import DetailMain from '@/domains/recipe/details/DetailMain'; +import DetailMain from '@/domains/recipe/components/details/DetailMain'; + import StarBg from '@/domains/shared/components/star-bg/StarBg'; import { Metadata } from 'next'; diff --git a/src/domains/mypage/components/pages/my-active/MyPost.tsx b/src/domains/mypage/components/pages/my-active/MyPost.tsx index c17c6dc8..4e2d0201 100644 --- a/src/domains/mypage/components/pages/my-active/MyPost.tsx +++ b/src/domains/mypage/components/pages/my-active/MyPost.tsx @@ -12,12 +12,10 @@ function MyPost() { credentials: 'include', }); const json = await res.json(); - console.log(json); setMyPost(json.data.items); }; useEffect(() => { - console.log(myPost); fetchPost(); }, []); diff --git a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx index 512248bd..6e6ce1ba 100644 --- a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx +++ b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx @@ -5,11 +5,12 @@ import { getApi } from '@/app/api/config/appConfig'; import TextButton from '@/shared/components/button/TextButton'; interface MyAlarm { - notificationId: number; - title: string; - content: string; - isRead: boolean; - createdAt: Date; + id: number, + postId: number, + postTitle: string, + read: boolean, + type: string, + createdAt:Date } function MyAlarm() { @@ -21,6 +22,7 @@ function MyAlarm() { credentials: 'include', }); const json = await res.json(); + console.log(json) setMyAlarm(json.data.items); }; @@ -34,8 +36,8 @@ function MyAlarm() { 전체삭제

    {myAlarm.length !== 0 ? ( - myAlarm.map(({ notificationId, title, content }) => ( - + myAlarm.map(({ id,postTitle,type}) => ( + )) ) : (
    diff --git a/src/domains/recipe/details/DetailItem.tsx b/src/domains/recipe/components/details/DetailItem.tsx similarity index 96% rename from src/domains/recipe/details/DetailItem.tsx rename to src/domains/recipe/components/details/DetailItem.tsx index 64f10910..848cc937 100644 --- a/src/domains/recipe/details/DetailItem.tsx +++ b/src/domains/recipe/components/details/DetailItem.tsx @@ -1,8 +1,9 @@ import Image from 'next/image'; import Label from '@/domains/shared/components/label/Label'; import AbvGraph from '@/domains/shared/components/abv-graph/AbvGraph'; -import { labelTitle } from '../utills/labelTitle'; -import useGlass from '../hook/useGlass'; +import { labelTitle } from '../../utills/labelTitle'; +import useGlass from '../../hook/useGlass'; + interface Props { name: string; diff --git a/src/domains/recipe/details/DetailList.tsx b/src/domains/recipe/components/details/DetailList.tsx similarity index 95% rename from src/domains/recipe/details/DetailList.tsx rename to src/domains/recipe/components/details/DetailList.tsx index 8baabfca..90e9445f 100644 --- a/src/domains/recipe/details/DetailList.tsx +++ b/src/domains/recipe/components/details/DetailList.tsx @@ -3,8 +3,9 @@ import { useEffect, useState } from 'react'; import DetailRecommendList from './DetailRecommendList'; import { getApi } from '@/app/api/config/appConfig'; import { useParams } from 'next/navigation'; -import { RecommendCocktail } from '../types/types'; + import Link from 'next/link'; +import { RecommendCocktail } from '../../types/types'; function DetailList() { const { id } = useParams(); diff --git a/src/domains/recipe/details/DetailMain.tsx b/src/domains/recipe/components/details/DetailMain.tsx similarity index 96% rename from src/domains/recipe/details/DetailMain.tsx rename to src/domains/recipe/components/details/DetailMain.tsx index de057e02..3ee858ba 100644 --- a/src/domains/recipe/details/DetailMain.tsx +++ b/src/domains/recipe/components/details/DetailMain.tsx @@ -8,10 +8,10 @@ import SsuryDrink from '@/shared/assets/ssury/ssury_drink.webp'; import Image from 'next/image'; import DetailList from './DetailList'; import { Suspense, useEffect, useState } from 'react'; -import SkeletonDetail from '../skeleton/SkeletonDetail'; -import RecipeComment from '../components/details/RecipeComment'; import { getApi } from '@/app/api/config/appConfig'; import { useAuthStore } from '@/domains/shared/store/auth'; +import SkeletonDetail from '../../skeleton/SkeletonDetail'; +import RecipeComment from './RecipeComment'; interface Kept { cocktailId: number; diff --git a/src/domains/recipe/details/DetailRecipe.tsx b/src/domains/recipe/components/details/DetailRecipe.tsx similarity index 97% rename from src/domains/recipe/details/DetailRecipe.tsx rename to src/domains/recipe/components/details/DetailRecipe.tsx index 810ce7b1..323d00d0 100644 --- a/src/domains/recipe/details/DetailRecipe.tsx +++ b/src/domains/recipe/components/details/DetailRecipe.tsx @@ -1,4 +1,5 @@ -import { ozToMl } from '../hook/ozToMl'; +import { ozToMl } from "../../hook/ozToMl"; + type Recipe = { ingredientName: string; diff --git a/src/domains/recipe/details/DetailRecommendList.tsx b/src/domains/recipe/components/details/DetailRecommendList.tsx similarity index 100% rename from src/domains/recipe/details/DetailRecommendList.tsx rename to src/domains/recipe/components/details/DetailRecommendList.tsx diff --git a/src/domains/recipe/details/DetailsHeader.tsx b/src/domains/recipe/components/details/DetailsHeader.tsx similarity index 96% rename from src/domains/recipe/details/DetailsHeader.tsx rename to src/domains/recipe/components/details/DetailsHeader.tsx index 1e11bd91..d15c0533 100644 --- a/src/domains/recipe/details/DetailsHeader.tsx +++ b/src/domains/recipe/components/details/DetailsHeader.tsx @@ -1,10 +1,11 @@ 'use client'; import Share from '@/domains/shared/components/share/Share'; -import BackBtn from '../components/details/BackBtn'; + import Keep from '@/domains/shared/components/keep/Keep'; import { useEffect, useState } from 'react'; import ShareModal from '@/domains/shared/components/share/ShareModal'; import { getApi } from '@/app/api/config/appConfig'; +import BackBtn from './BackBtn'; interface Meta { title: string; diff --git a/src/domains/recipe/components/main/CocktailFilter.tsx b/src/domains/recipe/components/main/CocktailFilter.tsx index 1941e240..589823c6 100644 --- a/src/domains/recipe/components/main/CocktailFilter.tsx +++ b/src/domains/recipe/components/main/CocktailFilter.tsx @@ -12,7 +12,7 @@ interface Props { function CocktailFilter({ cocktailsEA, setData }: Props) { const sortMap = { 최신순: 'recent', - 인기순: 'popular', + 인기순: 'keeps', 댓글순: 'comments', }; const searchParams = useSearchParams(); diff --git a/src/shared/api/Provider.tsx b/src/shared/provider/Provider.tsx similarity index 100% rename from src/shared/api/Provider.tsx rename to src/shared/provider/Provider.tsx From 1e89a3099fa7c593d3e0203af8029e3ccd90cec3 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Sun, 12 Oct 2025 23:19:05 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[style]=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EA=B0=84?= =?UTF-8?q?=EA=B2=A9=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/layout.tsx | 3 +- src/domains/main/mainSlide/MainSlideIntro.tsx | 9 ++- src/domains/main/mainSlide/MainSlideTest.tsx | 72 ++++++++----------- .../components/MainSlideDummyCard.tsx | 2 +- .../mainSlide/components/MainTestDummy.tsx | 44 ++++++------ src/domains/mypage/components/Alarm.tsx | 13 +++- .../components/pages/my-active/MyPost.tsx | 1 + .../components/pages/my-alarm/MyAlarm.tsx | 7 +- .../recipe/components/main/Cocktails.tsx | 10 +-- src/shared/styles/global.css | 3 - 10 files changed, 84 insertions(+), 80 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f35edec6..63c1bb6a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -8,8 +8,9 @@ import KaKaoScript from './api/kakao/KaKaoScript'; import 'swiper/css'; import 'swiper/css/navigation'; import 'swiper/css/pagination'; -import Provider from '@/shared/api/Provider'; + import ClientInitHook from '@/domains/login/components/ClientInitHook'; +import Provider from '@/shared/provider/Provider'; export const metadata: Metadata = { title: { default: 'SSOUL', template: 'SSOUL | %s' }, diff --git a/src/domains/main/mainSlide/MainSlideIntro.tsx b/src/domains/main/mainSlide/MainSlideIntro.tsx index b5bee91e..c93af934 100644 --- a/src/domains/main/mainSlide/MainSlideIntro.tsx +++ b/src/domains/main/mainSlide/MainSlideIntro.tsx @@ -1,7 +1,12 @@ function MainSlideIntro() { return ( -
    -

    저희 사이트는여...

    +
    +
    +

    + 칵테일
    누구나 쉽게 즐길 수 있어요 +

    +

    SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요

    +
    ); } diff --git a/src/domains/main/mainSlide/MainSlideTest.tsx b/src/domains/main/mainSlide/MainSlideTest.tsx index db790d93..5c8a6c62 100644 --- a/src/domains/main/mainSlide/MainSlideTest.tsx +++ b/src/domains/main/mainSlide/MainSlideTest.tsx @@ -17,47 +17,37 @@ const DUMMY_TEST = [ function MainSlideTest() { return ( -
    - 1 -
    -

    - AI기반 취향테스트 -

    -

    - AI쑤리가 도와주는 당신의 칵테일 취향테스트
    - 칵테일을 마시러 가면 어려운 이름,설명에 지쳐 내 취향 칵테일을 찾을 기회도 없지 않으셨나요?{' '} -
    - AI쑤리(Ssury)가 당신이 궁금했던 칵테일에 대한 정보들을 해결해줄거예요! -

    -
    -
    -
      - - 안녕하세요! 🍹바텐더 쑤리에요. -
      - 취향에 맞는 칵테일을 추천해드릴게요.
      - 어떤 유형으로 찾아드릴까요? - - } - option={DUMMY_TEST} - type="option" - /> - - - 짠🎉🎉
      - 칵테일의 자세한 정보는 '상세보기'를 클릭해서 확인할 수 있어요.
      - 마음에 드는 칵테일은 '킵' 버튼을 눌러 나만의 Bar에 저장해보세요! - - } - - type="text" - /> -
    -
    +
    +
    + 1 +
    +
    +

    + AI기반 취향테스트 +

    +

    + 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    + AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! +

    +
    +
      + + 안녕하세요! 🍹바텐더 쑤리에요. +
      + 취향에 맞는 칵테일을 추천해드릴게요.
      + 어떤 유형으로 찾아드릴까요? + + } + option={DUMMY_TEST} + type="option" + /> + +
    +
    ); diff --git a/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx b/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx index 7a206468..3148a82b 100644 --- a/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx +++ b/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx @@ -25,7 +25,7 @@ function MainSlideDummyCard({ src,cocktailName}:Props) { {cocktailName} + 상세보기
    - +
    ); } diff --git a/src/domains/main/mainSlide/components/MainTestDummy.tsx b/src/domains/main/mainSlide/components/MainTestDummy.tsx index 0f164e92..92f28f88 100644 --- a/src/domains/main/mainSlide/components/MainTestDummy.tsx +++ b/src/domains/main/mainSlide/components/MainTestDummy.tsx @@ -9,7 +9,7 @@ type Dummy = { } interface Props{ - message: React.ReactNode + message?: React.ReactNode option?: Dummy[] type:'text'|'option' } @@ -34,7 +34,7 @@ const DUMMY_CARD = [ function MainTestDummy({ message, option, type}:Props) { return ( -
  • +
  • 쑤리

    -
    -

    {message}

    + {message && ( +
    +

    {message}

    -
    - {type == 'option' && - option && - option.map(({ id, message, active }) => ( - - {message} - - ))} +
    + {type == 'option' && + option && + option.map(({ id, message, active }) => ( + + {message} + + ))} +
    -
    + )} {type == 'text' && ( -
    +
    {DUMMY_CARD.map(({ id, src, cocktailName }) => ( - + ))}
    )} diff --git a/src/domains/mypage/components/Alarm.tsx b/src/domains/mypage/components/Alarm.tsx index 880c11cd..c916992d 100644 --- a/src/domains/mypage/components/Alarm.tsx +++ b/src/domains/mypage/components/Alarm.tsx @@ -1,5 +1,6 @@ 'use client'; import SsuryAlram from '@/shared/assets/ssury/ssury_bell.webp'; +import { elapsedTime } from '@/shared/utills/elapsedTime'; import clsx from 'clsx'; import Image from 'next/image'; import { useState } from 'react'; @@ -7,11 +8,17 @@ import { useState } from 'react'; interface Props { title: string; content: string; + createdAt:Date } -function Alarm({ title, content }: Props) { +function Alarm({ title, content,createdAt }: Props) { const [isClick, setIsClick] = useState(false); + console.log(createdAt) + const date = new Date(createdAt) + const alarmDate = `${date.getMonth() + 1}월 ${date.getDate()}일` + const time = elapsedTime(createdAt.toString()) + const handleClick = () => { setIsClick(!isClick); }; @@ -27,9 +34,9 @@ function Alarm({ title, content }: Props) {
    알람 -

    9월 18일

    +

    {alarmDate}

    -

    10분 전

    +

    {time}

    {title}

    diff --git a/src/domains/mypage/components/pages/my-active/MyPost.tsx b/src/domains/mypage/components/pages/my-active/MyPost.tsx index 4e2d0201..f2a9508e 100644 --- a/src/domains/mypage/components/pages/my-active/MyPost.tsx +++ b/src/domains/mypage/components/pages/my-active/MyPost.tsx @@ -12,6 +12,7 @@ function MyPost() { credentials: 'include', }); const json = await res.json(); + console.log(json) setMyPost(json.data.items); }; diff --git a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx index 6e6ce1ba..c553b55a 100644 --- a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx +++ b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx @@ -22,7 +22,6 @@ function MyAlarm() { credentials: 'include', }); const json = await res.json(); - console.log(json) setMyAlarm(json.data.items); }; @@ -35,15 +34,17 @@ function MyAlarm() {
    전체삭제
    +
    {myAlarm.length !== 0 ? ( - myAlarm.map(({ id,postTitle,type}) => ( - + myAlarm.map(({ id,postTitle,type,createdAt}) => ( + )) ) : (

    알림이 없습니다.

    )} +
  • ); } diff --git a/src/domains/recipe/components/main/Cocktails.tsx b/src/domains/recipe/components/main/Cocktails.tsx index 4d075d04..af7d8942 100644 --- a/src/domains/recipe/components/main/Cocktails.tsx +++ b/src/domains/recipe/components/main/Cocktails.tsx @@ -63,11 +63,11 @@ function Cocktails() { } }, [keyword, isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); - // 일반 fetch - useEffect(() => { - if (isSearching) return; - fetchData(); - }, [isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); + // // 일반 fetch + // useEffect(() => { + // if (isSearching) return; + // fetchData(); + // }, [isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); return (
    diff --git a/src/shared/styles/global.css b/src/shared/styles/global.css index 936c9ee2..79b73b37 100644 --- a/src/shared/styles/global.css +++ b/src/shared/styles/global.css @@ -15,6 +15,3 @@ background-color: var(--color-primary); } -html { - scroll-behavior: auto; /* smooth가 아닌 auto로 */ -} \ No newline at end of file From eed64d136098e181956f8a89d6d7ca705d65d40d Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 12:40:08 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[feat]=EC=95=8C=EB=A6=BC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/page.tsx | 3 +- .../mainSlide/components/MainSlide.tsx | 98 ++++++++++++++++++ .../mainSlide/components/MainSlideAbv.tsx | 73 +++++++++++++ .../components/MainSlideCommunity.tsx | 26 +++++ .../components/MainSlideDummyCard.tsx | 0 .../mainSlide/components}/MainSlideIntro.tsx | 8 +- .../mainSlide/components/MainSlideTest.tsx | 55 ++++++++++ .../mainSlide/components/MainSsuryDrunk.tsx | 4 +- .../mainSlide/components/MainTestDummy.tsx | 2 +- .../mainSlide/components/mobile/MobileAbv.tsx | 73 +++++++++++++ .../components/mobile/MobileSlide.tsx | 26 +++++ .../mobile/MobileSlideCommunity.tsx | 21 ++++ .../components/mobile/MobileSlideTest.tsx | 51 +++++++++ src/domains/main/mainSlide/MainSlide.tsx | 68 ------------ src/domains/main/mainSlide/MainSlideAbv.tsx | 74 ------------- .../main/mainSlide/MainSlideCommunity.tsx | 19 ---- src/domains/main/mainSlide/MainSlideTest.tsx | 55 ---------- src/domains/mypage/components/Alarm.tsx | 11 +- .../components/pages/my-active/MyPost.tsx | 1 - .../components/pages/my-alarm/MyAlarm.tsx | 43 +++++--- .../recipe/components/main/Cocktails.tsx | 22 ++-- src/domains/recipe/hook/useCocktails.tsx | 79 ++++++++++++++ src/shared/assets/images/main_slide.webp | Bin 0 -> 163142 bytes 23 files changed, 557 insertions(+), 255 deletions(-) create mode 100644 src/domains/main/components/mainSlide/components/MainSlide.tsx create mode 100644 src/domains/main/components/mainSlide/components/MainSlideAbv.tsx create mode 100644 src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx rename src/domains/main/{ => components}/mainSlide/components/MainSlideDummyCard.tsx (100%) rename src/domains/main/{mainSlide => components/mainSlide/components}/MainSlideIntro.tsx (50%) create mode 100644 src/domains/main/components/mainSlide/components/MainSlideTest.tsx rename src/domains/main/{ => components}/mainSlide/components/MainSsuryDrunk.tsx (88%) rename src/domains/main/{ => components}/mainSlide/components/MainTestDummy.tsx (97%) create mode 100644 src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx create mode 100644 src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx create mode 100644 src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx create mode 100644 src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx delete mode 100644 src/domains/main/mainSlide/MainSlide.tsx delete mode 100644 src/domains/main/mainSlide/MainSlideAbv.tsx delete mode 100644 src/domains/main/mainSlide/MainSlideCommunity.tsx delete mode 100644 src/domains/main/mainSlide/MainSlideTest.tsx create mode 100644 src/domains/recipe/hook/useCocktails.tsx create mode 100644 src/shared/assets/images/main_slide.webp diff --git a/src/app/page.tsx b/src/app/page.tsx index 5e7664f5..3c520aa5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,5 @@ -import MainSlide from "@/domains/main/mainSlide/MainSlide"; +import MainSlide from "@/domains/main/components/mainSlide/components/MainSlide"; + export default function Home() { return ( diff --git a/src/domains/main/components/mainSlide/components/MainSlide.tsx b/src/domains/main/components/mainSlide/components/MainSlide.tsx new file mode 100644 index 00000000..5ec477dd --- /dev/null +++ b/src/domains/main/components/mainSlide/components/MainSlide.tsx @@ -0,0 +1,98 @@ +'use client' +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import MainSlideAbv from "./MainSlideAbv"; + +import gsap from 'gsap' +import { ScrollTrigger } from 'gsap/ScrollTrigger'; +import MobileSlide from "./mobile/MobileSlide"; +import MainSlideIntro from "./MainSlideIntro"; +import MainSlideTest from "./MainSlideTest"; +import MainSlideCommunity from "./MainSlideCommunity"; + +gsap.registerPlugin(ScrollTrigger); + +function MainSlide() { + const root = useRef(null); + const [isMobile, setIsMobile] = useState(false) + + useLayoutEffect(() => { + if (window.innerWidth <= 1024) return; + const el = root.current!; + const stage = el.querySelector('.stage') as HTMLElement; + + const ctx = gsap.context(() => { + const panels = Array.from(el.querySelectorAll('.panel')); + const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } }); + + panels.forEach((panel, i) => { + const c = panel.querySelector('.slide-content'); + if (!c) return; + const stageW = () => stage.clientWidth; + const contentW = () => c.getBoundingClientRect().width; + + // 초기 위치만 세팅(여기선 여전히 invisible) + gsap.set(c, { x: stageW() }); + + // 스크롤에 따라 자기 너비만큼만 화면에 노출 + tl.to( + c, + { + x: () => stageW() - contentW(), + duration: 1, + immediateRender: false, + onStart: () => c.classList.remove('invisible'), + }, + i + ); + }); + + ScrollTrigger.create({ + trigger: el, + start: 'top top', + end: `+=${panels.length * 100}%`, + pin: true, + scrub: true, + animation: tl, + invalidateOnRefresh: true, + }); + + requestAnimationFrame(() => ScrollTrigger.refresh()); + }, root); + + return () => ctx.revert(); + }, []); + + useEffect(() => { + const handleResize = () => setIsMobile(window.innerWidth < 1024); + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, []); + + if (isMobile) { + return ( + + ) + } + + + return ( +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + ); +} +export default MainSlide \ No newline at end of file diff --git a/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx b/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx new file mode 100644 index 00000000..825a2dba --- /dev/null +++ b/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx @@ -0,0 +1,73 @@ +import Ssury1 from '@/shared/assets/ssury/ssury_level1.webp'; +import Ssury2 from '@/shared/assets/ssury/ssury_level2.webp'; +import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; +import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; +import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; +import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; +import MainSsuryDrunk from './MainSsuryDrunk'; + +function MainSlideAbv() { + + const SSURY_DRUNK = [ + { + id: 1, + src: Ssury1, + abv:5 + }, + { + id: 2, + src: Ssury2, + abv:11 + }, + { + id: 3, + src: Ssury3, + abv:26 + }, + { + id: 4, + src: Ssury4, + abv:46 + }, + { + id: 5, + src: Ssury5, + abv:66 + }, + { + id: 6, + src: Ssury6, + abv:86 + }, + ]; + + return ( +
    +
    + 3 +
    +

    + 내 알콜도수 UP +

    +

    + 5도 부터 시작하는 내 알콜도수
    글 작성,댓글,좋아요 / 킵으로 알콜도수 UP!
    + 알콜도수에 따라 변하는 쑤리(SSURY)를 보는 재미도 있어요. +

    +
    +
    +
      + {SSURY_DRUNK.map(({ id, src, abv }) => ( +
    • + +
    • + ))} +
    +
    + +
    +
    +
    +
    + ); +} +export default MainSlideAbv \ No newline at end of file diff --git a/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx b/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx new file mode 100644 index 00000000..027cb945 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx @@ -0,0 +1,26 @@ +function MainSlideCommunity() { + return ( +
    + +
    +
    + 2 +
    +

    + 술술 즐기는, 커뮤니티 +

    +

    + 칵테일에 대해 물어볼 곳이 없어 목이 마른 당신!
    + 초보자부터 애호가까지, Ssoul에서는 누구나 칵테일 이야기를 나눌 수 있어요. +
    + 회원들과 소통하면 내 칵테일 솜씨를 뽐내보세요. +

    +
    +
    + +
    + +
    + ); +} +export default MainSlideCommunity \ No newline at end of file diff --git a/src/domains/main/mainSlide/components/MainSlideDummyCard.tsx b/src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx similarity index 100% rename from src/domains/main/mainSlide/components/MainSlideDummyCard.tsx rename to src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx diff --git a/src/domains/main/mainSlide/MainSlideIntro.tsx b/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx similarity index 50% rename from src/domains/main/mainSlide/MainSlideIntro.tsx rename to src/domains/main/components/mainSlide/components/MainSlideIntro.tsx index c93af934..b2620fdf 100644 --- a/src/domains/main/mainSlide/MainSlideIntro.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx @@ -1,8 +1,12 @@ +import background from '@/shared/assets/images/main_slide.webp' +import Image from 'next/image' + function MainSlideIntro() { return ( -
    +
    +
    -

    +

    칵테일
    누구나 쉽게 즐길 수 있어요

    SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요

    diff --git a/src/domains/main/components/mainSlide/components/MainSlideTest.tsx b/src/domains/main/components/mainSlide/components/MainSlideTest.tsx new file mode 100644 index 00000000..8a4e8433 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/MainSlideTest.tsx @@ -0,0 +1,55 @@ +import MainTestDummy from "./MainTestDummy"; + +const DUMMY_TEST = [ + { + id: 1, + message: '질문형 취향 찾기', + active:false + }, + { + id: 2, + message:'단계별 취향 찾기', + active:true + } +] + + + +function MainSlideTest() { + return ( +
    + +
    + 1 +
    +
    +

    + AI기반 취향테스트 +

    +

    + 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    + AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! +

    +
    +
      + + 안녕하세요! 🍹바텐더 쑤리에요. +
      + 취향에 맞는 칵테일을 추천해드릴게요.
      + 어떤 유형으로 찾아드릴까요? + + } + option={DUMMY_TEST} + type="option" + /> + +
    +
    +
    + +
    + ); +} +export default MainSlideTest \ No newline at end of file diff --git a/src/domains/main/mainSlide/components/MainSsuryDrunk.tsx b/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx similarity index 88% rename from src/domains/main/mainSlide/components/MainSsuryDrunk.tsx rename to src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx index 8efee652..08ed79d9 100644 --- a/src/domains/main/mainSlide/components/MainSsuryDrunk.tsx +++ b/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx @@ -17,7 +17,7 @@ function MainSsuryDrunk({ src, abv }: Props) { } return (
    -

    +

    {abv} {abv !== 86 ? ( % @@ -25,7 +25,7 @@ function MainSsuryDrunk({ src, abv }: Props) { %~ )}

    - +
    ); } diff --git a/src/domains/main/mainSlide/components/MainTestDummy.tsx b/src/domains/main/components/mainSlide/components/MainTestDummy.tsx similarity index 97% rename from src/domains/main/mainSlide/components/MainTestDummy.tsx rename to src/domains/main/components/mainSlide/components/MainTestDummy.tsx index 92f28f88..5b0c7af3 100644 --- a/src/domains/main/mainSlide/components/MainTestDummy.tsx +++ b/src/domains/main/components/mainSlide/components/MainTestDummy.tsx @@ -69,7 +69,7 @@ function MainTestDummy({ message, option, type}:Props) {
    )} {type == 'text' && ( -
    +
    {DUMMY_CARD.map(({ id, src, cocktailName }) => ( ))} diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx new file mode 100644 index 00000000..81ca8b25 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx @@ -0,0 +1,73 @@ +import Ssury1 from '@/shared/assets/ssury/ssury_level1.webp'; +import Ssury2 from '@/shared/assets/ssury/ssury_level2.webp'; +import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; +import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; +import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; +import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; +import MainSsuryDrunk from '../MainSsuryDrunk'; + + +function MobileAbv() { + const SSURY_DRUNK = [ + { + id: 1, + src: Ssury1, + abv: 5, + }, + { + id: 2, + src: Ssury2, + abv: 11, + }, + { + id: 3, + src: Ssury3, + abv: 26, + }, + { + id: 4, + src: Ssury4, + abv: 46, + }, + { + id: 5, + src: Ssury5, + abv: 66, + }, + { + id: 6, + src: Ssury6, + abv: 86, + }, + ]; + + return ( +
    +
    + 3 +
    +

    + 내 알콜도수 UP +

    +

    + 5도 부터 시작하는 내 알콜도수
    글 작성,댓글,좋아요 / 킵으로 알콜도수 UP!
    + 알콜도수에 따라 변하는 쑤리(SSURY)를 보는 재미도 있어요. +

    +
    +
    +
      + {SSURY_DRUNK.map(({ id, src, abv }) => ( +
    • + +
    • + ))} +
    +
    + +
    +
    +
    +
    + ); +} +export default MobileAbv; diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx new file mode 100644 index 00000000..5b641351 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx @@ -0,0 +1,26 @@ +import Image from 'next/image' +import background from '@/shared/assets/images/main_slide.webp'; +import MobileSlideTest from './MobileSlideTest'; +import MobileSlideCommunity from './MobileSlideCommunity'; +import MobileAbv from './MobileAbv'; + + +function MobileSlide() { + return ( +
    + +

    + 칵테일
    누구나 쉽게 즐길 수 있어요 +

    +

    + SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요 +

    +
    + + + +
    +
    + ); +} +export default MobileSlide \ No newline at end of file diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx new file mode 100644 index 00000000..99547dd0 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx @@ -0,0 +1,21 @@ +function MobileSlideCommunity() { + return ( +
    +
    + 2 +
    +

    + 술술 즐기는, 커뮤니티 +

    +

    + 칵테일에 대해 물어볼 곳이 없어 목이 마른 당신!
    + 초보자부터 애호가까지, Ssoul에서는 누구나 칵테일 이야기를 나눌 수 있어요. +
    + 회원들과 소통하면 내 칵테일 솜씨를 뽐내보세요. +

    +
    +
    +
    + ); +} +export default MobileSlideCommunity \ No newline at end of file diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx new file mode 100644 index 00000000..54139371 --- /dev/null +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx @@ -0,0 +1,51 @@ +import MainTestDummy from "../MainTestDummy"; + + +const DUMMY_TEST = [ + { + id: 1, + message: '질문형 취향 찾기', + active: false, + }, + { + id: 2, + message: '단계별 취향 찾기', + active: true, + }, +]; + + +function MobileSlideTest() { + return ( +
    + 1 +
    +
    +

    + AI기반 취향테스트 +

    +

    + 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    + AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! +

    +
    +
      + + 안녕하세요! 🍹바텐더 쑤리에요. +
      + 취향에 맞는 칵테일을 추천해드릴게요.
      + 어떤 유형으로 찾아드릴까요? + + } + option={DUMMY_TEST} + type="option" + /> + +
    +
    +
    + ); +} +export default MobileSlideTest \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlide.tsx b/src/domains/main/mainSlide/MainSlide.tsx deleted file mode 100644 index 8cc007ca..00000000 --- a/src/domains/main/mainSlide/MainSlide.tsx +++ /dev/null @@ -1,68 +0,0 @@ -'use client' -import { useLayoutEffect, useRef } from "react"; -import MainSlideAbv from "./MainSlideAbv"; -import MainSlideCommunity from "./MainSlideCommunity"; -import MainSlideIntro from "./MainSlideIntro"; -import MainSlideTest from "./MainSlideTest"; -import gsap from 'gsap' -import { ScrollTrigger } from 'gsap/ScrollTrigger'; -gsap.registerPlugin(ScrollTrigger); - -function MainSlide() { - const root = useRef(null); - useLayoutEffect(() => { - - const el = root.current! - const stage = el.querySelector('.stage') as HTMLElement; - const ctx = gsap.context(() => { - const panels = Array.from(el.querySelectorAll('.panel')) - const contents = Array.from(el.querySelectorAll('.slide-content')) - - // 화면(섹션) 폭만큼 우측으로 숨기기 - gsap.set(contents, { x: () => el.clientWidth }) // ← 핵심 - - const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } }) - panels.forEach((panel, i) => { - const c = panel.querySelector('.slide-content') - if (!c) return - -const getW = (t: HTMLElement) => t.getBoundingClientRect().width; - -tl.fromTo( - c, - { x: () => stage.clientWidth }, // 오른쪽 완전 숨김 - { x: () => stage.clientWidth - getW(c), duration: 1, immediateRender: false }, // 자기 너비만큼만 노출 - i -); - }) - - ScrollTrigger.create({ - trigger: el, start: 'top top', - end: `+=${panels.length * 100}%`, - pin: true, scrub: true, animation: tl, - }) - }, root) - return () => ctx.revert() -}, []) - - - return ( -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - ); -} -export default MainSlide \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideAbv.tsx b/src/domains/main/mainSlide/MainSlideAbv.tsx deleted file mode 100644 index a9c2263d..00000000 --- a/src/domains/main/mainSlide/MainSlideAbv.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import Ssury1 from '@/shared/assets/ssury/ssury_level1.webp'; -import Ssury2 from '@/shared/assets/ssury/ssury_level2.webp'; -import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; -import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; -import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; -import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; -import MainSsuryDrunk from './components/MainSsuryDrunk'; - -function MainSlideAbv() { - - const SSURY_DRUNK = [ - { - id: 1, - src: Ssury1, - abv:5 - }, - { - id: 2, - src: Ssury2, - abv:11 - }, - { - id: 3, - src: Ssury3, - abv:26 - }, - { - id: 4, - src: Ssury4, - abv:46 - }, - { - id: 5, - src: Ssury5, - abv:66 - }, - { - id: 6, - src: Ssury6, - abv:86 - }, - ]; - - return ( -
    - 3 -
    -

    - 내 알콜도수 -

    -

    - 5도 부터 시작하는 내 알콜도수
    글 작성,댓글,좋아요 / 킵 횟수에 따른 점수로 내 - 알콜도수를 올릴 수 있어요. -

    -

    - 내 알콜 도수에 따른 쑤리(Ssury)의 변화를 보는 것도
    또 하나의 재미요소! -

    -
    -
    -
      - {SSURY_DRUNK.map(({ id, src, abv }) => ( -
    • - -
    • - ))} -
    -
    -
    - -
    -
    - ); -} -export default MainSlideAbv \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideCommunity.tsx b/src/domains/main/mainSlide/MainSlideCommunity.tsx deleted file mode 100644 index f0d575f0..00000000 --- a/src/domains/main/mainSlide/MainSlideCommunity.tsx +++ /dev/null @@ -1,19 +0,0 @@ -function MainSlideCommunity() { - return ( -
    - 2 -
    -

    - 칵테일과 소통, 커뮤니티 -

    -

    - 칵테일에 대해 물어볼 곳이 없어 목이 말라가는 당신!
    - 초보자부터 애호가까지 이용하는 Ssoul에선 보다 폭 넓은 칵테일 소통이 가능합니다.{' '} -

    -

    회원들과 소통하며 내 칵테일 솜씨를 뽐내주어도 좋아요.

    -
    - -
    - ); -} -export default MainSlideCommunity \ No newline at end of file diff --git a/src/domains/main/mainSlide/MainSlideTest.tsx b/src/domains/main/mainSlide/MainSlideTest.tsx deleted file mode 100644 index 5c8a6c62..00000000 --- a/src/domains/main/mainSlide/MainSlideTest.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import MainTestDummy from "./components/MainTestDummy"; - -const DUMMY_TEST = [ - { - id: 1, - message: '질문형 취향 찾기', - active:false - }, - { - id: 2, - message:'단계별 취향 찾기', - active:true - } -] - - - -function MainSlideTest() { - return ( -
    -
    - 1 -
    -
    -

    - AI기반 취향테스트 -

    -

    - 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    - AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! -

    -
    -
      - - 안녕하세요! 🍹바텐더 쑤리에요. -
      - 취향에 맞는 칵테일을 추천해드릴게요.
      - 어떤 유형으로 찾아드릴까요? - - } - option={DUMMY_TEST} - type="option" - /> - -
    -
    -
    -
    - ); -} -export default MainSlideTest \ No newline at end of file diff --git a/src/domains/mypage/components/Alarm.tsx b/src/domains/mypage/components/Alarm.tsx index c916992d..9d04c9d0 100644 --- a/src/domains/mypage/components/Alarm.tsx +++ b/src/domains/mypage/components/Alarm.tsx @@ -9,12 +9,11 @@ interface Props { title: string; content: string; createdAt:Date + read:boolean } -function Alarm({ title, content,createdAt }: Props) { - const [isClick, setIsClick] = useState(false); - - console.log(createdAt) +function Alarm({ title, content,createdAt,read }: Props) { + const [isClick, setIsClick] = useState(read); const date = new Date(createdAt) const alarmDate = `${date.getMonth() + 1}월 ${date.getDate()}일` const time = elapsedTime(createdAt.toString()) @@ -39,8 +38,8 @@ function Alarm({ title, content,createdAt }: Props) {

    {time}

    -

    {title}

    -

    {content}

    +

    {content}

    +

    {title}

    diff --git a/src/domains/mypage/components/pages/my-active/MyPost.tsx b/src/domains/mypage/components/pages/my-active/MyPost.tsx index f2a9508e..4e2d0201 100644 --- a/src/domains/mypage/components/pages/my-active/MyPost.tsx +++ b/src/domains/mypage/components/pages/my-active/MyPost.tsx @@ -12,7 +12,6 @@ function MyPost() { credentials: 'include', }); const json = await res.json(); - console.log(json) setMyPost(json.data.items); }; diff --git a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx index c553b55a..bfa795d1 100644 --- a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx +++ b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx @@ -3,14 +3,18 @@ import { useEffect, useState } from 'react'; import Alarm from '../../Alarm'; import { getApi } from '@/app/api/config/appConfig'; import TextButton from '@/shared/components/button/TextButton'; +import Link from 'next/link'; interface MyAlarm { - id: number, - postId: number, - postTitle: string, - read: boolean, - type: string, createdAt:Date + id: number + message: string + postCategoryName: string + postId: number + postThumbnailUrl:string| null; + postTitle: string + read: boolean + type: string } function MyAlarm() { @@ -29,21 +33,30 @@ function MyAlarm() { fetchAlarm(); }, []); + const handleRead = async (id:number) => { + await fetch(`${getApi}/me/notifications/${id}`, { + method: 'POST', + credentials:'include' + }) + } + return (
    전체삭제
    -
    - {myAlarm.length !== 0 ? ( - myAlarm.map(({ id,postTitle,type,createdAt}) => ( - - )) - ) : ( -
    -

    알림이 없습니다.

    -
    - )} +
    + {myAlarm.length !== 0 ? ( + myAlarm.map(({ id, postId, postTitle,read, message, createdAt }) => ( + handleRead(id)}> + + + )) + ) : ( +
    +

    알림이 없습니다.

    +
    + )}
    ); diff --git a/src/domains/recipe/components/main/Cocktails.tsx b/src/domains/recipe/components/main/Cocktails.tsx index af7d8942..460f49a1 100644 --- a/src/domains/recipe/components/main/Cocktails.tsx +++ b/src/domains/recipe/components/main/Cocktails.tsx @@ -41,13 +41,13 @@ function Cocktails() { : `전체 ${data.length}`; // 초기 로드 시 검색어가 있으면 검색 실행 - useEffect(() => { - const readyForFirstLoad = !isSearching && hasNextPage && lastId == null && data.length === 0; + // useEffect(() => { + // const readyForFirstLoad = !isSearching && hasNextPage && lastId == null && data.length === 0; - if (readyForFirstLoad) { - fetchData(); - } - }, [hasNextPage, lastId]); + // if (readyForFirstLoad) { + // fetchData(); + // } + // }, [hasNextPage, lastId]); // 검색어 변경 시 useEffect(() => { @@ -63,11 +63,11 @@ function Cocktails() { } }, [keyword, isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); - // // 일반 fetch - // useEffect(() => { - // if (isSearching) return; - // fetchData(); - // }, [isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); + // 일반 fetch + useEffect(() => { + if (isSearching) return; + fetchData(); + }, [isSearching, alcoholBaseTypes, alcoholStrengths, cocktailTypes]); return (
    diff --git a/src/domains/recipe/hook/useCocktails.tsx b/src/domains/recipe/hook/useCocktails.tsx new file mode 100644 index 00000000..237ed482 --- /dev/null +++ b/src/domains/recipe/hook/useCocktails.tsx @@ -0,0 +1,79 @@ +import { getApi } from "@/app/api/config/appConfig"; +import { useInfiniteQuery } from "@tanstack/react-query"; +import { Cocktail } from "../types/types"; + + +type Filters = { + base: string[]; + abv: string[]; + type: string[]; + keyword: string; + isSearching: boolean +} + +type PageResult = {items:T[], nextCursor?:number | { page : number}} + +async function fetchCocktails(cursor?: number,size = 20 ):Promise> { + + const query = new URLSearchParams() + if (cursor == null) query.set('lastId', String(cursor)) + query.set('size', size.toString()) + query.set('sortBy','recent') + + const res = await fetch (`${getApi}/cocktails?${query.toString()}`) + if(!res.ok) throw new Error('칵테일 패치 실패') + const json = await res.json() + const items = json.data ?? [] + + const next = items.length < size ? undefined : items[items.length - 1].cocktail + return {items,nextCursor:next} +} + +async function fetchSearch(page = 0, size = 20, f:Filters):Promise> { + const body = { + keyword: f.keyword || null, + alcoholStrength: f.abv ?? [], + cocktailTypes: f.type ?? [], + alcoholBaseTypes: f.base ?? [], + page, + size, + } + const res = await fetch(`/${getApi}/cocktails/search`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body:JSON.stringify(body) + }) + if(!res.ok) throw new Error ('검색 실패') + const json = await res.json() + const items = json.data ?? [] + + const next = items.length < size ? undefined : { page:page+1} + return{items,nextCursor:next} +} + + + +function useCocktails(filters:Filters, pageSize=20) { + const mode = filters.isSearching ? 'search' : 'list'; + + return useInfiniteQuery({ + queryKey: [ + 'cocktails', + { mode, base: filters.base, abv: filters.abv, type: filters.type, q: filters.keyword }, + ], + queryFn: ({ pageParam }) => { + if (mode === 'search') { + const page = typeof pageParam === 'number' ? pageParam : 0; + return fetchSearch(page, pageSize, filters); + } + const lastId = typeof pageParam === 'number' ? pageParam : undefined; + return fetchCocktails(lastId, pageSize); + }, + initialPageParam: mode === 'search' ? 0 : undefined, + getNextPageParam: (lastPage) => lastPage.nextCursor, // number(=lastId) 또는 {page} + enabled: mode === 'search' ? !!filters.keyword.trim() : true, + + staleTime: 30_000, + }); +} +export default useCocktails \ No newline at end of file diff --git a/src/shared/assets/images/main_slide.webp b/src/shared/assets/images/main_slide.webp new file mode 100644 index 0000000000000000000000000000000000000000..a6b0bbcf7b9f391d772734227aa15cbe8b4dea89 GIT binary patch literal 163142 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

    VgAN=6xrH9KDha}deU0sN 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 literal 0 HcmV?d00001 From 2a00ee7ae2240aa41554fef8d873aa4e0d3015b7 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 16:07:54 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[stype]=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=B0=98=EC=9D=91=ED=98=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainSlide/components/MainSlide.tsx | 255 ++++++++++++------ .../components/mobile/MobileSlide.tsx | 4 +- .../mypage/components/DeleteAllModal.tsx | 8 +- .../mypage/components/pages/my-bar/MyBar.tsx | 9 +- src/domains/mypage/hook/useDeleteAll.ts | 21 ++ src/domains/recipe/api/RecipeFetch.tsx | 4 +- 6 files changed, 212 insertions(+), 89 deletions(-) create mode 100644 src/domains/mypage/hook/useDeleteAll.ts diff --git a/src/domains/main/components/mainSlide/components/MainSlide.tsx b/src/domains/main/components/mainSlide/components/MainSlide.tsx index 5ec477dd..67f73fb6 100644 --- a/src/domains/main/components/mainSlide/components/MainSlide.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlide.tsx @@ -1,98 +1,187 @@ -'use client' -import { useEffect, useLayoutEffect, useRef, useState } from "react"; -import MainSlideAbv from "./MainSlideAbv"; +'use client'; +import { useEffect, useLayoutEffect, useRef, useState } from 'react'; +import MainSlideAbv from './MainSlideAbv'; -import gsap from 'gsap' +import gsap from 'gsap'; import { ScrollTrigger } from 'gsap/ScrollTrigger'; -import MobileSlide from "./mobile/MobileSlide"; -import MainSlideIntro from "./MainSlideIntro"; -import MainSlideTest from "./MainSlideTest"; -import MainSlideCommunity from "./MainSlideCommunity"; +import MobileSlide from './mobile/MobileSlide'; +import MainSlideIntro from './MainSlideIntro'; +import MainSlideTest from './MainSlideTest'; +import MainSlideCommunity from './MainSlideCommunity'; gsap.registerPlugin(ScrollTrigger); function MainSlide() { const root = useRef(null); - const [isMobile, setIsMobile] = useState(false) - - useLayoutEffect(() => { - if (window.innerWidth <= 1024) return; - const el = root.current!; - const stage = el.querySelector('.stage') as HTMLElement; - - const ctx = gsap.context(() => { - const panels = Array.from(el.querySelectorAll('.panel')); - const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } }); - - panels.forEach((panel, i) => { - const c = panel.querySelector('.slide-content'); - if (!c) return; - const stageW = () => stage.clientWidth; - const contentW = () => c.getBoundingClientRect().width; - - // 초기 위치만 세팅(여기선 여전히 invisible) - gsap.set(c, { x: stageW() }); - - // 스크롤에 따라 자기 너비만큼만 화면에 노출 - tl.to( - c, - { - x: () => stageW() - contentW(), - duration: 1, - immediateRender: false, - onStart: () => c.classList.remove('invisible'), - }, - i - ); - }); - - ScrollTrigger.create({ - trigger: el, - start: 'top top', - end: `+=${panels.length * 100}%`, - pin: true, - scrub: true, - animation: tl, - invalidateOnRefresh: true, - }); - - requestAnimationFrame(() => ScrollTrigger.refresh()); - }, root); - - return () => ctx.revert(); - }, []); - + const [isMobile, setIsMobile] = useState(false); + const [mounted, setMounted] = useState(false); + const cleanupFnRef = useRef<(() => void) | null>(null); + const resizeTimeoutRef = useRef(null); + + // 초기 마운트 useEffect(() => { - const handleResize = () => setIsMobile(window.innerWidth < 1024); - handleResize(); + setIsMobile(window.innerWidth < 1024); + setMounted(true); + + const handleResize = () => { + // 디바운스: resize 이벤트를 200ms 지연 + if (resizeTimeoutRef.current) { + clearTimeout(resizeTimeoutRef.current); + } + + resizeTimeoutRef.current = setTimeout(() => { + const newIsMobile = window.innerWidth < 1024; + + // 모바일 ↔ 데스크탑 전환 시에만 cleanup 실행 + if (newIsMobile !== isMobile) { + // GSAP을 먼저 완전히 정리 + if (cleanupFnRef.current) { + cleanupFnRef.current(); + cleanupFnRef.current = null; + } + + // 상태 업데이트 + setIsMobile(newIsMobile); + } + }, 200); + }; + window.addEventListener('resize', handleResize); - return () => window.removeEventListener('resize', handleResize); - }, []); + return () => { + window.removeEventListener('resize', handleResize); + if (resizeTimeoutRef.current) { + clearTimeout(resizeTimeoutRef.current); + } + if (cleanupFnRef.current) { + cleanupFnRef.current(); + } + }; + }, [isMobile]); - if (isMobile) { - return ( - - ) - } + // GSAP 초기화 - 데스크탑에서만 + useLayoutEffect(() => { + if (!mounted) return; + if (isMobile) return; + if (!root.current) return; + + const el = root.current; + const stage = el.querySelector('.stage') as HTMLElement; + if (!stage) return; + + // 약간의 지연을 줘서 DOM이 안정화되도록 + const timer = setTimeout(() => { + if (!root.current) return; + + const ctx = gsap.context(() => { + const panels = Array.from(el.querySelectorAll('.panel')); + const tl = gsap.timeline({ paused: true, defaults: { ease: 'none' } }); + panels.forEach((panel, i) => { + const c = panel.querySelector('.slide-content'); + if (!c) return; + const stageW = () => stage.clientWidth; + const contentW = () => c.getBoundingClientRect().width; + + gsap.set(c, { x: stageW() }); + + tl.to( + c, + { + x: () => stageW() - contentW(), + duration: 1, + immediateRender: false, + onStart: () => c.classList.remove('invisible'), + }, + i + ); + }); + + ScrollTrigger.create({ + trigger: el, + start: 'top top', + end: `+=${panels.length * 100}%`, + pin: true, + scrub: true, + animation: tl, + invalidateOnRefresh: true, + }); + + ScrollTrigger.refresh(); + }, root); + + // cleanup 함수를 ref에 저장 + cleanupFnRef.current = () => { + // ScrollTrigger를 먼저 완전히 제거 + const allTriggers = ScrollTrigger.getAll(); + allTriggers.forEach((st) => { + if (st.trigger === el || el.contains(st.trigger as Node)) { + st.kill(true); + } + }); + + // GSAP context revert + try { + ctx.revert(); + } catch (e) { + // 무시 + } + + // 혹시 남아있는 pin-spacer 수동 제거 + const pinSpacers = document.querySelectorAll('.pin-spacer'); + pinSpacers.forEach((spacer) => { + if (spacer.contains(el) || el.contains(spacer)) { + try { + const child = spacer.querySelector('section'); + if (child && spacer.parentElement) { + spacer.parentElement.appendChild(child); + } + spacer.remove(); + } catch (e) { + // 무시 + } + } + }); + }; + }, 50); + + return () => { + clearTimeout(timer); + if (cleanupFnRef.current) { + cleanupFnRef.current(); + cleanupFnRef.current = null; + } + }; + }, [isMobile, mounted]); + + // SSR 방지 + if (!mounted) { + return null; + } return ( -

    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    + <> + {isMobile ? ( + + ) : ( +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + )} + ); } -export default MainSlide \ No newline at end of file + +export default MainSlide; diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx index 5b641351..29756bb2 100644 --- a/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx @@ -7,7 +7,7 @@ import MobileAbv from './MobileAbv'; function MobileSlide() { return ( -
    +

    칵테일
    누구나 쉽게 즐길 수 있어요 @@ -20,7 +20,7 @@ function MobileSlide() {

    -
    +
    ); } export default MobileSlide \ No newline at end of file diff --git a/src/domains/mypage/components/DeleteAllModal.tsx b/src/domains/mypage/components/DeleteAllModal.tsx index f4073df5..4ec37e7f 100644 --- a/src/domains/mypage/components/DeleteAllModal.tsx +++ b/src/domains/mypage/components/DeleteAllModal.tsx @@ -1,17 +1,23 @@ import ConfirmModal from '@/shared/components/modal-pop/ConfirmModal'; +import { useDeleteAll } from '../hook/useDeleteAll'; +import { Dispatch, SetStateAction } from 'react'; interface Props { open: boolean; onClose: () => void; + setIsModal: Dispatch>; } -function DeleteAllModal({ open, onClose }: Props) { +function DeleteAllModal({ open, onClose,setIsModal }: Props) { + const {deleteBar} = useDeleteAll(setIsModal) return ( ); } diff --git a/src/domains/mypage/components/pages/my-bar/MyBar.tsx b/src/domains/mypage/components/pages/my-bar/MyBar.tsx index 3bceb240..1f91d6b8 100644 --- a/src/domains/mypage/components/pages/my-bar/MyBar.tsx +++ b/src/domains/mypage/components/pages/my-bar/MyBar.tsx @@ -5,6 +5,7 @@ import CocktailCard from '@/domains/shared/components/cocktail-card/CocktailCard import TextButton from '@/shared/components/button/TextButton'; import Link from 'next/link'; import { useEffect, useState } from 'react'; +import DeleteAllModal from '../../DeleteAllModal'; interface MyCocktail { cocktailId: number; @@ -17,6 +18,7 @@ interface MyCocktail { function MyBar() { const [myCocktail, setMyCocktail] = useState([]); + const [isModal,setIsModal] = useState(false) const fetchData = async () => { const res = await fetch(`${getApi}/me/bar/detail`, { method: 'GET', @@ -30,10 +32,15 @@ function MyBar() { fetchData(); }, []); + const handleDelete = async() => { + setIsModal(!isModal) + } + return (
    - 전체삭제 + {isModal && setIsModal(!isModal)} setIsModal={setIsModal} />} + 전체삭제
    {myCocktail.length !== 0 ? (
    > +) { + const { toastSuccess } = useToast(); + + const deleteBar= async () => { + await fetch(`${getApi}/me/bar`, { + method: 'DELETE', + credentials: 'include', + }); + + setIsClick(false); + + await toastSuccess('전부 삭제되셨습니다') + }; + return { deleteBar }; +} diff --git a/src/domains/recipe/api/RecipeFetch.tsx b/src/domains/recipe/api/RecipeFetch.tsx index a86fecb5..76bda26a 100644 --- a/src/domains/recipe/api/RecipeFetch.tsx +++ b/src/domains/recipe/api/RecipeFetch.tsx @@ -2,7 +2,7 @@ import { getApi } from '@/app/api/config/appConfig'; import { Cocktail } from '../types/types'; -import { Dispatch, SetStateAction, useCallback, useState } from 'react'; +import { Dispatch, SetStateAction, useCallback} from 'react'; import { useAuthStore } from '@/domains/shared/store/auth'; interface Props { @@ -23,7 +23,7 @@ export const RecipeFetch = ({ setHasNextPage, SIZE = 20, }: Props) => { - const user = useAuthStore(); + const user = useAuthStore(state => state.user); const fetchData = useCallback(async () => { // 쿼리파라미터에 값 넣기 if (!hasNextPage) return; From 14840b22893211bf80096b69772ddd956aafe77c Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 17:07:07 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[feat]=20=EB=82=98=EB=A7=8C=EC=9D=98=20?= =?UTF-8?q?=EB=B0=94=20=EC=82=AD=EC=A0=9C=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/mypage/api/fetchMyBar.ts | 40 +++++++++++++++++++ .../mypage/components/DeleteAllModal.tsx | 13 ++++-- .../mypage/components/pages/my-bar/MyBar.tsx | 37 +++++++++-------- src/domains/mypage/hook/useDeleteAll.ts | 21 ---------- .../recipe/components/main/Cocktails.tsx | 3 ++ 5 files changed, 71 insertions(+), 43 deletions(-) create mode 100644 src/domains/mypage/api/fetchMyBar.ts delete mode 100644 src/domains/mypage/hook/useDeleteAll.ts diff --git a/src/domains/mypage/api/fetchMyBar.ts b/src/domains/mypage/api/fetchMyBar.ts new file mode 100644 index 00000000..93bba4db --- /dev/null +++ b/src/domains/mypage/api/fetchMyBar.ts @@ -0,0 +1,40 @@ +import { getApi } from "@/app/api/config/appConfig"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; + +function useFetchMyBar() { + const queryClient = useQueryClient() + + const fetchMyBar = async () => { + const res = await fetch(`${getApi}/me/bar/detail`, { + method: 'GET', + credentials:'include' + }) + const json = await res.json() + return json.data + } + + const deleteMyBar = useMutation({ + mutationFn: async () => { + const res = await fetch(`${getApi}/me/bar`, { + method: 'DELETE', + credentials:'include' + }) + if (!res.ok) throw new Error('전체 삭제 실패') + const json = await res.json() + return json.data + }, + onMutate: async () => { + await queryClient.cancelQueries({ queryKey: ['myBar'] }); + const prev = queryClient.getQueryData(['myBar']) + queryClient.setQueryData(['myBar'], []) + return { prev } + }, + onSettled: () => { + queryClient.invalidateQueries({queryKey:['myBar']}) + } + }) + + return{fetchMyBar,deleteMyBar} +} + +export default useFetchMyBar \ No newline at end of file diff --git a/src/domains/mypage/components/DeleteAllModal.tsx b/src/domains/mypage/components/DeleteAllModal.tsx index 4ec37e7f..d5907100 100644 --- a/src/domains/mypage/components/DeleteAllModal.tsx +++ b/src/domains/mypage/components/DeleteAllModal.tsx @@ -1,6 +1,6 @@ import ConfirmModal from '@/shared/components/modal-pop/ConfirmModal'; -import { useDeleteAll } from '../hook/useDeleteAll'; import { Dispatch, SetStateAction } from 'react'; +import useFetchMyBar from '../api/fetchMyBar'; interface Props { open: boolean; @@ -9,14 +9,21 @@ interface Props { } function DeleteAllModal({ open, onClose,setIsModal }: Props) { - const {deleteBar} = useDeleteAll(setIsModal) + + const {deleteMyBar} = useFetchMyBar() + const handleDelete = () => { + deleteMyBar.mutate(undefined, { + onSuccess:() => setIsModal(false) + }) + } + return ( ); diff --git a/src/domains/mypage/components/pages/my-bar/MyBar.tsx b/src/domains/mypage/components/pages/my-bar/MyBar.tsx index 1f91d6b8..6ba7c3fb 100644 --- a/src/domains/mypage/components/pages/my-bar/MyBar.tsx +++ b/src/domains/mypage/components/pages/my-bar/MyBar.tsx @@ -1,11 +1,14 @@ 'use client'; -import { getApi } from '@/app/api/config/appConfig'; + import { abvMap } from '@/domains/mypage/utills/abvMap'; import CocktailCard from '@/domains/shared/components/cocktail-card/CocktailCard'; import TextButton from '@/shared/components/button/TextButton'; import Link from 'next/link'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import DeleteAllModal from '../../DeleteAllModal'; +import useFetchMyBar from '@/domains/mypage/api/fetchMyBar'; +import { useQuery } from '@tanstack/react-query'; + interface MyCocktail { cocktailId: number; @@ -17,32 +20,28 @@ interface MyCocktail { } function MyBar() { - const [myCocktail, setMyCocktail] = useState([]); - const [isModal,setIsModal] = useState(false) - const fetchData = async () => { - const res = await fetch(`${getApi}/me/bar/detail`, { - method: 'GET', - credentials: 'include', - }); - const json = await res.json(); - setMyCocktail(json.data.items ?? []); - }; - useEffect(() => { - fetchData(); - }, []); + const [isModal,setIsModal] = useState(false) + const { fetchMyBar} = useFetchMyBar() + const { data } = useQuery({ + queryKey: ['myBar'], + queryFn: fetchMyBar, + staleTime:0 + }) - const handleDelete = async() => { + const handleDelete = () => { setIsModal(!isModal) } + const items = data?.items ?? []; + return (
    {isModal && setIsModal(!isModal)} setIsModal={setIsModal} />} 전체삭제
    - {myCocktail.length !== 0 ? ( + {items.length > 0 ? (
    - {myCocktail.map( - ({ cocktailId, cocktailName, imageUrl, cocktailNameKo, alcoholStrength }) => { + {items.map( + ({ cocktailId, cocktailName, imageUrl, cocktailNameKo, alcoholStrength }:MyCocktail) => { const alcohol = abvMap(alcoholStrength); return ( diff --git a/src/domains/mypage/hook/useDeleteAll.ts b/src/domains/mypage/hook/useDeleteAll.ts deleted file mode 100644 index 9130a71b..00000000 --- a/src/domains/mypage/hook/useDeleteAll.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { getApi } from '@/app/api/config/appConfig'; -import { useToast } from '@/shared/hook/useToast'; -import { Dispatch, SetStateAction } from 'react'; - -export function useDeleteAll( - setIsClick: Dispatch> -) { - const { toastSuccess } = useToast(); - - const deleteBar= async () => { - await fetch(`${getApi}/me/bar`, { - method: 'DELETE', - credentials: 'include', - }); - - setIsClick(false); - - await toastSuccess('전부 삭제되셨습니다') - }; - return { deleteBar }; -} diff --git a/src/domains/recipe/components/main/Cocktails.tsx b/src/domains/recipe/components/main/Cocktails.tsx index 460f49a1..c34a09d2 100644 --- a/src/domains/recipe/components/main/Cocktails.tsx +++ b/src/domains/recipe/components/main/Cocktails.tsx @@ -9,8 +9,11 @@ import { RecipeFetch } from '../../api/RecipeFetch'; import CocktailSearchBar from './CocktailSearchBar'; import useSearchControl from '../../hook/useSearchControl'; import CocktailSearch from '../../api/CocktailSearch'; +import { useAuthStore } from '@/domains/shared/store/auth'; function Cocktails() { + const user = useAuthStore(state => state.user) + const [data, setData] = useState([]); const [lastId, setLastId] = useState(null); const [hasNextPage, setHasNextPage] = useState(true); From 3d72ff9cf6d7972e7af00918d907615741453017 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 20:57:02 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=A0=84=EC=B2=B4=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/mypage/api/fetchAlarm.ts | 38 +++++++++++++++++++ .../mypage/components/DeleteAllModal.tsx | 16 ++++++-- .../components/pages/my-alarm/MyAlarm.tsx | 35 ++++++++--------- .../mypage/components/pages/my-bar/MyBar.tsx | 2 +- 4 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 src/domains/mypage/api/fetchAlarm.ts diff --git a/src/domains/mypage/api/fetchAlarm.ts b/src/domains/mypage/api/fetchAlarm.ts new file mode 100644 index 00000000..18012e3d --- /dev/null +++ b/src/domains/mypage/api/fetchAlarm.ts @@ -0,0 +1,38 @@ +import { getApi } from "@/app/api/config/appConfig"; +import { useMutation, useQueryClient } from "@tanstack/react-query"; + +function useFetchAlarm() { + const queryClient = useQueryClient() + + const fetchAlarm = async () => { + const res = await fetch(`${getApi}/me/notifications`, { + method: 'GET', + credentials:'include' + }) + const json = await res.json() + return json.data + } + + const deleteAlarm = useMutation({ + mutationFn: async () => { + const res = await fetch(`${getApi}/me/notifications`, { + method: 'DELETE', + credentials:'include' + }) + if (!res.ok) throw new Error('알림 제거 에러') + const json = await res.json() + return json.data + }, + onMutate: async () => { + await queryClient.cancelQueries({ queryKey: ['alarm'] }) + const prev = queryClient.getQueryData(['alarm']) + queryClient.setQueryData(['alarm'], []) + return {prev} + }, + onSettled: () => { + queryClient.invalidateQueries({queryKey:['alarm']}) + } + }) + return {fetchAlarm,deleteAlarm} +} +export default useFetchAlarm \ No newline at end of file diff --git a/src/domains/mypage/components/DeleteAllModal.tsx b/src/domains/mypage/components/DeleteAllModal.tsx index d5907100..621984bc 100644 --- a/src/domains/mypage/components/DeleteAllModal.tsx +++ b/src/domains/mypage/components/DeleteAllModal.tsx @@ -1,21 +1,29 @@ import ConfirmModal from '@/shared/components/modal-pop/ConfirmModal'; import { Dispatch, SetStateAction } from 'react'; import useFetchMyBar from '../api/fetchMyBar'; +import useFetchAlarm from '../api/fetchAlarm'; interface Props { open: boolean; onClose: () => void; setIsModal: Dispatch>; + type : 'myBar' | 'myAlarm' } -function DeleteAllModal({ open, onClose,setIsModal }: Props) { +function DeleteAllModal({ open, onClose,setIsModal,type }: Props) { - const {deleteMyBar} = useFetchMyBar() - const handleDelete = () => { + const { deleteMyBar } = useFetchMyBar() + const {deleteAlarm} =useFetchAlarm() + const handleBarDelete = () => { deleteMyBar.mutate(undefined, { onSuccess:() => setIsModal(false) }) } + const handleAlarmDelete = () => { + deleteAlarm.mutate(undefined, { + onSuccess:() => setIsModal(false) + }) + } return ( ); diff --git a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx index bfa795d1..a46bdc7b 100644 --- a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx +++ b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx @@ -1,9 +1,12 @@ 'use client'; -import { useEffect, useState } from 'react'; +import { useState } from 'react'; import Alarm from '../../Alarm'; import { getApi } from '@/app/api/config/appConfig'; import TextButton from '@/shared/components/button/TextButton'; import Link from 'next/link'; +import useFetchAlarm from '@/domains/mypage/api/fetchAlarm'; +import { useQuery } from '@tanstack/react-query'; +import DeleteAllModal from '../../DeleteAllModal'; interface MyAlarm { createdAt:Date @@ -18,20 +21,16 @@ interface MyAlarm { } function MyAlarm() { - const [myAlarm, setMyAlarm] = useState([]); + const [isModal,setIsModal] = useState(false) + const {fetchAlarm} =useFetchAlarm() + const { data } = useQuery({ + queryKey: ['alarm'], + queryFn: fetchAlarm, + }) - const fetchAlarm = async () => { - const res = await fetch(`${getApi}/me/notifications`, { - method: 'GET', - credentials: 'include', - }); - const json = await res.json(); - setMyAlarm(json.data.items); - }; - - useEffect(() => { - fetchAlarm(); - }, []); + const handleDelete = () => { + setIsModal(!isModal) + } const handleRead = async (id:number) => { await fetch(`${getApi}/me/notifications/${id}`, { @@ -39,15 +38,17 @@ function MyAlarm() { credentials:'include' }) } + const items = data?.items ?? []; return (
    - 전체삭제 + {isModal && setIsModal(!isModal)} setIsModal={setIsModal} type='myAlarm' /> } + 전체삭제
    - {myAlarm.length !== 0 ? ( - myAlarm.map(({ id, postId, postTitle,read, message, createdAt }) => ( + {items.length !== 0 ? ( + items.map(({ id, postId, postTitle,read, message, createdAt }:MyAlarm) => ( handleRead(id)}> diff --git a/src/domains/mypage/components/pages/my-bar/MyBar.tsx b/src/domains/mypage/components/pages/my-bar/MyBar.tsx index 6ba7c3fb..340300ba 100644 --- a/src/domains/mypage/components/pages/my-bar/MyBar.tsx +++ b/src/domains/mypage/components/pages/my-bar/MyBar.tsx @@ -38,7 +38,7 @@ function MyBar() { return (
    - {isModal && setIsModal(!isModal)} setIsModal={setIsModal} />} + {isModal && setIsModal(!isModal)} setIsModal={setIsModal} type='myBar'/>} 전체삭제
    {items.length > 0 ? ( From a789f6503c226c44631e0217648350a8de265f61 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 21:19:03 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[style]=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EB=B0=98=EC=9D=91=ED=98=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/page.tsx | 6 +- .../mainSlide/components/MainSlideAbv.tsx | 15 ++- .../components/MainSlideCommunity.tsx | 4 +- .../components/MainSlideDummyCard.tsx | 21 ++-- .../mainSlide/components/MainSlideIntro.tsx | 12 ++- .../mainSlide/components/MainSlideTest.tsx | 70 ++++++------ .../mainSlide/components/MainSsuryDrunk.tsx | 32 +++--- .../mainSlide/components/MainTestDummy.tsx | 18 ++-- .../mainSlide/components/mobile/MobileAbv.tsx | 1 - .../components/mobile/MobileSlide.tsx | 9 +- .../mobile/MobileSlideCommunity.tsx | 2 +- .../components/mobile/MobileSlideTest.tsx | 6 +- src/domains/mypage/api/fetchAlarm.ts | 44 ++++---- src/domains/mypage/api/fetchMyBar.ts | 44 ++++---- src/domains/mypage/components/Alarm.tsx | 14 +-- .../mypage/components/DeleteAllModal.tsx | 25 +++-- .../components/pages/my-alarm/MyAlarm.tsx | 51 +++++---- .../mypage/components/pages/my-bar/MyBar.tsx | 37 ++++--- src/domains/mypage/hook/useProfileSsury.tsx | 2 +- src/domains/recipe/api/RecipeFetch.tsx | 4 +- .../recipe/components/details/DetailItem.tsx | 1 - .../components/details/DetailRecipe.tsx | 3 +- .../recipe/components/main/Cocktails.tsx | 2 +- src/domains/recipe/hook/useCocktails.tsx | 102 +++++++++--------- 24 files changed, 265 insertions(+), 260 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index f2cc9e60..30f266d2 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,12 +1,12 @@ import Landing from '@/domains/shared/components/3d/Landing'; -import MainSlide from "@/domains/main/components/mainSlide/components/MainSlide"; - +import MainSlide from '@/domains/main/components/mainSlide/components/MainSlide'; export default function Home() { return (
    -

    메인페이지

    + +
    ); } diff --git a/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx b/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx index 825a2dba..494a1a85 100644 --- a/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideAbv.tsx @@ -7,37 +7,36 @@ import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; import MainSsuryDrunk from './MainSsuryDrunk'; function MainSlideAbv() { - const SSURY_DRUNK = [ { id: 1, src: Ssury1, - abv:5 + abv: 5, }, { id: 2, src: Ssury2, - abv:11 + abv: 11, }, { id: 3, src: Ssury3, - abv:26 + abv: 26, }, { id: 4, src: Ssury4, - abv:46 + abv: 46, }, { id: 5, src: Ssury5, - abv:66 + abv: 66, }, { id: 6, src: Ssury6, - abv:86 + abv: 86, }, ]; @@ -70,4 +69,4 @@ function MainSlideAbv() {
    ); } -export default MainSlideAbv \ No newline at end of file +export default MainSlideAbv; diff --git a/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx b/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx index 027cb945..5489143d 100644 --- a/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideCommunity.tsx @@ -1,7 +1,6 @@ function MainSlideCommunity() { return (
    -
    2 @@ -19,8 +18,7 @@ function MainSlideCommunity() {
    -
    ); } -export default MainSlideCommunity \ No newline at end of file +export default MainSlideCommunity; diff --git a/src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx b/src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx index 3148a82b..18a5286e 100644 --- a/src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideDummyCard.tsx @@ -1,31 +1,24 @@ import Keep from '@/shared/assets/icons/keep_36.svg'; -import Image from 'next/image' +import Image from 'next/image'; interface Props { - id:number - src: string - cocktailName:string + id: number; + src: string; + cocktailName: string; } -function MainSlideDummyCard({ src,cocktailName}:Props) { +function MainSlideDummyCard({ src, cocktailName }: Props) { return (
    - +
    {cocktailName} + 상세보기
    - +
    ); } diff --git a/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx b/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx index b2620fdf..69ec2f03 100644 --- a/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideIntro.tsx @@ -1,17 +1,19 @@ -import background from '@/shared/assets/images/main_slide.webp' -import Image from 'next/image' +import background from '@/shared/assets/images/main_slide.webp'; +import Image from 'next/image'; function MainSlideIntro() { return (
    - +

    칵테일
    누구나 쉽게 즐길 수 있어요

    -

    SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요

    +

    + SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요 +

    ); } -export default MainSlideIntro \ No newline at end of file +export default MainSlideIntro; diff --git a/src/domains/main/components/mainSlide/components/MainSlideTest.tsx b/src/domains/main/components/mainSlide/components/MainSlideTest.tsx index 8a4e8433..c1b050a6 100644 --- a/src/domains/main/components/mainSlide/components/MainSlideTest.tsx +++ b/src/domains/main/components/mainSlide/components/MainSlideTest.tsx @@ -1,55 +1,51 @@ -import MainTestDummy from "./MainTestDummy"; +import MainTestDummy from './MainTestDummy'; const DUMMY_TEST = [ { id: 1, message: '질문형 취향 찾기', - active:false + active: false, }, { id: 2, - message:'단계별 취향 찾기', - active:true - } -] - - + message: '단계별 취향 찾기', + active: true, + }, +]; function MainSlideTest() { return (
    - +
    + 1
    - 1 -
    -
    -

    - AI기반 취향테스트 -

    -

    - 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    - AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! -

    -
    -
      - - 안녕하세요! 🍹바텐더 쑤리에요. -
      - 취향에 맞는 칵테일을 추천해드릴게요.
      - 어떤 유형으로 찾아드릴까요? - - } - option={DUMMY_TEST} - type="option" - /> - -
    +
    +

    + AI기반 취향테스트 +

    +

    + 복잡한 이름과 긴 설명 때문에 내 취향 칵테일 찾기 어려우셨나요?
    + AI쑤리가 당신에게 딱 맞는 칵테일을 추천해 드려요! +

    +
      + + 안녕하세요! 🍹바텐더 쑤리에요. +
      + 취향에 맞는 칵테일을 추천해드릴게요.
      + 어떤 유형으로 찾아드릴까요? + + } + option={DUMMY_TEST} + type="option" + /> + +
    - +
    ); } -export default MainSlideTest \ No newline at end of file +export default MainSlideTest; diff --git a/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx b/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx index 08ed79d9..1d979cf4 100644 --- a/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx +++ b/src/domains/main/components/mainSlide/components/MainSsuryDrunk.tsx @@ -1,20 +1,26 @@ -import Image, { StaticImageData } from 'next/image' +import Image, { StaticImageData } from 'next/image'; -interface Props{ - src: StaticImageData - abv:number +interface Props { + src: StaticImageData; + abv: number; } function MainSsuryDrunk({ src, abv }: Props) { - const className = (abv:number) => { + const className = (abv: number) => { switch (abv) { - case 5: return 'text-stone-100' - case 11: return 'text-rose-100' - case 26: return 'text-rose-50' - case 46: return 'text-rose-200' - case 66 : return 'text-rose-300' - case 86 : return 'text-red-600' + case 5: + return 'text-stone-100'; + case 11: + return 'text-rose-100'; + case 26: + return 'text-rose-50'; + case 46: + return 'text-rose-200'; + case 66: + return 'text-rose-300'; + case 86: + return 'text-red-600'; } - } + }; return (

    @@ -29,4 +35,4 @@ function MainSsuryDrunk({ src, abv }: Props) {

    ); } -export default MainSsuryDrunk \ No newline at end of file +export default MainSsuryDrunk; diff --git a/src/domains/main/components/mainSlide/components/MainTestDummy.tsx b/src/domains/main/components/mainSlide/components/MainTestDummy.tsx index 5b0c7af3..503acfa9 100644 --- a/src/domains/main/components/mainSlide/components/MainTestDummy.tsx +++ b/src/domains/main/components/mainSlide/components/MainTestDummy.tsx @@ -3,15 +3,15 @@ import Ssury from '@/shared/assets/ssury/ssury_shaker.webp'; import clsx from 'clsx'; import MainSlideDummyCard from './MainSlideDummyCard'; type Dummy = { - id: number, - message: string, - active:boolean -} + id: number; + message: string; + active: boolean; +}; -interface Props{ - message?: React.ReactNode - option?: Dummy[] - type:'text'|'option' +interface Props { + message?: React.ReactNode; + option?: Dummy[]; + type: 'text' | 'option'; } const DUMMY_CARD = [ @@ -32,7 +32,7 @@ const DUMMY_CARD = [ }, ]; -function MainTestDummy({ message, option, type}:Props) { +function MainTestDummy({ message, option, type }: Props) { return (
  • diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx index 81ca8b25..43b3b16a 100644 --- a/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx +++ b/src/domains/main/components/mainSlide/components/mobile/MobileAbv.tsx @@ -6,7 +6,6 @@ import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; import MainSsuryDrunk from '../MainSsuryDrunk'; - function MobileAbv() { const SSURY_DRUNK = [ { diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx index 29756bb2..c0154be0 100644 --- a/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlide.tsx @@ -1,10 +1,9 @@ -import Image from 'next/image' +import Image from 'next/image'; import background from '@/shared/assets/images/main_slide.webp'; import MobileSlideTest from './MobileSlideTest'; import MobileSlideCommunity from './MobileSlideCommunity'; import MobileAbv from './MobileAbv'; - function MobileSlide() { return (
    @@ -15,12 +14,12 @@ function MobileSlide() {

    SSOUL의 재밌고 다양한 기능들로 더 친근하게 접해보세요

    -
    +
    - +
    ); } -export default MobileSlide \ No newline at end of file +export default MobileSlide; diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx index 99547dd0..393240d5 100644 --- a/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlideCommunity.tsx @@ -18,4 +18,4 @@ function MobileSlideCommunity() {
  • ); } -export default MobileSlideCommunity \ No newline at end of file +export default MobileSlideCommunity; diff --git a/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx b/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx index 54139371..fe04895f 100644 --- a/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx +++ b/src/domains/main/components/mainSlide/components/mobile/MobileSlideTest.tsx @@ -1,5 +1,4 @@ -import MainTestDummy from "../MainTestDummy"; - +import MainTestDummy from '../MainTestDummy'; const DUMMY_TEST = [ { @@ -14,7 +13,6 @@ const DUMMY_TEST = [ }, ]; - function MobileSlideTest() { return (
    @@ -48,4 +46,4 @@ function MobileSlideTest() {
    ); } -export default MobileSlideTest \ No newline at end of file +export default MobileSlideTest; diff --git a/src/domains/mypage/api/fetchAlarm.ts b/src/domains/mypage/api/fetchAlarm.ts index 18012e3d..a28151ed 100644 --- a/src/domains/mypage/api/fetchAlarm.ts +++ b/src/domains/mypage/api/fetchAlarm.ts @@ -1,38 +1,38 @@ -import { getApi } from "@/app/api/config/appConfig"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { getApi } from '@/app/api/config/appConfig'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; function useFetchAlarm() { - const queryClient = useQueryClient() + const queryClient = useQueryClient(); const fetchAlarm = async () => { const res = await fetch(`${getApi}/me/notifications`, { method: 'GET', - credentials:'include' - }) - const json = await res.json() - return json.data - } + credentials: 'include', + }); + const json = await res.json(); + return json.data; + }; const deleteAlarm = useMutation({ mutationFn: async () => { const res = await fetch(`${getApi}/me/notifications`, { method: 'DELETE', - credentials:'include' - }) - if (!res.ok) throw new Error('알림 제거 에러') - const json = await res.json() - return json.data + credentials: 'include', + }); + if (!res.ok) throw new Error('알림 제거 에러'); + const json = await res.json(); + return json.data; }, onMutate: async () => { - await queryClient.cancelQueries({ queryKey: ['alarm'] }) - const prev = queryClient.getQueryData(['alarm']) - queryClient.setQueryData(['alarm'], []) - return {prev} + await queryClient.cancelQueries({ queryKey: ['alarm'] }); + const prev = queryClient.getQueryData(['alarm']); + queryClient.setQueryData(['alarm'], []); + return { prev }; }, onSettled: () => { - queryClient.invalidateQueries({queryKey:['alarm']}) - } - }) - return {fetchAlarm,deleteAlarm} + queryClient.invalidateQueries({ queryKey: ['alarm'] }); + }, + }); + return { fetchAlarm, deleteAlarm }; } -export default useFetchAlarm \ No newline at end of file +export default useFetchAlarm; diff --git a/src/domains/mypage/api/fetchMyBar.ts b/src/domains/mypage/api/fetchMyBar.ts index 93bba4db..d6422cc3 100644 --- a/src/domains/mypage/api/fetchMyBar.ts +++ b/src/domains/mypage/api/fetchMyBar.ts @@ -1,40 +1,40 @@ -import { getApi } from "@/app/api/config/appConfig"; -import { useMutation, useQueryClient } from "@tanstack/react-query"; +import { getApi } from '@/app/api/config/appConfig'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; function useFetchMyBar() { - const queryClient = useQueryClient() - + const queryClient = useQueryClient(); + const fetchMyBar = async () => { const res = await fetch(`${getApi}/me/bar/detail`, { method: 'GET', - credentials:'include' - }) - const json = await res.json() - return json.data - } + credentials: 'include', + }); + const json = await res.json(); + return json.data; + }; const deleteMyBar = useMutation({ mutationFn: async () => { const res = await fetch(`${getApi}/me/bar`, { method: 'DELETE', - credentials:'include' - }) - if (!res.ok) throw new Error('전체 삭제 실패') - const json = await res.json() - return json.data + credentials: 'include', + }); + if (!res.ok) throw new Error('전체 삭제 실패'); + const json = await res.json(); + return json.data; }, onMutate: async () => { await queryClient.cancelQueries({ queryKey: ['myBar'] }); - const prev = queryClient.getQueryData(['myBar']) - queryClient.setQueryData(['myBar'], []) - return { prev } + const prev = queryClient.getQueryData(['myBar']); + queryClient.setQueryData(['myBar'], []); + return { prev }; }, onSettled: () => { - queryClient.invalidateQueries({queryKey:['myBar']}) - } - }) + queryClient.invalidateQueries({ queryKey: ['myBar'] }); + }, + }); - return{fetchMyBar,deleteMyBar} + return { fetchMyBar, deleteMyBar }; } -export default useFetchMyBar \ No newline at end of file +export default useFetchMyBar; diff --git a/src/domains/mypage/components/Alarm.tsx b/src/domains/mypage/components/Alarm.tsx index 9d04c9d0..7b7b177f 100644 --- a/src/domains/mypage/components/Alarm.tsx +++ b/src/domains/mypage/components/Alarm.tsx @@ -8,16 +8,16 @@ import { useState } from 'react'; interface Props { title: string; content: string; - createdAt:Date - read:boolean + createdAt: Date; + read: boolean; } -function Alarm({ title, content,createdAt,read }: Props) { +function Alarm({ title, content, createdAt, read }: Props) { const [isClick, setIsClick] = useState(read); - const date = new Date(createdAt) - const alarmDate = `${date.getMonth() + 1}월 ${date.getDate()}일` - const time = elapsedTime(createdAt.toString()) - + const date = new Date(createdAt); + const alarmDate = `${date.getMonth() + 1}월 ${date.getDate()}일`; + const time = elapsedTime(createdAt.toString()); + const handleClick = () => { setIsClick(!isClick); }; diff --git a/src/domains/mypage/components/DeleteAllModal.tsx b/src/domains/mypage/components/DeleteAllModal.tsx index 621984bc..c7720a56 100644 --- a/src/domains/mypage/components/DeleteAllModal.tsx +++ b/src/domains/mypage/components/DeleteAllModal.tsx @@ -7,31 +7,30 @@ interface Props { open: boolean; onClose: () => void; setIsModal: Dispatch>; - type : 'myBar' | 'myAlarm' + type: 'myBar' | 'myAlarm'; } -function DeleteAllModal({ open, onClose,setIsModal,type }: Props) { - - const { deleteMyBar } = useFetchMyBar() - const {deleteAlarm} =useFetchAlarm() +function DeleteAllModal({ open, onClose, setIsModal, type }: Props) { + const { deleteMyBar } = useFetchMyBar(); + const { deleteAlarm } = useFetchAlarm(); const handleBarDelete = () => { deleteMyBar.mutate(undefined, { - onSuccess:() => setIsModal(false) - }) - } + onSuccess: () => setIsModal(false), + }); + }; const handleAlarmDelete = () => { deleteAlarm.mutate(undefined, { - onSuccess:() => setIsModal(false) - }) - } - + onSuccess: () => setIsModal(false), + }); + }; + return ( ); diff --git a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx index a46bdc7b..0124b1ee 100644 --- a/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx +++ b/src/domains/mypage/components/pages/my-alarm/MyAlarm.tsx @@ -9,46 +9,55 @@ import { useQuery } from '@tanstack/react-query'; import DeleteAllModal from '../../DeleteAllModal'; interface MyAlarm { - createdAt:Date - id: number - message: string - postCategoryName: string - postId: number - postThumbnailUrl:string| null; - postTitle: string - read: boolean - type: string + createdAt: Date; + id: number; + message: string; + postCategoryName: string; + postId: number; + postThumbnailUrl: string | null; + postTitle: string; + read: boolean; + type: string; } function MyAlarm() { - const [isModal,setIsModal] = useState(false) - const {fetchAlarm} =useFetchAlarm() + const [isModal, setIsModal] = useState(false); + const { fetchAlarm } = useFetchAlarm(); const { data } = useQuery({ queryKey: ['alarm'], queryFn: fetchAlarm, - }) + }); const handleDelete = () => { - setIsModal(!isModal) - } + setIsModal(!isModal); + }; - const handleRead = async (id:number) => { + const handleRead = async (id: number) => { await fetch(`${getApi}/me/notifications/${id}`, { method: 'POST', - credentials:'include' - }) - } + credentials: 'include', + }); + }; const items = data?.items ?? []; return (
    - {isModal && setIsModal(!isModal)} setIsModal={setIsModal} type='myAlarm' /> } - 전체삭제 + {isModal && ( + setIsModal(!isModal)} + setIsModal={setIsModal} + type="myAlarm" + /> + )} + + 전체삭제 +
    {items.length !== 0 ? ( - items.map(({ id, postId, postTitle,read, message, createdAt }:MyAlarm) => ( + items.map(({ id, postId, postTitle, read, message, createdAt }: MyAlarm) => ( handleRead(id)}> diff --git a/src/domains/mypage/components/pages/my-bar/MyBar.tsx b/src/domains/mypage/components/pages/my-bar/MyBar.tsx index 340300ba..9ebd921d 100644 --- a/src/domains/mypage/components/pages/my-bar/MyBar.tsx +++ b/src/domains/mypage/components/pages/my-bar/MyBar.tsx @@ -9,7 +9,6 @@ import DeleteAllModal from '../../DeleteAllModal'; import useFetchMyBar from '@/domains/mypage/api/fetchMyBar'; import { useQuery } from '@tanstack/react-query'; - interface MyCocktail { cocktailId: number; cocktailName: string; @@ -20,26 +19,34 @@ interface MyCocktail { } function MyBar() { - - const [isModal,setIsModal] = useState(false) - const { fetchMyBar} = useFetchMyBar() + const [isModal, setIsModal] = useState(false); + const { fetchMyBar } = useFetchMyBar(); const { data } = useQuery({ queryKey: ['myBar'], queryFn: fetchMyBar, - staleTime:0 - }) + staleTime: 0, + }); const handleDelete = () => { - setIsModal(!isModal) - } + setIsModal(!isModal); + }; const items = data?.items ?? []; - + return (
    - {isModal && setIsModal(!isModal)} setIsModal={setIsModal} type='myBar'/>} - 전체삭제 + {isModal && ( + setIsModal(!isModal)} + setIsModal={setIsModal} + type="myBar" + /> + )} + + 전체삭제 +
    {items.length > 0 ? (
    {items.map( - ({ cocktailId, cocktailName, imageUrl, cocktailNameKo, alcoholStrength }:MyCocktail) => { + ({ + cocktailId, + cocktailName, + imageUrl, + cocktailNameKo, + alcoholStrength, + }: MyCocktail) => { const alcohol = abvMap(alcoholStrength); return ( diff --git a/src/domains/mypage/hook/useProfileSsury.tsx b/src/domains/mypage/hook/useProfileSsury.tsx index 08d3f7fa..1aa8e1d7 100644 --- a/src/domains/mypage/hook/useProfileSsury.tsx +++ b/src/domains/mypage/hook/useProfileSsury.tsx @@ -4,7 +4,7 @@ import Ssury3 from '@/shared/assets/ssury/ssury_level3.webp'; import Ssury4 from '@/shared/assets/ssury/ssury_level4.webp'; import Ssury5 from '@/shared/assets/ssury/ssury_level5.webp'; import Ssury6 from '@/shared/assets/ssury/ssury_level6.webp'; -import { StaticImageData } from 'next/image'; +import { StaticImageData } from 'next/image'; const SSURY_MAP: Record = { 1: Ssury1, diff --git a/src/domains/recipe/api/RecipeFetch.tsx b/src/domains/recipe/api/RecipeFetch.tsx index 76bda26a..39dbe35d 100644 --- a/src/domains/recipe/api/RecipeFetch.tsx +++ b/src/domains/recipe/api/RecipeFetch.tsx @@ -2,7 +2,7 @@ import { getApi } from '@/app/api/config/appConfig'; import { Cocktail } from '../types/types'; -import { Dispatch, SetStateAction, useCallback} from 'react'; +import { Dispatch, SetStateAction, useCallback } from 'react'; import { useAuthStore } from '@/domains/shared/store/auth'; interface Props { @@ -23,7 +23,7 @@ export const RecipeFetch = ({ setHasNextPage, SIZE = 20, }: Props) => { - const user = useAuthStore(state => state.user); + const user = useAuthStore((state) => state.user); const fetchData = useCallback(async () => { // 쿼리파라미터에 값 넣기 if (!hasNextPage) return; diff --git a/src/domains/recipe/components/details/DetailItem.tsx b/src/domains/recipe/components/details/DetailItem.tsx index 848cc937..09302fee 100644 --- a/src/domains/recipe/components/details/DetailItem.tsx +++ b/src/domains/recipe/components/details/DetailItem.tsx @@ -4,7 +4,6 @@ import AbvGraph from '@/domains/shared/components/abv-graph/AbvGraph'; import { labelTitle } from '../../utills/labelTitle'; import useGlass from '../../hook/useGlass'; - interface Props { name: string; nameKo: string; diff --git a/src/domains/recipe/components/details/DetailRecipe.tsx b/src/domains/recipe/components/details/DetailRecipe.tsx index 323d00d0..c565e2ac 100644 --- a/src/domains/recipe/components/details/DetailRecipe.tsx +++ b/src/domains/recipe/components/details/DetailRecipe.tsx @@ -1,5 +1,4 @@ -import { ozToMl } from "../../hook/ozToMl"; - +import { ozToMl } from '../../hook/ozToMl'; type Recipe = { ingredientName: string; diff --git a/src/domains/recipe/components/main/Cocktails.tsx b/src/domains/recipe/components/main/Cocktails.tsx index c34a09d2..a63dc93f 100644 --- a/src/domains/recipe/components/main/Cocktails.tsx +++ b/src/domains/recipe/components/main/Cocktails.tsx @@ -12,7 +12,7 @@ import CocktailSearch from '../../api/CocktailSearch'; import { useAuthStore } from '@/domains/shared/store/auth'; function Cocktails() { - const user = useAuthStore(state => state.user) + const user = useAuthStore((state) => state.user); const [data, setData] = useState([]); const [lastId, setLastId] = useState(null); diff --git a/src/domains/recipe/hook/useCocktails.tsx b/src/domains/recipe/hook/useCocktails.tsx index 237ed482..a38399bd 100644 --- a/src/domains/recipe/hook/useCocktails.tsx +++ b/src/domains/recipe/hook/useCocktails.tsx @@ -1,35 +1,33 @@ -import { getApi } from "@/app/api/config/appConfig"; -import { useInfiniteQuery } from "@tanstack/react-query"; -import { Cocktail } from "../types/types"; - +import { getApi } from '@/app/api/config/appConfig'; +import { useInfiniteQuery } from '@tanstack/react-query'; +import { Cocktail } from '../types/types'; type Filters = { base: string[]; abv: string[]; type: string[]; keyword: string; - isSearching: boolean -} + isSearching: boolean; +}; + +type PageResult = { items: T[]; nextCursor?: number | { page: number } }; -type PageResult = {items:T[], nextCursor?:number | { page : number}} +async function fetchCocktails(cursor?: number, size = 20): Promise> { + const query = new URLSearchParams(); + if (cursor == null) query.set('lastId', String(cursor)); + query.set('size', size.toString()); + query.set('sortBy', 'recent'); -async function fetchCocktails(cursor?: number,size = 20 ):Promise> { - - const query = new URLSearchParams() - if (cursor == null) query.set('lastId', String(cursor)) - query.set('size', size.toString()) - query.set('sortBy','recent') + const res = await fetch(`${getApi}/cocktails?${query.toString()}`); + if (!res.ok) throw new Error('칵테일 패치 실패'); + const json = await res.json(); + const items = json.data ?? []; - const res = await fetch (`${getApi}/cocktails?${query.toString()}`) - if(!res.ok) throw new Error('칵테일 패치 실패') - const json = await res.json() - const items = json.data ?? [] - - const next = items.length < size ? undefined : items[items.length - 1].cocktail - return {items,nextCursor:next} + const next = items.length < size ? undefined : items[items.length - 1].cocktail; + return { items, nextCursor: next }; } -async function fetchSearch(page = 0, size = 20, f:Filters):Promise> { +async function fetchSearch(page = 0, size = 20, f: Filters): Promise> { const body = { keyword: f.keyword || null, alcoholStrength: f.abv ?? [], @@ -37,43 +35,41 @@ async function fetchSearch(page = 0, size = 20, f:Filters):Promise { - if (mode === 'search') { - const page = typeof pageParam === 'number' ? pageParam : 0; - return fetchSearch(page, pageSize, filters); - } - const lastId = typeof pageParam === 'number' ? pageParam : undefined; - return fetchCocktails(lastId, pageSize); - }, - initialPageParam: mode === 'search' ? 0 : undefined, - getNextPageParam: (lastPage) => lastPage.nextCursor, // number(=lastId) 또는 {page} - enabled: mode === 'search' ? !!filters.keyword.trim() : true, + return useInfiniteQuery({ + queryKey: [ + 'cocktails', + { mode, base: filters.base, abv: filters.abv, type: filters.type, q: filters.keyword }, + ], + queryFn: ({ pageParam }) => { + if (mode === 'search') { + const page = typeof pageParam === 'number' ? pageParam : 0; + return fetchSearch(page, pageSize, filters); + } + const lastId = typeof pageParam === 'number' ? pageParam : undefined; + return fetchCocktails(lastId, pageSize); + }, + initialPageParam: mode === 'search' ? 0 : undefined, + getNextPageParam: (lastPage) => lastPage.nextCursor, // number(=lastId) 또는 {page} + enabled: mode === 'search' ? !!filters.keyword.trim() : true, - staleTime: 30_000, - }); + staleTime: 30_000, + }); } -export default useCocktails \ No newline at end of file +export default useCocktails; From e5fe975daa637d79b2f81d8742862b4ce2a9e45b Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 21:29:20 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[feat]=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=ED=91=B8=EC=8B=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/mypage/main/MyNav.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/domains/mypage/main/MyNav.tsx b/src/domains/mypage/main/MyNav.tsx index c0579e76..37bd2451 100644 --- a/src/domains/mypage/main/MyNav.tsx +++ b/src/domains/mypage/main/MyNav.tsx @@ -1,9 +1,6 @@ 'use client'; import TabMenu from '@/domains/mypage/main/TabMenu'; -import TextButton from '@/shared/components/button/TextButton'; import Link from 'next/link'; -import { useState } from 'react'; -import DeleteAllModal from '../components/DeleteAllModal'; import { usePathname } from 'next/navigation'; const MAIN_TABMENU = [ @@ -49,13 +46,11 @@ function MyNav() { const subIndex = SUB_TABMENU.findIndex((opt) => pathname.startsWith(opt.href)); const isSubActive = subIndex === -1 ? 0 : subIndex; - const [isDeleteAll, setIsDeleteAll] = useState(false); + return (
    - {isDeleteAll && ( - setIsDeleteAll(!isDeleteAll)} /> - )} +

    마이페이지 탭 메뉴

    From e3f6b64a9e336fff3904fee59f1e2916e165db96 Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 21:30:42 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[docs]=EB=AF=B8=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/mypage/main/MyNav.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/domains/mypage/main/MyNav.tsx b/src/domains/mypage/main/MyNav.tsx index 37bd2451..e4141ba7 100644 --- a/src/domains/mypage/main/MyNav.tsx +++ b/src/domains/mypage/main/MyNav.tsx @@ -46,11 +46,8 @@ function MyNav() { const subIndex = SUB_TABMENU.findIndex((opt) => pathname.startsWith(opt.href)); const isSubActive = subIndex === -1 ? 0 : subIndex; - - return (
    -

    마이페이지 탭 메뉴

    From e693077f757f9d1c9356cc545b857d16f698526e Mon Sep 17 00:00:00 2001 From: mtm1018 Date: Mon, 13 Oct 2025 21:40:39 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[style]=20=EB=A9=94=EC=9D=B83d=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EC=8B=A4?= =?UTF-8?q?=ED=97=98div=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domains/recipe/hook/useCocktails.tsx | 75 -------------------- src/domains/shared/components/3d/Landing.tsx | 1 - 2 files changed, 76 deletions(-) delete mode 100644 src/domains/recipe/hook/useCocktails.tsx diff --git a/src/domains/recipe/hook/useCocktails.tsx b/src/domains/recipe/hook/useCocktails.tsx deleted file mode 100644 index a38399bd..00000000 --- a/src/domains/recipe/hook/useCocktails.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { getApi } from '@/app/api/config/appConfig'; -import { useInfiniteQuery } from '@tanstack/react-query'; -import { Cocktail } from '../types/types'; - -type Filters = { - base: string[]; - abv: string[]; - type: string[]; - keyword: string; - isSearching: boolean; -}; - -type PageResult = { items: T[]; nextCursor?: number | { page: number } }; - -async function fetchCocktails(cursor?: number, size = 20): Promise> { - const query = new URLSearchParams(); - if (cursor == null) query.set('lastId', String(cursor)); - query.set('size', size.toString()); - query.set('sortBy', 'recent'); - - const res = await fetch(`${getApi}/cocktails?${query.toString()}`); - if (!res.ok) throw new Error('칵테일 패치 실패'); - const json = await res.json(); - const items = json.data ?? []; - - const next = items.length < size ? undefined : items[items.length - 1].cocktail; - return { items, nextCursor: next }; -} - -async function fetchSearch(page = 0, size = 20, f: Filters): Promise> { - const body = { - keyword: f.keyword || null, - alcoholStrength: f.abv ?? [], - cocktailTypes: f.type ?? [], - alcoholBaseTypes: f.base ?? [], - page, - size, - }; - const res = await fetch(`/${getApi}/cocktails/search`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }); - if (!res.ok) throw new Error('검색 실패'); - const json = await res.json(); - const items = json.data ?? []; - - const next = items.length < size ? undefined : { page: page + 1 }; - return { items, nextCursor: next }; -} - -function useCocktails(filters: Filters, pageSize = 20) { - const mode = filters.isSearching ? 'search' : 'list'; - - return useInfiniteQuery({ - queryKey: [ - 'cocktails', - { mode, base: filters.base, abv: filters.abv, type: filters.type, q: filters.keyword }, - ], - queryFn: ({ pageParam }) => { - if (mode === 'search') { - const page = typeof pageParam === 'number' ? pageParam : 0; - return fetchSearch(page, pageSize, filters); - } - const lastId = typeof pageParam === 'number' ? pageParam : undefined; - return fetchCocktails(lastId, pageSize); - }, - initialPageParam: mode === 'search' ? 0 : undefined, - getNextPageParam: (lastPage) => lastPage.nextCursor, // number(=lastId) 또는 {page} - enabled: mode === 'search' ? !!filters.keyword.trim() : true, - - staleTime: 30_000, - }); -} -export default useCocktails; diff --git a/src/domains/shared/components/3d/Landing.tsx b/src/domains/shared/components/3d/Landing.tsx index abf77bff..ceded718 100644 --- a/src/domains/shared/components/3d/Landing.tsx +++ b/src/domains/shared/components/3d/Landing.tsx @@ -16,7 +16,6 @@ function Landing() { setIsLoading(false)} /> {!isLoading && }
    -
    );