'use client'; import React, { useState, useEffect } from 'react'; import { DashboardViewer } from '@/components/dashboard/DashboardViewer'; import { DashboardElement } from '@/components/admin/dashboard/types'; interface DashboardViewPageProps { params: { dashboardId: string; }; } /** * 대시보드 뷰어 페이지 * - 저장된 대시보드를 읽기 전용으로 표시 * - 실시간 데이터 업데이트 * - 전체화면 모드 지원 */ export default function DashboardViewPage({ params }: DashboardViewPageProps) { const [dashboard, setDashboard] = useState<{ id: string; title: string; description?: string; elements: DashboardElement[]; createdAt: string; updatedAt: string; } | null>(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // 대시보드 데이터 로딩 useEffect(() => { loadDashboard(); }, [params.dashboardId]); const loadDashboard = async () => { setIsLoading(true); setError(null); try { // 실제 API 호출 시도 const { dashboardApi } = await import('@/lib/api/dashboard'); try { const dashboardData = await dashboardApi.getDashboard(params.dashboardId); setDashboard(dashboardData); } catch (apiError) { console.warn('API 호출 실패, 로컬 스토리지 확인:', apiError); // API 실패 시 로컬 스토리지에서 찾기 const savedDashboards = JSON.parse(localStorage.getItem('savedDashboards') || '[]'); const savedDashboard = savedDashboards.find((d: any) => d.id === params.dashboardId); if (savedDashboard) { setDashboard(savedDashboard); } else { // 로컬에도 없으면 샘플 데이터 사용 const sampleDashboard = generateSampleDashboard(params.dashboardId); setDashboard(sampleDashboard); } } } catch (err) { setError('대시보드를 불러오는 중 오류가 발생했습니다.'); console.error('Dashboard loading error:', err); } finally { setIsLoading(false); } }; // 로딩 상태 if (isLoading) { return (
대시보드 로딩 중...
잠시만 기다려주세요
); } // 에러 상태 if (error || !dashboard) { return (
😞
{error || '대시보드를 찾을 수 없습니다'}
대시보드 ID: {params.dashboardId}
); } return (
{/* 대시보드 헤더 */}

{dashboard.title}

{dashboard.description && (

{dashboard.description}

)}
{/* 새로고침 버튼 */} {/* 전체화면 버튼 */} {/* 편집 버튼 */}
{/* 메타 정보 */}
생성: {new Date(dashboard.createdAt).toLocaleString()} 수정: {new Date(dashboard.updatedAt).toLocaleString()} 요소: {dashboard.elements.length}개
{/* 대시보드 뷰어 */}
); } /** * 샘플 대시보드 생성 함수 */ function generateSampleDashboard(dashboardId: string) { const dashboards: Record = { 'sales-overview': { id: 'sales-overview', title: '📊 매출 현황 대시보드', description: '월별 매출 추이 및 상품별 판매 현황을 한눈에 확인할 수 있습니다.', elements: [ { id: 'chart-1', type: 'chart', subtype: 'bar', position: { x: 20, y: 20 }, size: { width: 400, height: 300 }, title: '📊 월별 매출 추이', content: '월별 매출 데이터', dataSource: { type: 'database', query: 'SELECT month, sales FROM monthly_sales', refreshInterval: 30000 }, chartConfig: { xAxis: 'month', yAxis: 'sales', title: '월별 매출 추이', colors: ['#3B82F6', '#EF4444', '#10B981'] } }, { id: 'chart-2', type: 'chart', subtype: 'pie', position: { x: 450, y: 20 }, size: { width: 350, height: 300 }, title: '🥧 상품별 판매 비율', content: '상품별 판매 데이터', dataSource: { type: 'database', query: 'SELECT product_name, total_sold FROM product_sales', refreshInterval: 60000 }, chartConfig: { xAxis: 'product_name', yAxis: 'total_sold', title: '상품별 판매 비율', colors: ['#8B5CF6', '#EC4899', '#06B6D4', '#84CC16'] } }, { id: 'chart-3', type: 'chart', subtype: 'line', position: { x: 20, y: 350 }, size: { width: 780, height: 250 }, title: '📈 사용자 가입 추이', content: '사용자 가입 데이터', dataSource: { type: 'database', query: 'SELECT week, new_users FROM user_growth', refreshInterval: 300000 }, chartConfig: { xAxis: 'week', yAxis: 'new_users', title: '주간 신규 사용자 가입 추이', colors: ['#10B981'] } } ], createdAt: '2024-09-30T10:00:00Z', updatedAt: '2024-09-30T14:30:00Z' }, 'user-analytics': { id: 'user-analytics', title: '👥 사용자 분석 대시보드', description: '사용자 행동 패턴 및 가입 추이 분석', elements: [ { id: 'chart-4', type: 'chart', subtype: 'line', position: { x: 20, y: 20 }, size: { width: 500, height: 300 }, title: '📈 일일 활성 사용자', content: '사용자 활동 데이터', dataSource: { type: 'database', query: 'SELECT date, active_users FROM daily_active_users', refreshInterval: 60000 }, chartConfig: { xAxis: 'date', yAxis: 'active_users', title: '일일 활성 사용자 추이' } } ], createdAt: '2024-09-29T15:00:00Z', updatedAt: '2024-09-30T09:15:00Z' } }; return dashboards[dashboardId] || { id: dashboardId, title: `대시보드 ${dashboardId}`, description: '샘플 대시보드입니다.', elements: [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }; }