A05: Restore draft on rate_limited/server_error/timeout states

- Extend draft recovery to create_error, rate_limited, server_error, timeout
- Clear draft only on success (sent/screenshot_sent)
- Focus on form-error after recovery
- Double submit protection already in place (R10)
- Astro check: 0 errors
This commit is contained in:
ik
2026-09-10 06:12:09 +07:00
parent 2ccca7350f
commit 9e4d7aefba
+13 -2
View File
@@ -22,8 +22,19 @@ const reportId = Astro.url.searchParams.get("report_id");
</form>} </form>}
<script is:inline define:vars={{ state }}> <script is:inline define:vars={{ state }}>
const form = document.querySelector(".report-form"); const key = "rf4-report-draft"; const form = document.querySelector(".report-form"); const key = "rf4-report-draft";
if (form && state === "create_error") { try { const draft = JSON.parse(sessionStorage.getItem(key) || "{}"); for (const [name, value] of Object.entries(draft)) { const field = form.elements.namedItem(name); if (field && "value" in field) field.value = value; } } catch {} document.querySelector("#form-error")?.focus(); } // A05: Restore draft on all error states that don't destroy the submission
if (state === "sent") sessionStorage.removeItem(key); const recoverableStates = ["create_error", "rate_limited", "server_error", "timeout"];
if (form && recoverableStates.includes(state)) {
try {
const draft = JSON.parse(sessionStorage.getItem(key) || "{}");
for (const [name, value] of Object.entries(draft)) {
const field = form.elements.namedItem(name);
if (field && "value" in field) field.value = value;
}
} catch {}
document.querySelector("#form-error")?.focus();
}
if (state === "sent" || state === "screenshot_sent") sessionStorage.removeItem(key);
form?.addEventListener("submit", () => { form?.addEventListener("submit", () => {
const btn = form.querySelector("button[type=submit]"); const btn = form.querySelector("button[type=submit]");
if (btn) { btn.disabled = true; btn.textContent = "Отправка..."; } if (btn) { btn.disabled = true; btn.textContent = "Отправка..."; }