diff --git a/src/pages/Dashboard/UrlInputContent.tsx b/src/pages/Dashboard/UrlInputContent.tsx index 2329fdc..12dec9c 100644 --- a/src/pages/Dashboard/UrlInputContent.tsx +++ b/src/pages/Dashboard/UrlInputContent.tsx @@ -124,6 +124,17 @@ const UrlInputContent: React.FC = ({ onAnalyze, onAutocomp } }; + // 붙여넣기 시 URL만 추출 + const handlePaste = (e: React.ClipboardEvent) => { + if (searchType !== 'url') return; + const pasted = e.clipboardData.getData('text'); + const urlMatch = pasted.match(/https?:\/\/[^\s]+/); + if (urlMatch) { + e.preventDefault(); + setInputValue(urlMatch[0]); + } + }; + // 폼 제출 처리 const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -212,6 +223,7 @@ const UrlInputContent: React.FC = ({ onAnalyze, onAutocomp }, 300); } }} + onPaste={handlePaste} onFocus={() => { if (searchType === 'name' && autocompleteResults.length > 0) { setShowAutocomplete(true); diff --git a/src/utils/api.ts b/src/utils/api.ts index 11f313a..2c980a4 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -596,14 +596,28 @@ export async function refreshAccessToken(): Promise { return data; } +// 로컬 스토리지 전체 정리 +function clearAllLocalData() { + clearTokens(); + localStorage.removeItem('castad_view_mode'); + localStorage.removeItem('castad_analysis_data'); + localStorage.removeItem('castad_wizard_step'); + localStorage.removeItem('castad_active_item'); + localStorage.removeItem('castad_song_task_id'); + localStorage.removeItem('castad_image_task_id'); + localStorage.removeItem('castad_song_generation'); + localStorage.removeItem('castad_video_generation'); + localStorage.removeItem('castad_video_ratio'); +} + // 로그아웃 export async function logout(): Promise { const response = await authenticatedFetch(`${API_URL}/user/auth/logout`, { method: 'POST', }); - // 응답과 관계없이 로컬 토큰 삭제 - clearTokens(); + // 응답과 관계없이 로컬 데이터 전체 삭제 + clearAllLocalData(); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); @@ -616,8 +630,8 @@ export async function logoutAll(): Promise { method: 'POST', }); - // 응답과 관계없이 로컬 토큰 삭제 - clearTokens(); + // 응답과 관계없이 로컬 데이터 전체 삭제 + clearAllLocalData(); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`);