Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 31 additions & 7 deletions src/components/AsyncOperations/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,20 @@ import type {
AsyncOperationStatusResponse,
AsyncOperationsListResponse,
ListQuery,
StatusQuery,
} from "./types";

const LIST_KEY = ["async-operations", "list"] as const;
const STATUS_KEY = (id: string) => ["async-operations", "status", id] as const;
const LIST_COUNT = 5000;

function buildListUrl(q: ListQuery): string {
const params = new URLSearchParams();
if (q.statusFilter !== "all") params.set("status", q.statusFilter);
if (q.taskName.trim()) params.set("task-name", q.taskName.trim());
params.set("sort", q.sortField);
params.set("order", q.sortOrder);
params.set("_count", String(LIST_COUNT));
params.set("_count", String(q.pageSize));
params.set("_offset", String((q.page - 1) * q.pageSize));
const qs = params.toString();
return qs ? `/$async-operations?${qs}` : "/$async-operations";
}
Expand All @@ -31,7 +32,10 @@ export function useAsyncOperationsList(query: ListQuery) {
query.taskName.trim(),
query.sortField,
query.sortOrder,
query.page,
query.pageSize,
],
placeholderData: (previousData) => previousData,
queryFn: async () => {
const result = await client.request<AsyncOperationsListResponse>({
method: "GET",
Expand All @@ -47,26 +51,46 @@ export function useAsyncOperationsList(query: ListQuery) {
});
}

export function useAsyncOperationStatus(operationId: string | undefined) {
function buildStatusUrl(operationId: string, q: StatusQuery): string {
const params = new URLSearchParams();
params.set("_count", String(q.pageSize));
params.set("_offset", String((q.page - 1) * q.pageSize));
params.set("sort", q.sortField);
params.set("order", q.sortOrder);
return `/$async-operations/${encodeURIComponent(operationId)}?${params.toString()}`;
}

export function useAsyncOperationStatus(
operationId: string | undefined,
query: StatusQuery,
) {
const client = useAidboxClient();

return useQuery({
queryKey: operationId
? STATUS_KEY(operationId)
? [
...STATUS_KEY(operationId),
query.page,
query.pageSize,
query.sortField,
query.sortOrder,
]
: ["async-operations", "status", "none"],
enabled: !!operationId,
placeholderData: (previousData, previousQuery) =>
previousQuery?.queryKey[2] === operationId ? previousData : undefined,
queryFn: async () => {
const result = await client.request<AsyncOperationStatusResponse>({
method: "GET",
url: `/$async-operations/${encodeURIComponent(operationId ?? "")}`,
url: buildStatusUrl(operationId ?? "", query),
});
if (result.isOk()) {
return result.value.resource;
}
throw new Error("Failed to fetch async operation status");
},
refetchInterval: (query) => {
const data = query.state.data as AsyncOperationStatusResponse | undefined;
refetchInterval: (q) => {
const data = q.state.data as AsyncOperationStatusResponse | undefined;
return data?.status === "in-progress" ? 5_000 : false;
},
refetchOnWindowFocus: false,
Expand Down
Loading