Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions src/app/(service)/home/home-content.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
'use client';

import { Suspense } from 'react';
import { useSearchParams } from 'next/navigation';
import dynamic from 'next/dynamic';
import Banner from '@/widgets/home/banner';
import StudyCard from '@/features/study/schedule/ui/study-card';
import TabNavigation from '@/components/home/tab-navigation';

// νƒ­ μ»΄ν¬λ„ŒνŠΈλ“€μ„ λ™μ μœΌλ‘œ λ‘œλ“œ (μ„±λŠ₯ μ΅œμ ν™”)
const StudyTab = dynamic(() => import('@/components/home/tabs/study-tab'), {
loading: () => (
<div className="flex flex-col gap-500">
<Banner />
<StudyCard />
</div>
),
ssr: false
});

const HallOfFameTab = dynamic(() => import('@/components/home/tabs/hall-of-fame-tab'), {
loading: () => <div className="py-800 text-center text-text-subtlest">λ‘œλ”© 쀑...</div>,
ssr: false
});

const ArchiveTab = dynamic(() => import('@/components/home/tabs/archive-tab'), {
loading: () => <div className="py-800 text-center text-text-subtlest">λ‘œλ”© 쀑...</div>,
ssr: false
});

const CommunityTab = dynamic(() => import('@/components/home/tabs/community-tab'), {
loading: () => <div className="py-800 text-center text-text-subtlest">λ‘œλ”© 쀑...</div>,
ssr: false
});

const StudyHistoryTab = dynamic(() => import('@/components/home/tabs/study-history-tab'), {
loading: () => <div className="py-800 text-center text-text-subtlest">λ‘œλ”© 쀑...</div>,
ssr: false
});

function HomeContentInner() {
const searchParams = useSearchParams();
const activeTab = searchParams?.get('tab') || 'study'; // 기본값을 'study'둜 μ„€μ •

// 이제 항상 νƒ­ μ‹œμŠ€ν…œμ„ μ‚¬μš©
const renderTabContent = () => {
switch (activeTab) {
case 'study':
return <StudyTab />;
case 'history':
return <StudyHistoryTab />;
case 'ranking':
return <HallOfFameTab />;
case 'archive':
return <ArchiveTab />;
case 'community':
return <CommunityTab />;
default:
// μ•Œ 수 μ—†λŠ” 탭이면 κΈ°λ³Έκ°’μœΌλ‘œ 폴백
return <StudyTab />;
}
};

return (
<>
{/* νƒ­ λ„€λΉ„κ²Œμ΄μ…˜ */}
<TabNavigation activeTab={activeTab} />

{/* νƒ­ μ½˜ν…μΈ  */}
<Suspense
fallback={
<div className="py-800 text-center text-text-subtlest">
λ‘œλ”© 쀑...
</div>
}
>
{renderTabContent()}
</Suspense>
</>
);
}

export default function HomeContent() {
return (
<Suspense
fallback={
<>
<Banner />
<StudyCard />
</>
}
>
<HomeContentInner />
</Suspense>
);
}
17 changes: 14 additions & 3 deletions src/app/(service)/home/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { Metadata } from 'next';
import { Suspense } from 'react';
import StudyCard from '@/features/study/schedule/ui/study-card';
import { generateMetadata as generateSEOMetadata } from '@/utils/seo';
import Banner from '@/widgets/home/banner';
import Sidebar from '@/widgets/home/sidebar';
import HomeContent from './home-content';

export const metadata: Metadata = generateSEOMetadata({
title: 'ν™ˆ - ZERO-ONE',
Expand All @@ -17,11 +19,20 @@ export default async function Home() {
return (
<div className="mx-auto flex w-[1496px] gap-600 px-600 py-600">
<div className="flex flex-1 flex-col gap-500">
<Banner />
<StudyCard />
{/* κΈ°μ‘΄ κΈ°λŠ₯을 100% λ³΄μ‘΄ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ νƒ­ μ‹œμŠ€ν…œ μΆ”κ°€ */}
<Suspense
fallback={
<>
<Banner />
<StudyCard />
</>
}
>
<HomeContent />
</Suspense>
</div>

<aside className="w-[335px] shrink-0">
<aside className="sticky top-600 h-fit w-[335px] shrink-0">
<Sidebar />
</aside>
</div>
Expand Down
Loading