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