diff --git a/src/app/layout.tsx b/src/app/layout.tsx index fe1e4ca6..e541f21d 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,6 +7,7 @@ import Providers from "@/components/commons/Provider/TanstackProvider"; import GlobalStateSync from "@/components/commons/Provider/GlobalStateSync"; import RecentSyncManager from "@/components/commons/Provider/RecentSyncManager"; import KakaoScript from "@/lib/script/KakaoScript"; +import { auth } from "@/auth"; const pretendard = localFont({ src: "../../public/fonts/PretendardVariable.woff2", @@ -15,11 +16,14 @@ const pretendard = localFont({ variable: "--font-pretendard", }); -export default function RootLayout({ +export default async function RootLayout({ children, }: Readonly<{ children: React.ReactNode; }>) { + const session = await auth(); + const isAuthenticated = !!session?.user; + return ( @@ -27,7 +31,7 @@ export default function RootLayout({ - + {children} diff --git a/src/app/perfumes/page.tsx b/src/app/perfumes/page.tsx index 3fb1ab9f..f46a7d25 100644 --- a/src/app/perfumes/page.tsx +++ b/src/app/perfumes/page.tsx @@ -1,4 +1,5 @@ import { HydrationBoundary, dehydrate } from "@tanstack/react-query"; +import { Suspense } from "react"; import getQueryClient from "@/lib/utils/getQueryClient"; import { brandApi } from "@/lib/utils/api/brands.api"; import { perfumeApi } from "@/lib/utils/api/perfumes.api"; @@ -24,7 +25,9 @@ export default async function Page() { return ( - + + + ); } diff --git a/src/components/commons/Provider/GlobalStateSync.tsx b/src/components/commons/Provider/GlobalStateSync.tsx index 42b0c261..5401032a 100644 --- a/src/components/commons/Provider/GlobalStateSync.tsx +++ b/src/components/commons/Provider/GlobalStateSync.tsx @@ -5,21 +5,37 @@ import { useUserProfile } from "@/lib/hooks/query/useUserQuery"; import { useUserStore } from "@/lib/stores/useUserStore"; import { pointApi } from "@/lib/utils/api/points.api"; +interface GlobalStateSyncProps { + isAuthenticated: boolean; +} + //전역으로 사용하는 상태 동기화 -export default function GlobalStateSync() { - const { data: userProfile, isFetched } = useUserProfile(); +export default function GlobalStateSync({ isAuthenticated }: GlobalStateSyncProps) { const { setUser, reset } = useUserStore(); + // 서버에서 인증된 경우에만 프로필 조회 + const { data: userProfile, isFetched } = useUserProfile({ + enabled: isAuthenticated, + }); + + // 인증되지 않은 경우 즉시 reset + useEffect(() => { + if (!isAuthenticated) { + reset(); + } + }, [isAuthenticated, reset]); + // 사용자 프로필 동기화 useEffect(() => { - if (isFetched) { + // 인증된 경우에만 프로필 동기화 + if (isAuthenticated && isFetched) { if (userProfile) { setUser(userProfile); } else { reset(); } } - }, [isFetched, userProfile, setUser, reset]); + }, [isAuthenticated, isFetched, userProfile, setUser, reset]); // 일일 로그인 체크 useEffect(() => { diff --git a/src/components/commons/card/perfumeCard/index.tsx b/src/components/commons/card/perfumeCard/index.tsx index f8e21985..dfdfb0c3 100644 --- a/src/components/commons/card/perfumeCard/index.tsx +++ b/src/components/commons/card/perfumeCard/index.tsx @@ -14,6 +14,7 @@ export default function PerfumeCard({ onClick, onClose, className = "", + priority = false, }: PerfumeCardProps) { return (
diff --git a/src/components/commons/card/perfumeCard/perfumeCard.types.ts b/src/components/commons/card/perfumeCard/perfumeCard.types.ts index f7920f67..6fa58b72 100644 --- a/src/components/commons/card/perfumeCard/perfumeCard.types.ts +++ b/src/components/commons/card/perfumeCard/perfumeCard.types.ts @@ -11,6 +11,7 @@ interface PerfumeCardProps { onClick?: () => void; onClose?: () => void; className?: string; + priority?: boolean; } export type { PerfumeCardType, PerfumeCardProps }; diff --git a/src/components/commons/dropdown/SearchResultsDropdown.tsx b/src/components/commons/dropdown/SearchResultsDropdown.tsx index 13d884ab..fec83145 100644 --- a/src/components/commons/dropdown/SearchResultsDropdown.tsx +++ b/src/components/commons/dropdown/SearchResultsDropdown.tsx @@ -10,16 +10,14 @@ export function SearchResultsDropdown({ children, }: SearchResultsDropdownProps) { return ( -
- {isLoading ? ( -
검색 중...
- ) : results.length > 0 ? ( +
+ {results.length > 0 ? (
    {results.map((item) => children(item))}
- ) : ( + ) : !isLoading ? (
검색 결과가 없습니다.
- )} + ) : null}
); } diff --git a/src/components/commons/perfumeList/search/index.tsx b/src/components/commons/perfumeList/search/index.tsx index d80da3ec..1ba32d45 100644 --- a/src/components/commons/perfumeList/search/index.tsx +++ b/src/components/commons/perfumeList/search/index.tsx @@ -15,6 +15,7 @@ interface SearchHeaderProps { notes: ApiPerfumeNoteResponse[]; accords: ApiPerfumeAccordResponse[]; isSearch?: boolean; + searchBarMaxWidth?: string; } export function SearchHeader({ @@ -25,6 +26,7 @@ export function SearchHeader({ notes, accords, isSearch = true, + searchBarMaxWidth = "840px", }: SearchHeaderProps) { return (
@@ -34,6 +36,7 @@ export function SearchHeader({ value={inputValue} onChange={onChange} onClick={onSubmit} + maxWidth={searchBarMaxWidth} /> )}