w-lab-app/src/hooks/payment/useSingleCheckout.ts
gofnnp f75185656f AW-493-additional-purchases
add api using
2025-07-08 19:35:41 +04:00

72 lines
1.7 KiB
TypeScript

"use client";
import { useCallback, useMemo, useState } from "react";
import { performSingleCheckout } from "@/entities/payment/actions";
import { PaymentInfo, SingleCheckoutRequest } from "@/entities/payment/types";
interface UseSingleCheckoutOptions {
onSuccess?: () => void;
onError?: (error: string) => void;
}
export function useSingleCheckout(options: UseSingleCheckoutOptions = {}) {
const [isLoading, setIsLoading] = useState(false);
const { onSuccess, onError } = options;
const handleSingleCheckout = useCallback(
async (paymentInfo: PaymentInfo) => {
if (isLoading) return;
setIsLoading(true);
try {
const payload: SingleCheckoutRequest = {
paymentInfo,
};
const response = await performSingleCheckout(payload);
if (response.error) {
onError?.(response.error);
return;
}
if (!response.data) {
onError?.("Payment failed");
return;
}
if ("payment" in response.data) {
const { status } = response.data.payment;
if (status === "paid") {
onSuccess?.();
} else {
onError?.("Payment status is not paid");
}
} else {
const errorMessage = response.data.message || "Payment failed";
onError?.(errorMessage);
}
} catch (error) {
const errorMessage =
error instanceof Error ? error.message : "Payment failed";
onError?.(errorMessage);
} finally {
setIsLoading(false);
}
},
[onSuccess, onError, isLoading]
);
return useMemo(
() => ({
handleSingleCheckout,
isLoading,
}),
[handleSingleCheckout, isLoading]
);
}