mirror of
https://github.com/ktds-dg0501/kt-event-marketing-fe.git
synced 2025-12-06 10:16:25 +00:00
FSD 아키텍처로 프로젝트 구조 리팩토링
주요 변경사항:
- FSD(Feature-Sliced Design) 아키텍처 도입
- shared 레이어 구조 생성 (ui, lib, api, model, types, config)
- 공통 UI 컴포넌트를 shared/ui로 이동 (Header, BottomNavigation, Loading, Toast)
- 라이브러리 코드를 shared/lib로 이동 (theme-provider, react-query-provider, theme)
- 모든 import 경로 업데이트하여 새로운 구조 반영
- 기존 components, lib 디렉토리 제거
- 빌드 검증 완료
향후 확장:
- widgets: 복잡한 UI 블록
- features: 기능 단위 코드
- entities: 비즈니스 엔티티
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
ea94dc97a1
commit
edcd0cd559
@ -15,7 +15,7 @@ import {
|
|||||||
Payments,
|
Payments,
|
||||||
People,
|
People,
|
||||||
} from '@mui/icons-material';
|
} from '@mui/icons-material';
|
||||||
import Header from '@/components/layout/Header';
|
import Header from '@/shared/ui/Header';
|
||||||
|
|
||||||
// Mock 데이터
|
// Mock 데이터
|
||||||
const mockAnalyticsData = {
|
const mockAnalyticsData = {
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import {
|
|||||||
Grid,
|
Grid,
|
||||||
} from '@mui/material';
|
} from '@mui/material';
|
||||||
import { Search, FilterList } from '@mui/icons-material';
|
import { Search, FilterList } from '@mui/icons-material';
|
||||||
import Header from '@/components/layout/Header';
|
import Header from '@/shared/ui/Header';
|
||||||
|
|
||||||
// Mock 데이터
|
// Mock 데이터
|
||||||
const mockEvents = [
|
const mockEvents = [
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { Box } from '@mui/material';
|
import { Box } from '@mui/material';
|
||||||
import BottomNavigation from '@/components/layout/BottomNavigation';
|
import BottomNavigation from '@/shared/ui/BottomNavigation';
|
||||||
|
|
||||||
export default function MainLayout({ children }: { children: React.ReactNode }) {
|
export default function MainLayout({ children }: { children: React.ReactNode }) {
|
||||||
return (
|
return (
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import {
|
|||||||
Edit,
|
Edit,
|
||||||
CheckCircle,
|
CheckCircle,
|
||||||
} from '@mui/icons-material';
|
} from '@mui/icons-material';
|
||||||
import Header from '@/components/layout/Header';
|
import Header from '@/shared/ui/Header';
|
||||||
|
|
||||||
// Mock 사용자 데이터 (API 연동 전까지 임시 사용)
|
// Mock 사용자 데이터 (API 연동 전까지 임시 사용)
|
||||||
const mockUser = {
|
const mockUser = {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import type { Metadata, Viewport } from 'next';
|
import type { Metadata, Viewport } from 'next';
|
||||||
import { MUIThemeProvider } from '@/lib/theme-provider';
|
import { MUIThemeProvider } from '@/shared/lib/theme-provider';
|
||||||
import { ReactQueryProvider } from '@/lib/react-query-provider';
|
import { ReactQueryProvider } from '@/shared/lib/react-query-provider';
|
||||||
import '@/styles/globals.css';
|
import '@/styles/globals.css';
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
|
|||||||
@ -1,54 +0,0 @@
|
|||||||
'use client';
|
|
||||||
|
|
||||||
import { usePathname, useRouter } from 'next/navigation';
|
|
||||||
import { BottomNavigation, BottomNavigationAction, Paper } from '@mui/material';
|
|
||||||
import HomeIcon from '@mui/icons-material/Home';
|
|
||||||
import EventIcon from '@mui/icons-material/Event';
|
|
||||||
import BarChartIcon from '@mui/icons-material/BarChart';
|
|
||||||
import PersonIcon from '@mui/icons-material/Person';
|
|
||||||
|
|
||||||
export function BottomNav() {
|
|
||||||
const pathname = usePathname();
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
const navItems = [
|
|
||||||
{ label: '홈', icon: <HomeIcon />, value: '/' },
|
|
||||||
{ label: '이벤트', icon: <EventIcon />, value: '/events' },
|
|
||||||
{ label: '분석', icon: <BarChartIcon />, value: '/analytics' },
|
|
||||||
{ label: '프로필', icon: <PersonIcon />, value: '/profile' },
|
|
||||||
];
|
|
||||||
|
|
||||||
const currentValue = navItems.find((item) => item.value === pathname)?.value || '/';
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Paper
|
|
||||||
sx={{
|
|
||||||
position: 'fixed',
|
|
||||||
bottom: 0,
|
|
||||||
left: 0,
|
|
||||||
right: 0,
|
|
||||||
zIndex: 1100,
|
|
||||||
display: { xs: 'block', md: 'none' },
|
|
||||||
}}
|
|
||||||
elevation={3}
|
|
||||||
>
|
|
||||||
<BottomNavigation
|
|
||||||
value={currentValue}
|
|
||||||
onChange={(_, newValue) => {
|
|
||||||
router.push(newValue);
|
|
||||||
}}
|
|
||||||
showLabels
|
|
||||||
sx={{ height: 60 }}
|
|
||||||
>
|
|
||||||
{navItems.map((item) => (
|
|
||||||
<BottomNavigationAction
|
|
||||||
key={item.value}
|
|
||||||
label={item.label}
|
|
||||||
icon={item.icon}
|
|
||||||
value={item.value}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</BottomNavigation>
|
|
||||||
</Paper>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -3,7 +3,7 @@
|
|||||||
import { ThemeProvider } from '@mui/material/styles';
|
import { ThemeProvider } from '@mui/material/styles';
|
||||||
import CssBaseline from '@mui/material/CssBaseline';
|
import CssBaseline from '@mui/material/CssBaseline';
|
||||||
import { AppRouterCacheProvider } from '@mui/material-nextjs/v14-appRouter';
|
import { AppRouterCacheProvider } from '@mui/material-nextjs/v14-appRouter';
|
||||||
import { theme } from '@/styles/theme';
|
import { theme } from '@/shared/lib/theme';
|
||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
|
|
||||||
export function MUIThemeProvider({ children }: { children: ReactNode }) {
|
export function MUIThemeProvider({ children }: { children: ReactNode }) {
|
||||||
Loading…
x
Reference in New Issue
Block a user