diff --git a/next.config.ts b/next.config.ts index 0ecd118..aeb8204 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,17 +2,6 @@ import type { NextConfig } from 'next'; const nextConfig: NextConfig = { - // TurboPack 설정 - experimental: { - turbo: { - rules: { - '*.svg': { - loaders: ['@svgr/webpack'], - as: '*.js', - }, - }, - }, - }, // webpack 설정 webpack: (config) => { // @ts-expect-error 타입 에러 무시 @@ -42,6 +31,14 @@ const nextConfig: NextConfig = { fileLoaderRule.exclude = /\.svg$/i; return config; }, + turbopack: { + rules: { + '*.svg': { + loaders: ['@svgr/webpack'], + as: '*.js', + }, + } + }, }; export default nextConfig; diff --git a/src/api/index.ts b/src/api/index.ts deleted file mode 100644 index 344a3d3..0000000 --- a/src/api/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// 서버에서 불러오는 것 - -// 공통불러오는 것 -// 페이지 불러오는 것 diff --git a/src/app/api/login/set-pre-login-path/route.ts b/src/app/api/login/set-pre-login-path/route.ts new file mode 100644 index 0000000..248d5eb --- /dev/null +++ b/src/app/api/login/set-pre-login-path/route.ts @@ -0,0 +1,18 @@ +import { NextRequest, NextResponse } from 'next/server'; + +export async function POST(req: NextRequest) { + const { path } = await req.json(); // 클라이언트가 보내는 페이지 경로 + const res = NextResponse.json({ ok: true }); + + res.cookies.set({ + name: 'preLoginPath', + value: path, + path: '/', + maxAge: 60 * 30, // 30분 + httpOnly: false, // JS에서 읽을 수 있게 + secure: process.env.NODE_ENV === 'production', + sameSite: 'lax', + }); + + return res; +} diff --git a/src/app/community/[id]/page.tsx b/src/app/community/[id]/page.tsx new file mode 100644 index 0000000..0604213 --- /dev/null +++ b/src/app/community/[id]/page.tsx @@ -0,0 +1,29 @@ +import CommentList from '@/domains/community/detail/comment/CommentList'; +import DetailComment from '@/domains/community/detail/comment/DetailComment'; +import DetailContent from '@/domains/community/detail/DetailContent'; +import DetailHeader from '@/domains/community/detail/DetailHeader'; +import DetailTitle from '@/domains/community/detail/DetailTitle'; +import DetailTabDesktop from '@/domains/community/detail/tab/DetailTabDesktop'; +import StarBg from '@/domains/shared/starBg/StarBg'; + +function Page() { + return ( +
+ +
+ + + +
+ + +
+
+
+ +
+
+ ); +} + +export default Page; diff --git a/src/app/community/page.tsx b/src/app/community/page.tsx index 84390d4..26ccd9d 100644 --- a/src/app/community/page.tsx +++ b/src/app/community/page.tsx @@ -1,37 +1,45 @@ -import CommunityFilter from '@/shared/components/community/CommunityFilter'; -import CommunityHeader from '@/shared/components/community/CommunityHeader'; -import CommunityTab from '@/shared/components/community/CommunityTab'; -import PostCard from '@/shared/components/community/PostCard'; -import WriteBtn from '@/shared/components/community/WriteBtn'; +import CommunityFilter from '@/domains/community/CommunityFilter'; +import CommunityTab from '@/domains/community/CommunityTab'; +import PostCard from '@/domains/community/PostCard'; +import WriteBtn from '@/domains/community/WriteBtn'; +import PageHeader from '@/domains/shared/pageHeader/PageHeader'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: '커뮤니티', + description: '칵테일에 관한 모든 이야기', +}; function Page() { return ( -
-
-
-

- 커뮤니티 페이지 -

- -
+
+ +
+
+
+

+ 커뮤니티 페이지 +

+
-
- - -
+
+ + +
-
- - - - - -
+
+ + + + + +
+
-
+ ); } export default Page; diff --git a/src/app/community/write/page.tsx b/src/app/community/write/page.tsx new file mode 100644 index 0000000..d52dcb0 --- /dev/null +++ b/src/app/community/write/page.tsx @@ -0,0 +1,5 @@ +function Page() { + return
; +} + +export default Page; diff --git a/src/app/design-system/page.tsx b/src/app/design-system/page.tsx index ad3e5cb..ca12035 100644 --- a/src/app/design-system/page.tsx +++ b/src/app/design-system/page.tsx @@ -7,11 +7,12 @@ import { useState } from 'react'; import { customToast } from '@/shared/components/toast/CustomToastUtils'; import ModalLayout from '@/shared/components/modalPop/ModalLayout'; import ConfirmPop from '@/shared/components/modalPop/ConfirmPop'; -import SelectBox from '@/shared/components/InputBox/SelectBox'; -import LikeBtn from '@/shared/components/like/LikeBtn'; -import Share from '@/shared/components/share/Share'; -import Keep from '@/shared/components/keep/Keep'; +import SelectBox from '@/domains/shared/select-box/SelectBox'; + import Spinner from '@/shared/components/spinner/Spinner'; +import LikeBtn from '@/domains/community/components/like/LikeBtn'; +import Share from '@/domains/shared/share/Share'; +import Keep from '@/domains/shared/keep/Keep'; function Page() { const [isModalOpen, setModalOpen] = useState(false); @@ -141,12 +142,12 @@ function Page() {

Icons

like

- +

Share

- - + +

keep

diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 16084e3..cef553c 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -18,10 +18,7 @@ export default function RootLayout({
-
-
- {children} -
+
{children}
diff --git a/src/app/login/first-user/page.tsx b/src/app/login/first-user/page.tsx index 7f902a4..6a939dc 100644 --- a/src/app/login/first-user/page.tsx +++ b/src/app/login/first-user/page.tsx @@ -1,4 +1,4 @@ -import LoginRedirectHandler from '@/shared/components/auth/LoginRedirectHandler'; +import LoginRedirectHandler from '@/domains/shared/auth/LoginRedirectHandler'; function Page() { return ; diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index d1e4fb8..d2548bb 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,7 +1,7 @@ import Image from 'next/image'; import type { Metadata } from 'next'; import loginBg from '@/shared/assets/images/login_bg.webp'; -import SocialLogin from './SocialLogin'; +import SocialLogin from '@/domains/login/main/SocialLogin'; export const metadata: Metadata = { title: 'SSOUL | 로그인', diff --git a/src/app/login/success/page.tsx b/src/app/login/success/page.tsx index 15766eb..25b93a4 100644 --- a/src/app/login/success/page.tsx +++ b/src/app/login/success/page.tsx @@ -1,4 +1,4 @@ -import LoginRedirectHandler from '@/shared/components/auth/LoginRedirectHandler'; +import LoginRedirectHandler from '@/domains/shared/auth/LoginRedirectHandler'; function Page() { return ; diff --git a/src/app/recipe/[id]/page.tsx b/src/app/recipe/[id]/page.tsx index 9d89ac4..8eec717 100644 --- a/src/app/recipe/[id]/page.tsx +++ b/src/app/recipe/[id]/page.tsx @@ -1,9 +1,11 @@ -import StarBg from '@/shared/components/starBg/StarBg'; +import DetailMain from '@/domains/recipe/details/DetailMain'; +import StarBg from '@/domains/shared/starBg/StarBg'; function page() { return ( -
- +
+ +
); } diff --git a/src/app/recipe/page.tsx b/src/app/recipe/page.tsx index 9f5e417..e2383b7 100644 --- a/src/app/recipe/page.tsx +++ b/src/app/recipe/page.tsx @@ -1,10 +1,10 @@ -import PageHeader from '@/shared/components/pageHeader/PageHeader'; import { Metadata } from 'next'; -import Glass from '@/shared/assets/images/recipe_page_header.webp'; -import SelectBox from '@/shared/components/InputBox/SelectBox'; +import SelectBox from '@/domains/shared/select-box/SelectBox'; import Input from '@/shared/components/InputBox/Input'; -import CocktailList from '@/shared/components/recipePage/cocktailList/CocktailList'; -import Accordion from './components/Accordion'; + +import Accordion from '../../domains/recipe/components/main/Accordion'; +import CocktailList from '@/domains/recipe/CocktailList'; +import PageHeader from '@/domains/shared/pageHeader/PageHeader'; export const metadata: Metadata = { title: 'SSOUL | 칵테일레시피', @@ -15,11 +15,7 @@ function Page() { return (
- +
diff --git a/src/app/recommend/page.tsx b/src/app/recommend/page.tsx index e8575e9..ee68e29 100644 --- a/src/app/recommend/page.tsx +++ b/src/app/recommend/page.tsx @@ -1,7 +1,7 @@ +import ChatForm from '@/domains/recommend/components/ChatForm'; +import MyChat from '@/domains/recommend/components/MyChat'; +import SsuryChat from '@/domains/recommend/components/SsuryChat'; import Bg from '@/shared/assets/images/recommend_bg.webp'; -import ChatForm from './components/ChatForm'; -import SsuryChat from './components/SsuryChat'; -import MyChat from './components/MyChat'; function Page() { return ( diff --git a/src/shared/components/community/CommunityFilter.tsx b/src/domains/community/CommunityFilter.tsx similarity index 87% rename from src/shared/components/community/CommunityFilter.tsx rename to src/domains/community/CommunityFilter.tsx index c8deedd..fa7b129 100644 --- a/src/shared/components/community/CommunityFilter.tsx +++ b/src/domains/community/CommunityFilter.tsx @@ -1,6 +1,7 @@ 'use client'; -import SelectBox from '../InputBox/SelectBox'; +import SelectBox from '../shared/select-box/SelectBox'; + function CommunityFilter() { return (
+ +
+ ); +} + +export default CommunityHeader; diff --git a/src/shared/components/community/CommunityTab.tsx b/src/domains/community/CommunityTab.tsx similarity index 100% rename from src/shared/components/community/CommunityTab.tsx rename to src/domains/community/CommunityTab.tsx diff --git a/src/shared/components/community/PostCard.tsx b/src/domains/community/PostCard.tsx similarity index 67% rename from src/shared/components/community/PostCard.tsx rename to src/domains/community/PostCard.tsx index cc672e8..2514a24 100644 --- a/src/shared/components/community/PostCard.tsx +++ b/src/domains/community/PostCard.tsx @@ -1,11 +1,13 @@ import Image from 'next/image'; import prePost from '@/shared/assets/images/prepost_img.webp'; -import PostLabel from './PostLabel'; + +import PostInfo from './PostInfo'; +import Label from '../shared/label/Label'; function PostCard({ label }: { label: string }) { return (
- +
+ {hasUserName && ( + <> +
  • 실버븬
  • + + + )} +
  • 3분 전
  • + +
  • 조회 3
  • + +
  • 댓글 3
  • + + ); +} + +export default PostInfo; diff --git a/src/domains/community/WriteBtn.tsx b/src/domains/community/WriteBtn.tsx new file mode 100644 index 0000000..f6a8752 --- /dev/null +++ b/src/domains/community/WriteBtn.tsx @@ -0,0 +1,27 @@ +'use client'; + +import Write from '@/shared/assets/icons/edit_28.svg'; +import { useRouter } from 'next/navigation'; + +type RouterType = ReturnType; + +function WriteBtn() { + const router = useRouter(); + + const handleClick = (router: RouterType) => { + router.push('/community/write'); + }; + + return ( + + ); +} + +export default WriteBtn; diff --git a/src/domains/community/components/comment/CommentBtn.tsx b/src/domains/community/components/comment/CommentBtn.tsx new file mode 100644 index 0000000..b3f497f --- /dev/null +++ b/src/domains/community/components/comment/CommentBtn.tsx @@ -0,0 +1,25 @@ +import CommentIcon from '@/shared/assets/icons/comment_28.svg'; +import { useState } from 'react'; + +function CommentBtn({ size }: { size: 'sm' | 'md' }) { + const [isClick, setIsClick] = useState(false); + + const handleClick = () => { + setIsClick(!isClick); + }; + return ( + + ); +} +export default CommentBtn; diff --git a/src/shared/components/like/LikeBtn.tsx b/src/domains/community/components/like/LikeBtn.tsx similarity index 76% rename from src/shared/components/like/LikeBtn.tsx rename to src/domains/community/components/like/LikeBtn.tsx index 48cbf5c..0ba3be4 100644 --- a/src/shared/components/like/LikeBtn.tsx +++ b/src/domains/community/components/like/LikeBtn.tsx @@ -1,7 +1,7 @@ import LikeIcon from '@/shared/assets/icons/like_28.svg'; import { useState } from 'react'; -function LikeBtn() { +function LikeBtn({ size }: { size: 'sm' | 'md' }) { const [isClick, setIsClick] = useState(false); const handleClick = () => { @@ -10,7 +10,7 @@ function LikeBtn() { return (
    + ); +} + +export default CocktailTag; diff --git a/src/domains/community/detail/DetailContent.tsx b/src/domains/community/detail/DetailContent.tsx new file mode 100644 index 0000000..e015e77 --- /dev/null +++ b/src/domains/community/detail/DetailContent.tsx @@ -0,0 +1,44 @@ +import Image from 'next/image'; +import prePost from '@/shared/assets/images/prepost_img.webp'; +import PostInfo from '../PostInfo'; +import CocktailTag from './CocktailTag'; +import DetailTabMobile from './tab/DetailTabMobile'; + +function DetailContent() { + return ( +
    +
    + 더미 이미지 +
    +
    +

    내용은 이거입니다 하하하

    +

    그런가요 안녕하세요

    +
    +

    글입니다다다다다다다다다다다다

    +

    내용은 이거입니다 하하하

    +

    그런가요 안녕하세요

    +
    +

    글입니다다다다다다다다다다다다

    +

    내용은 이거입니다 하하하

    +

    그런가요 안녕하세요

    +
    +

    글입니다다다다다다다다다다다다

    +

    내용은 이거입니다 하하하

    +

    그런가요 안녕하세요

    +
    +

    글입니다다다다다다다다다다다다

    +

    내용은 이거입니다 하하하

    +

    그런가요 안녕하세요

    +
    +

    글입니다다다다다다다다다다다다

    +
    + + +
    + +
    +
    + ); +} + +export default DetailContent; diff --git a/src/domains/community/detail/DetailHeader.tsx b/src/domains/community/detail/DetailHeader.tsx new file mode 100644 index 0000000..9eb4300 --- /dev/null +++ b/src/domains/community/detail/DetailHeader.tsx @@ -0,0 +1,13 @@ +import Label from '@/domains/shared/label/Label'; +import EditDelete from './EditDelete'; + +function DetailHeader() { + return ( +
    +
    + ); +} + +export default DetailHeader; diff --git a/src/domains/community/detail/DetailTitle.tsx b/src/domains/community/detail/DetailTitle.tsx new file mode 100644 index 0000000..1850aff --- /dev/null +++ b/src/domains/community/detail/DetailTitle.tsx @@ -0,0 +1,12 @@ +import Profile from './Profile'; + +function DetailTitle() { + return ( +
    +

    칵테일 만들 때 준비물

    + +
    + ); +} + +export default DetailTitle; diff --git a/src/domains/community/detail/EditDelete.tsx b/src/domains/community/detail/EditDelete.tsx new file mode 100644 index 0000000..a07aec5 --- /dev/null +++ b/src/domains/community/detail/EditDelete.tsx @@ -0,0 +1,25 @@ +function EditDelete({ use }: { use: 'post' | 'comment' }) { + return ( +
    + + + +
    + ); +} + +export default EditDelete; diff --git a/src/domains/community/detail/Profile.tsx b/src/domains/community/detail/Profile.tsx new file mode 100644 index 0000000..6a07849 --- /dev/null +++ b/src/domains/community/detail/Profile.tsx @@ -0,0 +1,12 @@ +function Profile() { + return ( +
    +
    + + 실버븬 + +
    + ); +} + +export default Profile; diff --git a/src/domains/community/detail/comment/CommentHeader.tsx b/src/domains/community/detail/comment/CommentHeader.tsx new file mode 100644 index 0000000..822736a --- /dev/null +++ b/src/domains/community/detail/comment/CommentHeader.tsx @@ -0,0 +1,17 @@ +import EditDelete from '../EditDelete'; +import Profile from '../Profile'; + +function CommentHeader() { + return ( +
    +
    + + | +

    3분 전

    +
    + +
    + ); +} + +export default CommentHeader; diff --git a/src/domains/community/detail/comment/CommentList.tsx b/src/domains/community/detail/comment/CommentList.tsx new file mode 100644 index 0000000..137e2ec --- /dev/null +++ b/src/domains/community/detail/comment/CommentList.tsx @@ -0,0 +1,26 @@ +import CommentHeader from './CommentHeader'; + +function CommentList() { + return ( +
      +
    • +
      + +
      +

      정말 대단하시네요

      +
      +
      +
    • +
    • +
      + +
      +

      정말 대단하시네요

      +
      +
      +
    • +
    + ); +} + +export default CommentList; diff --git a/src/domains/community/detail/comment/DetailComment.tsx b/src/domains/community/detail/comment/DetailComment.tsx new file mode 100644 index 0000000..1f747df --- /dev/null +++ b/src/domains/community/detail/comment/DetailComment.tsx @@ -0,0 +1,21 @@ +import Button from '@/shared/components/button/Button'; +import Input from '@/shared/components/InputBox/Input'; + +function DetailComment() { + return ( +
    +
    + + +
    +
    + ); +} + +export default DetailComment; diff --git a/src/domains/community/detail/tab/DetailTabDesktop.tsx b/src/domains/community/detail/tab/DetailTabDesktop.tsx new file mode 100644 index 0000000..d0ccdfa --- /dev/null +++ b/src/domains/community/detail/tab/DetailTabDesktop.tsx @@ -0,0 +1,32 @@ +'use client'; + +import Share from '@/domains/shared/share/Share'; +import CommentBtn from '../../components/comment/CommentBtn'; +import LikeBtn from '../../components/like/LikeBtn'; + +function DetailTabDesktop() { + return ( +
    +
    +
    +
    + + 2 +
    +
    + + 2 +
    +
    + +
    +
    +
    +
    + ); +} + +export default DetailTabDesktop; diff --git a/src/domains/community/detail/tab/DetailTabMobile.tsx b/src/domains/community/detail/tab/DetailTabMobile.tsx new file mode 100644 index 0000000..042413d --- /dev/null +++ b/src/domains/community/detail/tab/DetailTabMobile.tsx @@ -0,0 +1,25 @@ +'use client'; + +import Share from '@/domains/shared/share/Share'; +import LikeBtn from '../../components/like/LikeBtn'; + +function DetailTabMobile() { + return ( +
    +
    +
    + + 2 +
    +
    + +
    +
    +
    + ); +} + +export default DetailTabMobile; diff --git a/src/app/login/SocialLogin.tsx b/src/domains/login/main/SocialLogin.tsx similarity index 95% rename from src/app/login/SocialLogin.tsx rename to src/domains/login/main/SocialLogin.tsx index 1d60cbf..30720de 100644 --- a/src/app/login/SocialLogin.tsx +++ b/src/domains/login/main/SocialLogin.tsx @@ -4,7 +4,7 @@ import Naver from '@/shared/assets/icons/naver.svg'; import Kakao from '@/shared/assets/icons/kakao.svg'; import Google from '@/shared/assets/icons/google.svg'; import tw from '@/shared/utills/tw'; -import { useAuthStore } from '@/shared/@store/auth'; +import { useAuthStore } from '@/domains/shared/store/auth'; function SocialLogin() { const { loginWithProvider } = useAuthStore(); diff --git a/src/shared/components/recipePage/cocktailCard/CocktailCard.tsx b/src/domains/recipe/CocktailCard.tsx similarity index 94% rename from src/shared/components/recipePage/cocktailCard/CocktailCard.tsx rename to src/domains/recipe/CocktailCard.tsx index d362703..02c7c5d 100644 --- a/src/shared/components/recipePage/cocktailCard/CocktailCard.tsx +++ b/src/domains/recipe/CocktailCard.tsx @@ -1,7 +1,7 @@ import { StaticImageData } from 'next/image'; import Image from 'next/image'; import Img from '@/shared/assets/images/dummy/exampleCocktail.png'; -import Keep from '@/shared/components/keep/Keep'; +import Keep from '../shared/keep/Keep'; interface Props { src?: StaticImageData; diff --git a/src/shared/components/recipePage/cocktailList/CocktailList.tsx b/src/domains/recipe/CocktailList.tsx similarity index 93% rename from src/shared/components/recipePage/cocktailList/CocktailList.tsx rename to src/domains/recipe/CocktailList.tsx index 2c5ede9..1b0200a 100644 --- a/src/shared/components/recipePage/cocktailList/CocktailList.tsx +++ b/src/domains/recipe/CocktailList.tsx @@ -1,5 +1,5 @@ 'use client'; -import CocktailCard from '../cocktailCard/CocktailCard'; +import CocktailCard from './CocktailCard'; function CocktailList() { // const [data,setData] = useState([]) diff --git a/src/domains/recipe/components/details/BackBtn.tsx b/src/domains/recipe/components/details/BackBtn.tsx new file mode 100644 index 0000000..de2d467 --- /dev/null +++ b/src/domains/recipe/components/details/BackBtn.tsx @@ -0,0 +1,15 @@ +'use client'; +import Back from '@/shared/assets/icons/back_36.svg'; +import { useRouter } from 'next/navigation'; + +function BackBtn() { + const router = useRouter(); + console.log(router); + + return ( + + ); +} +export default BackBtn; diff --git a/src/app/recipe/components/Accordion.tsx b/src/domains/recipe/components/main/Accordion.tsx similarity index 92% rename from src/app/recipe/components/Accordion.tsx rename to src/domains/recipe/components/main/Accordion.tsx index aff8c14..a1a71e2 100644 --- a/src/app/recipe/components/Accordion.tsx +++ b/src/domains/recipe/components/main/Accordion.tsx @@ -1,6 +1,6 @@ 'use client'; -import SelectBox from '@/shared/components/InputBox/SelectBox'; +import SelectBox from '@/domains/shared/select-box/SelectBox'; const selectOption = [ { diff --git a/src/domains/recipe/details/DetailItem.tsx b/src/domains/recipe/details/DetailItem.tsx new file mode 100644 index 0000000..ab1b5fc --- /dev/null +++ b/src/domains/recipe/details/DetailItem.tsx @@ -0,0 +1,73 @@ +import Image from 'next/image'; +import Short from '@/shared/assets/icons/short_36.svg'; +import Example from '@/shared/assets/images/dummy/exampleCocktail.png'; +import Label from '@/domains/shared/label/Label'; + +function DetailItem() { + return ( +
    +
    +
    + + +

    + Old Fashioned +

    +

    + 올드 패션드 +

    +
    + +

    + 쿠바 아바나의 전설적인 바 엘 플로리디타(El Floridita).이곳에서 노벨문학상 작가 어니스트 + 헤밍웨이가 즐겨 찾던 특별한 한 잔이 탄생했습니다. +

    + + +
    + +
    + +
    + +
    +
    +
    +

    도수

    + | +
    +
    +

    24.8%

    +
    +
    +
    +
    +
    +
    +
    +

    글래스 타입

    + | +
    +
    + +

    숏 드링크

    +
    +
    +
    +
    + ); +} +export default DetailItem; diff --git a/src/domains/recipe/details/DetailMain.tsx b/src/domains/recipe/details/DetailMain.tsx new file mode 100644 index 0000000..ee30a44 --- /dev/null +++ b/src/domains/recipe/details/DetailMain.tsx @@ -0,0 +1,43 @@ +import DetailItem from './DetailItem'; +import DetailRecipe from './DetailRecipe'; +import DetailsHeader from './DetailsHeader'; +import SsuryShake from '@/shared/assets/ssury/ssury_make.webp'; +import SsuryDrink from '@/shared/assets/ssury/ssury_drink.webp'; +import Image from 'next/image'; + +function DetailMain() { + return ( +
    + + +
    + + + +
    + +
    +
    +
    + +

    레시피

    +
    +
    + +
    + +
    +
    +
    + +

    추천리스트

    +
    +
    + {/* 여기에 컴포넌트 */} +
    + +
    {/* 여기에 댓글 컴포넌트 */}
    +
    + ); +} +export default DetailMain; diff --git a/src/domains/recipe/details/DetailRecipe.tsx b/src/domains/recipe/details/DetailRecipe.tsx new file mode 100644 index 0000000..ed6decd --- /dev/null +++ b/src/domains/recipe/details/DetailRecipe.tsx @@ -0,0 +1,36 @@ +function DetailRecipe() { + return ( +
    +
    +

    재료

    +
      +
    • + 럼 1 1/2oz | 90ml +
    • +
    • + 심플시럽 1/2oz | 30ml +
    • +
    • + 라임 1/2개 +
    • +
    • + 자몽 1/2개 +
    • +
    +
    + + +
    +

    만드는 법

    +
      +
    1. 셰이커에 라임즙을 착즙기로 짜 넣습니다
    2. +
    3. 셰이커에 자몽즙을 착즙기로 짜 넣습니다
    4. +
    5. 셰이커에 재료를 넣습니다
    6. +
    7. 셰이킹 후 잔에 따라줍니다
    8. +
    +
    +
    +
    + ); +} +export default DetailRecipe; diff --git a/src/domains/recipe/details/DetailsHeader.tsx b/src/domains/recipe/details/DetailsHeader.tsx new file mode 100644 index 0000000..b983174 --- /dev/null +++ b/src/domains/recipe/details/DetailsHeader.tsx @@ -0,0 +1,16 @@ +import Share from '@/domains/shared/share/Share'; +import BackBtn from '../components/details/BackBtn'; +import Keep from '@/domains/shared/keep/Keep'; + +function DetailsHeader() { + return ( +
    + +
    + + +
    +
    + ); +} +export default DetailsHeader; diff --git a/src/shared/@store/accordionStore.ts b/src/domains/recipe/store/accordionStore.ts similarity index 100% rename from src/shared/@store/accordionStore.ts rename to src/domains/recipe/store/accordionStore.ts diff --git a/src/app/recommend/components/ChatCocktailCard.tsx b/src/domains/recommend/components/ChatCocktailCard.tsx similarity index 94% rename from src/app/recommend/components/ChatCocktailCard.tsx rename to src/domains/recommend/components/ChatCocktailCard.tsx index 19b6c4a..0af0862 100644 --- a/src/app/recommend/components/ChatCocktailCard.tsx +++ b/src/domains/recommend/components/ChatCocktailCard.tsx @@ -1,7 +1,7 @@ import Image from 'next/image'; import Dummy from '@/shared/assets/images/dummy/exampleCocktail.png'; import Link from 'next/link'; -import Keep from '@/shared/components/keep/Keep'; +import Keep from '@/domains/shared/keep/Keep'; function ChatCocktailCard() { return ( diff --git a/src/app/recommend/components/ChatForm.tsx b/src/domains/recommend/components/ChatForm.tsx similarity index 100% rename from src/app/recommend/components/ChatForm.tsx rename to src/domains/recommend/components/ChatForm.tsx diff --git a/src/app/recommend/components/ChatRadio.tsx b/src/domains/recommend/components/ChatRadio.tsx similarity index 100% rename from src/app/recommend/components/ChatRadio.tsx rename to src/domains/recommend/components/ChatRadio.tsx diff --git a/src/app/recommend/components/MyChat.tsx b/src/domains/recommend/components/MyChat.tsx similarity index 100% rename from src/app/recommend/components/MyChat.tsx rename to src/domains/recommend/components/MyChat.tsx diff --git a/src/app/recommend/components/SsuryChat.tsx b/src/domains/recommend/components/SsuryChat.tsx similarity index 100% rename from src/app/recommend/components/SsuryChat.tsx rename to src/domains/recommend/components/SsuryChat.tsx diff --git a/src/shared/components/auth/LoginConfirm.tsx b/src/domains/shared/auth/LoginConfirm.tsx similarity index 100% rename from src/shared/components/auth/LoginConfirm.tsx rename to src/domains/shared/auth/LoginConfirm.tsx diff --git a/src/shared/components/auth/LoginRedirectHandler.tsx b/src/domains/shared/auth/LoginRedirectHandler.tsx similarity index 51% rename from src/shared/components/auth/LoginRedirectHandler.tsx rename to src/domains/shared/auth/LoginRedirectHandler.tsx index 4077b54..b18d780 100644 --- a/src/shared/components/auth/LoginRedirectHandler.tsx +++ b/src/domains/shared/auth/LoginRedirectHandler.tsx @@ -2,17 +2,20 @@ import { useEffect, useState } from 'react'; import { usePathname, useRouter } from 'next/navigation'; -import { useAuthStore } from '@/shared/@store/auth'; -import { useModalStore } from '@/shared/@store/modal'; + import { customToast } from '@/shared/components/toast/CustomToastUtils'; -import Spinner from '../spinner/Spinner'; + +import WelcomeModal from './WelcomeModal'; +import { getCookie, removeCookie } from './utils/cookie'; +import { useAuthStore } from '../store/auth'; +import Spinner from '@/shared/components/spinner/Spinner'; function LoginRedirectHandler() { const pathname = usePathname(); const router = useRouter(); const { user, updateUser } = useAuthStore(); - const { openWelcomeModal } = useModalStore(); const [loading, setLoading] = useState(true); + const [welcomeModalOpen, setWelcomeModalOpen] = useState(false); useEffect(() => { if (!user && loading) { @@ -32,15 +35,28 @@ function LoginRedirectHandler() { useEffect(() => { if (!user || loading) return; - const preLoginPath = sessionStorage.getItem('preLoginPath') || '/'; + const preLoginPath = getCookie('preLoginPath') || '/'; + console.log(preLoginPath); + // 첫 유저일 경우 모달 오픈 if (pathname.startsWith('/login/first-user')) { - openWelcomeModal(user.nickname); - } else if (pathname.startsWith('/login/success')) { + setWelcomeModalOpen(true); + } + // 기존 유저일 경우 + else if (pathname.startsWith('/login/success')) { customToast.success(`${user.nickname}님 \n 로그인 성공 🎉`); router.replace(preLoginPath); + removeCookie('preLoginPath'); } - }, [pathname, user, router, openWelcomeModal, loading]); + }, [pathname, user, loading, router]); + + // 환영 모달 닫힐 때 이동 + const handleCloseWelcomeModal = () => { + setWelcomeModalOpen(false); + const preLoginPath = getCookie('preLoginPath') || '/'; + removeCookie('preLoginPath'); + router.replace(preLoginPath); + }; if (loading) { return ( @@ -50,6 +66,17 @@ function LoginRedirectHandler() { ); } - return null; + return ( + <> + {/* 첫 유저 모달 */} + {user && ( + + )} + + ); } export default LoginRedirectHandler; diff --git a/src/shared/components/auth/Welcome.tsx b/src/domains/shared/auth/WelcomeModal.tsx similarity index 71% rename from src/shared/components/auth/Welcome.tsx rename to src/domains/shared/auth/WelcomeModal.tsx index b479480..f4cd3b1 100644 --- a/src/shared/components/auth/Welcome.tsx +++ b/src/domains/shared/auth/WelcomeModal.tsx @@ -6,21 +6,21 @@ import Button from '@/shared/components/button/Button'; import ModalLayout from '@/shared/components/modalPop/ModalLayout'; import Ssury from '@/shared/assets/ssury/ssury_jump.webp'; import { useRouter } from 'next/navigation'; -import { useModalStore } from '@/shared/@store/modal'; -import { useAuthStore } from '@/shared/@store/auth'; -function Welcome() { - const router = useRouter(); - const { user } = useAuthStore(); - const { welcomeModal, closeWelcomeModal } = useModalStore(); +interface Props { + userNickname: string; + open: boolean; + onClose: () => void; +} - if (!welcomeModal.open || !user) return null; +function Welcome({ userNickname, open, onClose }: Props) { + const router = useRouter(); return ( @@ -28,7 +28,7 @@ function Welcome() { type="button" color="purple" onClick={() => { - closeWelcomeModal(); + onClose(); router.push('/recipe'); }} > @@ -37,7 +37,7 @@ function Welcome() {
    - + , + document.body ); } diff --git a/src/shared/components/header/HamburgerMenu.tsx b/src/shared/components/header/HamburgerMenu.tsx index aa4d950..46d2351 100644 --- a/src/shared/components/header/HamburgerMenu.tsx +++ b/src/shared/components/header/HamburgerMenu.tsx @@ -4,9 +4,13 @@ import DropdownMenu from './DropdownMenu'; function HamburgerMenu() { const [isClicked, setIsClicked] = useState(false); + const [visible, setVisible] = useState(false); const handleClick = (e: React.MouseEvent) => { e.stopPropagation(); + if (!visible) { + setVisible(true); + } setIsClicked(true); }; @@ -22,7 +26,12 @@ function HamburgerMenu() { > - {isClicked && } + ); } diff --git a/src/shared/components/header/HeaderBtn.tsx b/src/shared/components/header/HeaderBtn.tsx index ad2c91d..a3d6cdb 100644 --- a/src/shared/components/header/HeaderBtn.tsx +++ b/src/shared/components/header/HeaderBtn.tsx @@ -4,7 +4,8 @@ import SignOut from '@/shared/assets/icons/sign_out_24.svg'; import SignIn from '@/shared/assets/icons/sign_in_24.svg'; import { useRouter } from 'next/navigation'; import tw from '@/shared/utills/tw'; -import { useAuthStore } from '@/shared/@store/auth'; +import { useAuthStore } from '@/domains/shared/store/auth'; +import { setPreLoginPath } from '@/domains/shared/auth/utils/setPreLoginPath'; type RouterType = ReturnType; @@ -39,8 +40,8 @@ function HeaderBtn({ pathname }: { pathname: string }) { icon: SignIn, label: '로그인', className: `${pathname === '/login' ? 'text-tertiary' : ''}`, - onClick: () => { - sessionStorage.setItem('preLoginPath', window.location.pathname); + onClick: async () => { + await setPreLoginPath(window.location.pathname); router.push('/login'); }, }, diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts deleted file mode 100644 index 7444513..0000000 --- a/src/shared/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// 외부 라이브러리 초기회, 셋팅 diff --git a/src/shared/styles/_utilities.css b/src/shared/styles/_utilities.css index 7846bf0..cc91625 100644 --- a/src/shared/styles/_utilities.css +++ b/src/shared/styles/_utilities.css @@ -39,4 +39,19 @@ .max-w-full { @apply max-w-full; } + + /* 스크롤 */ + .scroll-up { + transform: translateY(0); + } + .scroll-down { + transform: translateY(-100%); + } + .no-scrollbar { + -ms-overflow-style: none; + scrollbar-width: none; + } + .no-scrollbar::-webkit-scrollbar { + display: none; + } } diff --git a/src/shared/styles/global.css b/src/shared/styles/global.css index b4a696b..5bc37f3 100644 --- a/src/shared/styles/global.css +++ b/src/shared/styles/global.css @@ -14,16 +14,3 @@ color: #fff; background-color: var(--color-primary); } - -.scroll-up { - transform: translateY(0); -} - -.scroll-down { - transform: translateY(-100%); -} - -.no-scrollbar { - -ms-overflow-style: none; - scrollbar-width: none; -} diff --git a/src/shared/@types/index.ts b/src/shared/types/index.ts similarity index 100% rename from src/shared/@types/index.ts rename to src/shared/types/index.ts