From 7c3c0b4508fa3a65627938b1adbf91c60e0948b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=84=B1=EA=B2=BD?= Date: Thu, 26 Mar 2026 14:16:04 +0900 Subject: [PATCH] =?UTF-8?q?YouTube=20Analytics=20API=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/extensions.json | 3 --- index.css | 22 ---------------------- src/pages/Dashboard/CompletionContent.tsx | 11 ----------- src/pages/Dashboard/DashboardContent.tsx | 16 +++++++++++++--- 4 files changed, 13 insertions(+), 39 deletions(-) delete mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 7e257db..0000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": [] -} \ No newline at end of file diff --git a/index.css b/index.css index fae9aad..33afb97 100644 --- a/index.css +++ b/index.css @@ -2075,31 +2075,9 @@ height: 64px; display: flex; align-items: center; - justify-content: space-between; flex-shrink: 0; } -.comp2-inquiry-btn { - display: flex; - align-items: center; - gap: 6px; - padding: 8px 16px; - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.3); - border-radius: 8px; - color: rgba(255, 255, 255, 0.8); - font-size: 14px; - text-decoration: none; - cursor: pointer; - transition: background 0.2s, border-color 0.2s, color 0.2s; -} - -.comp2-inquiry-btn:hover { - background: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.6); - color: #fff; -} - .comp2-back-btn { display: flex; align-items: center; diff --git a/src/pages/Dashboard/CompletionContent.tsx b/src/pages/Dashboard/CompletionContent.tsx index 39688ab..4da046e 100755 --- a/src/pages/Dashboard/CompletionContent.tsx +++ b/src/pages/Dashboard/CompletionContent.tsx @@ -331,17 +331,6 @@ const CompletionContent: React.FC = ({ {t('completion.back')} - - - - - 문의하기 -
diff --git a/src/pages/Dashboard/DashboardContent.tsx b/src/pages/Dashboard/DashboardContent.tsx index 474d7ae..056e6f1 100755 --- a/src/pages/Dashboard/DashboardContent.tsx +++ b/src/pages/Dashboard/DashboardContent.tsx @@ -480,6 +480,7 @@ const DashboardContent: React.FC = ({ onNavigate }) => { const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [showMockData, setShowMockData] = useState(false); + const [retryTrigger, setRetryTrigger] = useState(0); // 계정 관련 state const [accounts, setAccounts] = useState([]); @@ -576,7 +577,8 @@ const DashboardContent: React.FC = ({ onNavigate }) => { setDashboardData(null); return; } - throw new Error(errorData.detail || `API Error: ${response.status}`); + setError({ code: errorData.code || 'API_ERROR', message: errorData.detail || `API Error: ${response.status}`, reconnect_url: errorData.reconnect_url }); + return; } const data: DashboardResponse = await response.json(); @@ -591,7 +593,7 @@ const DashboardContent: React.FC = ({ onNavigate }) => { setError(null); } catch (err) { console.error('Dashboard API Error:', err); - setError(err instanceof Error ? err.message : 'Unknown error'); + setError({ code: 'UNKNOWN', message: err instanceof Error ? err.message : 'Unknown error' }); setDashboardData(null); } finally { setIsLoading(false); @@ -599,7 +601,7 @@ const DashboardContent: React.FC = ({ onNavigate }) => { }; fetchDashboardData(); - }, [mode, selectedAccountId, accountsLoaded]); + }, [mode, selectedAccountId, accountsLoaded, retryTrigger]); if (isLoading) { return ( @@ -688,6 +690,14 @@ const DashboardContent: React.FC = ({ onNavigate }) => { 연동하러 가기 → )} + {(error.code === 'YOUTUBE_API_FAILED' || error.code === 'DASHBOARD_DATA_ERROR') && ( + + )}
)}