snp-batch-validation/frontend/src/pages/MainMenu.tsx
HYOJIN ad18ab9c30 feat(email): Bypass API 계정 이메일 알림 및 거절 후속 조치 (#140)
- 이메일 공통 모듈 (spring-boot-starter-mail, EmailService, Thymeleaf 템플릿)
- 승인 시 계정 발급 이메일 / 거절 시 사유 이메일 자동 발송
- 재심사 기능 (REJECTED → PENDING)
- UI 텍스트 리레이블링 (S&P Global API)
- 신청 폼 전화번호 필드 제거 및 레이아웃 개선
2026-04-03 10:34:45 +09:00

70 lines
2.5 KiB
TypeScript

import { Link } from 'react-router-dom';
import { useThemeContext } from '../contexts/ThemeContext';
const sections = [
{
title: 'S&P Collector',
description: 'S&P 배치 수집 관리',
detail: '대시보드, 실행 이력, 재수집 이력, 작업 관리, 스케줄, 타임라인',
path: '/dashboard',
icon: '🔄',
iconClass: 'gc-card-icon',
menuCount: 6,
},
{
title: 'S&P Global API',
description: 'S&P Global Maritime API',
detail: 'API 카탈로그, API 계정 신청',
path: '/bypass-catalog',
icon: '🌐',
iconClass: 'gc-card-icon gc-card-icon-guide',
menuCount: 5,
},
{
title: 'S&P Risk & Compliance',
description: 'S&P 위험 지표 및 규정 준수',
detail: '위험 지표 및 규정 준수 가이드, 변경 이력 조회',
path: '/risk-compliance-history',
icon: '⚖️',
iconClass: 'gc-card-icon gc-card-icon-nexus',
menuCount: 2,
},
];
export default function MainMenu() {
const { theme, toggle } = useThemeContext();
return (
<div className="min-h-[70vh] flex flex-col items-center justify-center">
{/* 헤더 */}
<div className="text-center mb-10">
<h1 className="text-3xl font-bold text-wing-text mb-2">S&P Data Platform</h1>
<p className="text-sm text-wing-muted"> </p>
</div>
{/* 섹션 카드 */}
<div className="gc-cards">
{sections.map((section) => (
<Link key={section.path} to={section.path} className="gc-card">
<div className={section.iconClass}>
<span className="text-5xl">{section.icon}</span>
</div>
<h3>{section.title}</h3>
<p>{section.description}<br />{section.detail}</p>
</Link>
))}
</div>
{/* 테마 토글 */}
<button
onClick={toggle}
className="mt-8 px-3 py-1.5 rounded-lg text-sm bg-wing-card text-wing-muted
hover:text-wing-text border border-wing-border transition-colors"
title={theme === 'dark' ? '라이트 모드' : '다크 모드'}
>
{theme === 'dark' ? '☀️ 라이트 모드' : '🌙 다크 모드'}
</button>
</div>
);
}