fix(submit): make the draft chain survive continuous writing, reloads and flaky networks

Autosave only ran after 4s of idle, and every keystroke reset that timer, so a
writer who never stopped had zero saves (measured: 15s of typing = 0 requests).
Saving also never rebound the URL, so a new draft could not be found again after
a reload, the local backup was cleared on every autosave, and a failed save had
no retry and stayed failed once the network came back.

Client
- autosave: keep the idle debounce but add a 30s max-wait window that is not
  reset by further keystrokes, and retry failures at 5s / 15s / 60s
- bind `?edit=<id>` into the URL once the server returns a post id, so reloads,
  new tabs and history all reopen the same draft
- only clear the local backup when the save settled and nothing changed since
- key the local backup by draft id instead of the constant `jio-studio-0`
- restore snapshots through hydrateBlocks so code blocks come back editable
- never disable publish while an autosave is in flight, and mark autosave
  states separately (自动保存中… / 已自动保存 / 自动保存失败,将重试)
- on 409, adopt the server rev and tell the author instead of failing silently
- status bar reports the real save state instead of a bogus Markdown hint

Server
- draft saves no longer rewrite the lifecycle: pending / future / publish /
  private posts keep their status, so an autosave cannot pull a submitted post
  out of the review queue
- drafts and autosaves stop consuming the publish flood quota, which is meant to
  cap actual publishing (measured: 4 drafts used to burn 4 slots)
- autosave skips wp_save_post_revision for both plain drafts and submission
  versions; manual saves and submits still create a revision to roll back to
- media-only drafts (image / table / code / hr) count as content
- the response now carries the resulting status so the client can tell
  "just submitted" from "still under review"

Tests cover the max-wait window, retry schedule, URL binding, backup clearing,
status labelling and every server-side draft rule.
This commit is contained in:
kate522 committed 2026-11-10 17:58:22 +08:00
1 parent ec582ac9f9
commit a5386f72c6
10 files changed
+330 -49

No files matched your search

@@ -193,7 +193,16 @@ namespace {
function user_can($user_id, $capability, ...$args): bool { return false; }
function add_filter($tag, $callback, $priority = 10, $accepted_args = 1): bool { return true; }
function remove_filter($tag, $callback, $priority = 10): bool { return true; }
function add_action($tag, $callback, $priority = 10, $accepted_args = 1): bool { return true; }
function remove_action($tag, $callback, $priority = 10): bool { return true; }
function do_action($tag, ...$args): void { $GLOBALS['front_pending_state']['actions'][] = $tag; }
function get_post_status($post = null): string {
if ($post instanceof WP_Post) {
return (string) $post->post_status;
}
$found = $GLOBALS['front_pending_state']['posts'][(int) $post] ?? null;
return $found instanceof WP_Post ? (string) $found->post_status : false;
}
function current_time($type): string { return '2026-10-30 12:00:00'; }
function wp_set_post_categories($post_id, $categories): void {}
function get_terms($args = []) {