diff --git a/src/hooks/useSubmission.ts b/src/hooks/useSubmission.ts index 487ac70..8d5e2e6 100644 --- a/src/hooks/useSubmission.ts +++ b/src/hooks/useSubmission.ts @@ -6,6 +6,7 @@ import { } from '../__data__/api/api' import type { ChallengeSubmission, QueueStatus } from '../__data__/types' import { useChallenge } from '../context/ChallengeContext' +import { loadFinalAnswer, saveFinalAnswer } from '../utils/drafts' interface UseSubmissionArgs { taskId: string @@ -43,13 +44,24 @@ export const useSubmission = ({ taskId }: UseSubmissionArgs): SubmissionResult = useEffect(() => { behaviorTracker.reset() - const draft = loadDraft(taskId) - if (draft) { - setResultState(draft) + + // Сначала проверяем финальный ответ (если задание уже решалось) + const finalAnswer = loadFinalAnswer(taskId) + if (finalAnswer) { + setResultState(finalAnswer) behaviorTracker.markDraftUsed() } else { - setResultState('') + // Если финального ответа нет, проверяем черновик + const draft = loadDraft(taskId) + if (draft) { + setResultState(draft) + behaviorTracker.markDraftUsed() + } else { + // Если ничего нет - пустое поле + setResultState('') + } } + pollingManager.stop() setQueueId(null) setQueueStatus(null) @@ -114,6 +126,9 @@ export const useSubmission = ({ taskId }: UseSubmissionArgs): SubmissionResult = }) setFinalSubmission(status.submission) + // Сохраняем финальный ответ для восстановления при возврате + saveFinalAnswer(taskId, result) + // Очищаем черновик, так как теперь есть финальный ответ clearDraft(taskId) pollingManager.stop() return false diff --git a/src/utils/drafts.ts b/src/utils/drafts.ts index 1a349e8..161f5c5 100644 --- a/src/utils/drafts.ts +++ b/src/utils/drafts.ts @@ -1,4 +1,5 @@ const STORAGE_PREFIX = 'challenge_draft_' +const FINAL_ANSWER_PREFIX = 'challenge_final_answer_' const isBrowser = () => typeof window !== 'undefined' && typeof window.localStorage !== 'undefined' @@ -17,6 +18,24 @@ export function clearDraft(taskId: string) { window.localStorage.removeItem(`${STORAGE_PREFIX}${taskId}`) } +// Сохранение финального ответа (после успешной отправки) +export function saveFinalAnswer(taskId: string, result: string) { + if (!isBrowser()) return + window.localStorage.setItem(`${FINAL_ANSWER_PREFIX}${taskId}`, result) +} + +// Загрузка финального ответа +export function loadFinalAnswer(taskId: string): string | null { + if (!isBrowser()) return null + return window.localStorage.getItem(`${FINAL_ANSWER_PREFIX}${taskId}`) +} + +// Очистка финального ответа +export function clearFinalAnswer(taskId: string) { + if (!isBrowser()) return + window.localStorage.removeItem(`${FINAL_ANSWER_PREFIX}${taskId}`) +} + export function listDrafts() { if (!isBrowser()) return [] as string[] @@ -30,3 +49,16 @@ export function listDrafts() { return keys } +// Очистка всех финальных ответов (при выходе) +export function clearAllFinalAnswers() { + if (!isBrowser()) return + const keysToRemove: string[] = [] + for (let i = 0; i < window.localStorage.length; i += 1) { + const key = window.localStorage.key(i) + if (key?.startsWith(FINAL_ANSWER_PREFIX)) { + keysToRemove.push(key) + } + } + keysToRemove.forEach(key => window.localStorage.removeItem(key)) +} + diff --git a/src/utils/storage.ts b/src/utils/storage.ts index 9767c85..f5cea93 100644 --- a/src/utils/storage.ts +++ b/src/utils/storage.ts @@ -3,6 +3,8 @@ * Все ключи и операции в одном месте */ +import { clearAllFinalAnswers, listDrafts, clearDraft } from './drafts' + const isBrowser = () => typeof window !== 'undefined' // Ключи localStorage @@ -107,6 +109,13 @@ export const storage = { // Очищаем все прогрессы по цепочкам storage.clearAllChainProgress() + + // Очищаем все финальные ответы + clearAllFinalAnswers() + + // Очищаем все черновики + const drafts = listDrafts() + drafts.forEach(taskId => clearDraft(taskId)) }, // Очистка всех прогрессов по цепочкам