From cbf411cd5437611cc832b7d131d7613fde5a2315 Mon Sep 17 00:00:00 2001 From: Primakov Alexandr Date: Sun, 14 Dec 2025 14:17:30 +0300 Subject: [PATCH] Implement final answer management in submission hook and storage utilities. Add functions to save, load, and clear final answers in localStorage. Update useSubmission hook to prioritize final answers over drafts, enhancing user experience during task submissions. --- src/hooks/useSubmission.ts | 23 +++++++++++++++++++---- src/utils/drafts.ts | 32 ++++++++++++++++++++++++++++++++ src/utils/storage.ts | 9 +++++++++ 3 files changed, 60 insertions(+), 4 deletions(-) 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)) }, // Очистка всех прогрессов по цепочкам