fix(news): persist publication requests and retry cache delivery
CI / check (push) Successful in 3m12s
CI / deploy (push) Successful in 1m13s
CI / publish-container (push) Successful in 42s

This commit is contained in:
Simo committed 2026-09-13 18:33:45 +02:00
1 parent c977fe95ba
commit 52f6d1491f
40 files changed
+733 -134

No files matched your search

+25 -1
View File
@@ -7,6 +7,7 @@ import { useFormRecovery } from "@/hooks/use-form-recovery";
import { useUnsavedChanges } from "@/hooks/use-unsaved-changes";
import type { ArticleDraft } from "@/lib/article-draft";
import type { ArticleSaveResult } from "@/lib/article-input";
import { type ArticleRequest, articleRequest } from "@/lib/article-request";
import { slugify } from "@/lib/format";
import { publicationIssues } from "@/lib/publication-preflight";
import { ArticlePreview, type ArticlePreviewData } from "./article-preview";
@@ -46,6 +47,8 @@ export function ArticleForm({
const [saveError, setSaveError] = useState<string | null>(null);
const router = useRouter();
const saving = useRef(false);
const request = useRef<ArticleRequest | undefined>(undefined);
const requestScope = `${userId ?? "current"}:${articleKey}`;
const editVersion = useRef(0);
function markDirty() {
localRecovery.changed();
@@ -156,6 +159,19 @@ export function ArticleForm({
startTransition(async () => {
try {
await recovery.wait();
let storage: Storage | undefined;
try {
storage = window.sessionStorage;
} catch {
/* Storage may be disabled. */
}
request.current = await articleRequest(
data,
requestScope,
request.current,
storage,
);
data.set("requestKey", request.current.key);
const result = await action(data);
if (result && !result.ok) {
setSaveError(result.error);
@@ -166,7 +182,15 @@ export function ArticleForm({
setDirty(false);
localRecovery.clear();
}
if (result?.ok) await recovery.clear().catch(() => {});
if (result?.ok) {
request.current = undefined;
try {
storage?.removeItem(`cms:news:request:${requestScope}`);
} catch {
/* Storage may be disabled. */
}
await recovery.clear().catch(() => {});
}
if (result?.ok && result.data?.redirectTo)
router.push(result.data.redirectTo);
} catch (error) {