87 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-09-20 19:40:44 +02:00
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { Promises } from "../../utils/promises";
import { WebStorage } from "../../utils/web-storage";
2024-09-24 17:52:34 +02:00
import { AvailabilityState } from "./types";
2024-09-20 19:40:44 +02:00
import { Dispatch, useState } from "react";
import {
StepperAction,
StepperState,
} from "@codex-storage/marketplace-ui-components";
import { Times } from "../../utils/times";
2024-09-23 18:41:13 +02:00
import { CodexSdk } from "../../sdk/codex";
import { AvailabilityStorage } from "../../utils/availabilities-storage";
import { CodexAvailabilityCreateResponse } from "@codex-storage/sdk-js";
2024-09-20 19:40:44 +02:00
export function useAvailabilityMutation(
dispatch: Dispatch<StepperAction>,
state: StepperState
) {
const queryClient = useQueryClient();
2024-09-23 18:41:13 +02:00
const [error, setError] = useState<Error | null>(null);
2024-09-20 19:40:44 +02:00
const { mutateAsync } = useMutation({
/* eslint-disable @typescript-eslint/no-unused-vars */
2024-09-20 19:40:44 +02:00
mutationFn: ({
totalSize,
totalSizeUnit,
duration,
durationUnit = "days",
name,
2024-09-20 19:40:44 +02:00
...input
2024-09-24 17:52:34 +02:00
}: AvailabilityState) => {
2024-09-20 19:40:44 +02:00
const unit = totalSizeUnit === "gb" ? GB : TB;
2024-09-24 11:35:00 +02:00
const time = Times.toSeconds(duration, durationUnit);
2024-09-20 19:40:44 +02:00
const fn: (
2024-09-24 17:52:34 +02:00
input: Omit<AvailabilityState, "totalSizeUnit" | "durationUnit">
2024-09-27 19:06:13 +02:00
) => Promise<unknown> = input.id
? (input) =>
2024-10-08 16:05:59 +02:00
CodexSdk.marketplace()
2024-09-27 19:06:13 +02:00
.updateAvailability({ ...input, id: input.id || "" })
.then((s) => Promises.rejectOnError(s))
: (input) =>
2024-10-08 16:05:59 +02:00
CodexSdk.marketplace()
2024-09-27 19:06:13 +02:00
.createAvailability(input)
.then((s) => Promises.rejectOnError(s));
2024-09-20 19:40:44 +02:00
return fn({
...input,
duration: time,
totalSize: Math.trunc(totalSize),
2024-09-27 19:06:13 +02:00
});
2024-09-20 19:40:44 +02:00
},
onSuccess: (res, body) => {
queryClient.invalidateQueries({ queryKey: ["availabilities"] });
2024-09-20 19:40:44 +02:00
queryClient.invalidateQueries({ queryKey: ["space"] });
WebStorage.delete("availability");
2024-09-23 17:04:08 +02:00
WebStorage.delete("availability-step");
2024-09-20 19:40:44 +02:00
if (typeof res === "object" && body.name) {
AvailabilityStorage.add(res.id, body.name)
}
2024-09-25 13:18:20 +02:00
setError(null);
2024-09-20 19:40:44 +02:00
dispatch({
type: "next",
step: state.step,
});
},
onError: (error) => {
2024-09-23 18:41:13 +02:00
setError(error);
WebStorage.set("availability-step", state.step - 1);
2024-09-23 18:41:13 +02:00
dispatch({
type: "next",
step: state.step,
});
2024-09-20 19:40:44 +02:00
},
2024-09-27 19:06:13 +02:00
throwOnError: false,
2024-09-20 19:40:44 +02:00
});
2024-09-23 18:41:13 +02:00
return { mutateAsync, error };
2024-09-20 19:40:44 +02:00
}