72 lines
1.7 KiB
TypeScript
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]
|
|
);
|
|
}
|