fix(news): persist publication requests and retry cache delivery
This commit is contained in:
1 parent
c977fe95ba
commit
52f6d1491f
40 files changed
+733
-134
No files matched your search
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user