fix(studio): recover uncertain imports with persistent request identities
This commit is contained in:
1 parent
afea80708c
commit
c977fe95ba
12 files changed
+365
-31
No files matched your search
@@ -1,11 +1,12 @@
|
||||
"use client";
|
||||
import { useQuery } from "@tanstack/react-query";
|
||||
import { useTranslations } from "next-intl";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
||||
import { toast } from "sonner";
|
||||
import { useVisiblePolling } from "@/hooks/use-visible-polling";
|
||||
import { adminFetch } from "@/lib/admin-fetch";
|
||||
import type { ImportJobItem } from "@/lib/furni/import-job";
|
||||
import { createFurnitureImportRequests } from "./furniture-import-requests";
|
||||
import {
|
||||
createFurnitureJobsClient,
|
||||
FurnitureJobsHttpError,
|
||||
@@ -14,7 +15,11 @@ import {
|
||||
readFurnitureJobResponse,
|
||||
} from "./furniture-jobs-query";
|
||||
|
||||
export function useFurnitureJobs(onComplete: () => void, paginated = false) {
|
||||
export function useFurnitureJobs(
|
||||
onComplete: () => void,
|
||||
paginated = false,
|
||||
actorId?: number,
|
||||
) {
|
||||
const t = useTranslations("pages.admin.importHistory");
|
||||
const [client] = useState(createFurnitureJobsClient);
|
||||
const cursor = useRef<string | null>(null);
|
||||
@@ -38,7 +43,10 @@ export function useFurnitureJobs(onComplete: () => void, paginated = false) {
|
||||
const completed = useRef(new Set<string>());
|
||||
const callback = useRef(onComplete);
|
||||
callback.current = onComplete;
|
||||
const request = useRef<{ payload: string; id: string } | null>(null);
|
||||
const requests = useMemo(
|
||||
() => createFurnitureImportRequests(actorId),
|
||||
[actorId],
|
||||
);
|
||||
const submitting = useRef(false);
|
||||
useEffect(
|
||||
() => () => {
|
||||
@@ -154,16 +162,21 @@ export function useFurnitureJobs(onComplete: () => void, paginated = false) {
|
||||
setBusy(true);
|
||||
const body = { items, ...options },
|
||||
payload = JSON.stringify(body);
|
||||
if (request.current?.payload !== payload)
|
||||
request.current = { payload, id: crypto.randomUUID() };
|
||||
|
||||
try {
|
||||
const request = await requests.get(payload);
|
||||
const response = await adminFetch("/api/admin/studio/import-jobs", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ ...body, id: request.current.id }),
|
||||
body: JSON.stringify({ ...body, id: request.id }),
|
||||
});
|
||||
await readFurnitureJobResponse(response, "Could not queue import");
|
||||
request.current = null;
|
||||
const accepted = await readFurnitureJobResponse(
|
||||
response,
|
||||
"Could not queue import",
|
||||
);
|
||||
if (accepted.id !== request.id)
|
||||
throw Error("Could not confirm the queued import");
|
||||
requests.acknowledge(request);
|
||||
await client.cancelQueries();
|
||||
resetPage();
|
||||
await refresh();
|
||||
|
||||
Reference in new issue
Block a user