local storage 삭제 .
parent
00b85834fd
commit
16ef7bd97d
|
|
@ -20,16 +20,6 @@ interface SoundStudioContentProps {
|
||||||
|
|
||||||
type GenerationStatus = 'idle' | 'generating_lyric' | 'generating_song' | 'polling' | 'complete' | 'error';
|
type GenerationStatus = 'idle' | 'generating_lyric' | 'generating_song' | 'polling' | 'complete' | 'error';
|
||||||
|
|
||||||
interface SavedGenerationState {
|
|
||||||
taskId: string;
|
|
||||||
songId: string;
|
|
||||||
lyrics: string;
|
|
||||||
status: GenerationStatus;
|
|
||||||
timestamp: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
const STORAGE_KEY = 'castad_song_generation';
|
|
||||||
const STORAGE_EXPIRY = 30 * 60 * 1000;
|
|
||||||
const MAX_RETRY_COUNT = 3;
|
const MAX_RETRY_COUNT = 3;
|
||||||
|
|
||||||
const LANGUAGE_FLAGS: Record<string, string> = {
|
const LANGUAGE_FLAGS: Record<string, string> = {
|
||||||
|
|
@ -55,7 +45,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
const [progress, setProgress] = useState(0);
|
const [progress, setProgress] = useState(0);
|
||||||
const [isDragging, setIsDragging] = useState(false);
|
const [isDragging, setIsDragging] = useState(false);
|
||||||
const [status, setStatus] = useState<GenerationStatus>('idle');
|
const [status, setStatus] = useState<GenerationStatus>('idle');
|
||||||
const [showLyrics, setShowLyrics] = useState(false);
|
|
||||||
const [lyrics, setLyrics] = useState('');
|
const [lyrics, setLyrics] = useState('');
|
||||||
const [audioUrl, setAudioUrl] = useState<string | null>(null);
|
const [audioUrl, setAudioUrl] = useState<string | null>(null);
|
||||||
const [isPlaying, setIsPlaying] = useState(false);
|
const [isPlaying, setIsPlaying] = useState(false);
|
||||||
|
|
@ -71,53 +60,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
const audioRef = useRef<HTMLAudioElement>(null);
|
const audioRef = useRef<HTMLAudioElement>(null);
|
||||||
const languageDropdownRef = useRef<HTMLDivElement>(null);
|
const languageDropdownRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
const saveToStorage = (taskId: string, songId: string, currentLyrics: string, currentStatus: GenerationStatus) => {
|
|
||||||
const data: SavedGenerationState = {
|
|
||||||
taskId,
|
|
||||||
songId,
|
|
||||||
lyrics: currentLyrics,
|
|
||||||
status: currentStatus,
|
|
||||||
timestamp: Date.now(),
|
|
||||||
};
|
|
||||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(data));
|
|
||||||
};
|
|
||||||
|
|
||||||
const clearStorage = () => {
|
|
||||||
localStorage.removeItem(STORAGE_KEY);
|
|
||||||
};
|
|
||||||
|
|
||||||
const loadFromStorage = (): SavedGenerationState | null => {
|
|
||||||
try {
|
|
||||||
const saved = localStorage.getItem(STORAGE_KEY);
|
|
||||||
if (!saved) return null;
|
|
||||||
|
|
||||||
const data: SavedGenerationState = JSON.parse(saved);
|
|
||||||
|
|
||||||
if (Date.now() - data.timestamp > STORAGE_EXPIRY) {
|
|
||||||
clearStorage();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
} catch {
|
|
||||||
clearStorage();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const savedState = loadFromStorage();
|
|
||||||
if (savedState && (savedState.status === 'polling' || savedState.status === 'generating_song')) {
|
|
||||||
if (savedState.lyrics) {
|
|
||||||
setLyrics(savedState.lyrics);
|
|
||||||
setShowLyrics(true);
|
|
||||||
}
|
|
||||||
setStatus('polling');
|
|
||||||
setStatusMessage('노래를 생성하고 있습니다... (새로고침 후 복구됨)');
|
|
||||||
resumePolling(savedState.taskId, savedState.songId, savedState.lyrics, 0);
|
|
||||||
}
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
// Close language dropdown when clicking outside
|
// Close language dropdown when clicking outside
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const handleClickOutside = (event: MouseEvent) => {
|
const handleClickOutside = (event: MouseEvent) => {
|
||||||
|
|
@ -168,7 +110,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
setStatus('complete');
|
setStatus('complete');
|
||||||
setStatusMessage('');
|
setStatusMessage('');
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Polling failed:', error);
|
console.error('Polling failed:', error);
|
||||||
|
|
@ -183,13 +124,11 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
setStatus('error');
|
setStatus('error');
|
||||||
setErrorMessage('여러 번 시도했지만 음악 생성에 실패했습니다. 다시 시도해주세요.');
|
setErrorMessage('여러 번 시도했지만 음악 생성에 실패했습니다. 다시 시도해주세요.');
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
setStatus('error');
|
setStatus('error');
|
||||||
setErrorMessage(error instanceof Error ? error.message : '음악 생성 중 오류가 발생했습니다.');
|
setErrorMessage(error instanceof Error ? error.message : '음악 생성 중 오류가 발생했습니다.');
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -220,7 +159,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
throw new Error(songResponse.error_message || '음악 생성 요청에 실패했습니다.');
|
throw new Error(songResponse.error_message || '음악 생성 요청에 실패했습니다.');
|
||||||
}
|
}
|
||||||
|
|
||||||
saveToStorage(songResponse.task_id, songResponse.song_id, currentLyrics, 'polling');
|
|
||||||
await resumePolling(songResponse.task_id, songResponse.song_id, currentLyrics, currentRetryCount);
|
await resumePolling(songResponse.task_id, songResponse.song_id, currentLyrics, currentRetryCount);
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -228,7 +166,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
setStatus('error');
|
setStatus('error');
|
||||||
setErrorMessage(error instanceof Error ? error.message : '음악 재생성 중 오류가 발생했습니다.');
|
setErrorMessage(error instanceof Error ? error.message : '음악 재생성 중 오류가 발생했습니다.');
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -367,7 +304,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
}
|
}
|
||||||
|
|
||||||
setLyrics(lyricDetailResponse.lyric_result);
|
setLyrics(lyricDetailResponse.lyric_result);
|
||||||
setShowLyrics(true);
|
|
||||||
|
|
||||||
setStatus('generating_song');
|
setStatus('generating_song');
|
||||||
setStatusMessage('노래를 생성하고 있습니다...');
|
setStatusMessage('노래를 생성하고 있습니다...');
|
||||||
|
|
@ -395,7 +331,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
|
|
||||||
setStatus('polling');
|
setStatus('polling');
|
||||||
setStatusMessage('노래를 생성하고 있습니다...');
|
setStatusMessage('노래를 생성하고 있습니다...');
|
||||||
saveToStorage(songResponse.task_id, songResponse.song_id, lyricDetailResponse.lyric_result, 'polling');
|
|
||||||
|
|
||||||
await resumePolling(songResponse.task_id, songResponse.song_id, lyricDetailResponse.lyric_result, 0);
|
await resumePolling(songResponse.task_id, songResponse.song_id, lyricDetailResponse.lyric_result, 0);
|
||||||
|
|
||||||
|
|
@ -404,12 +339,10 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
setStatus('error');
|
setStatus('error');
|
||||||
setErrorMessage(error instanceof Error ? error.message : '음악 생성 중 오류가 발생했습니다.');
|
setErrorMessage(error instanceof Error ? error.message : '음악 생성 중 오류가 발생했습니다.');
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRegenerate = async () => {
|
const handleRegenerate = async () => {
|
||||||
setShowLyrics(false);
|
|
||||||
setAudioUrl(null);
|
setAudioUrl(null);
|
||||||
setLyrics('');
|
setLyrics('');
|
||||||
setProgress(0);
|
setProgress(0);
|
||||||
|
|
@ -417,7 +350,6 @@ const SoundStudioContent: React.FC<SoundStudioContentProps> = ({
|
||||||
setDuration(0);
|
setDuration(0);
|
||||||
setIsPlaying(false);
|
setIsPlaying(false);
|
||||||
setRetryCount(0);
|
setRetryCount(0);
|
||||||
clearStorage();
|
|
||||||
await handleGenerateMusic();
|
await handleGenerateMusic();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue