w-lab-app/src/hooks/payment/useSingleCheckout.ts
gofnnp fe4ed88cf8 AW-503-additional-purchases
redirect when single payment, return_url & pageUrl
2025-08-30 19:16:01 +04:00

79 lines
2.0 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 {
returnUrl?: string;
onSuccess?: () => void;
onError?: (error: string) => void;
}
export function useSingleCheckout(options: UseSingleCheckoutOptions = {}) {
const [isLoading, setIsLoading] = useState(false);
const { returnUrl, onSuccess, onError } = options;
const handleSingleCheckout = useCallback(
async (paymentInfo: PaymentInfo) => {
if (isLoading) return;
setIsLoading(true);
try {
const payload: SingleCheckoutRequest = {
paymentInfo,
pageUrl: typeof window !== "undefined" ? window.location.href : "",
return_url: returnUrl,
};
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, paymentUrl } = response.data.payment;
if (paymentUrl) {
return window.location.replace(paymentUrl);
}
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);
}
},
[isLoading, returnUrl, onError, onSuccess]
);
return useMemo(
() => ({
handleSingleCheckout,
isLoading,
}),
[handleSingleCheckout, isLoading]
);
}