diff --git a/src/components/PayPalPayment.tsx b/src/components/PayPalPayment.tsx index f009298b..c1e72ffe 100644 --- a/src/components/PayPalPayment.tsx +++ b/src/components/PayPalPayment.tsx @@ -70,18 +70,26 @@ export default function PayPalPayment({ throw new Error("trackingId is not set"); } - const request = await axios.post<{ ok: boolean; reason?: string }>( - "/api/paypal/approve", - { id: data.orderID, duration, duration_unit, trackingId } - ); + axios + .post<{ ok: boolean; reason?: string }>("/api/paypal/approve", { + id: data.orderID, + duration, + duration_unit, + trackingId, + }) + .then((request) => { + if (request.status !== 200) { + toast.error("Something went wrong, please try again later"); + return; + } - if (request.status !== 200) { - toast.error("Something went wrong, please try again later"); - return; - } - - toast.success("Your account has been credited more time!"); - return onSuccess(duration, duration_unit); + toast.success("Your account has been credited more time!"); + return onSuccess(duration, duration_unit); + }) + .catch((err) => { + console.error(err); + toast.error("Something went wrong, please try again later"); + }); }; const onError = async (data: Record) => { diff --git a/src/pages/(status)/PaymentDue.tsx b/src/pages/(status)/PaymentDue.tsx index 8fc53f49..e6aab64b 100644 --- a/src/pages/(status)/PaymentDue.tsx +++ b/src/pages/(status)/PaymentDue.tsx @@ -15,6 +15,8 @@ import InviteCard from "@/components/Medium/InviteCard"; import {useRouter} from "next/router"; import {PayPalScriptProvider} from "@paypal/react-paypal-js"; import { usePaypalTracking } from "@/hooks/usePaypalTracking"; +import {ToastContainer} from "react-toastify"; + interface Props { user: User; @@ -47,6 +49,7 @@ export default function PaymentDue({user, hasExpired = false, clientID, reload}: return ( <> + {isLoading && (
diff --git a/src/pages/api/paypal/approve.ts b/src/pages/api/paypal/approve.ts index 6b9eb601..af9f18f9 100644 --- a/src/pages/api/paypal/approve.ts +++ b/src/pages/api/paypal/approve.ts @@ -49,79 +49,89 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { "PayPal-Client-Metadata-Id": trackingId, }, }; - const request = await axios.post(url, {}, headers); + axios + .post(url, {}, headers) + .then(async (request) => { + if (request.data.status === "COMPLETED") { + const user = req.session.user; + const subscriptionExpirationDate = + user!.subscriptionExpirationDate; + const today = moment(new Date()); + const dateToBeAddedTo = !subscriptionExpirationDate + ? today + : moment(subscriptionExpirationDate).isAfter(today) + ? moment(subscriptionExpirationDate) + : today; - if (request.data.status === "COMPLETED") { - const user = req.session.user; - const subscriptionExpirationDate = - req.session.user.subscriptionExpirationDate; - const today = moment(new Date()); - const dateToBeAddedTo = !subscriptionExpirationDate - ? today - : moment(subscriptionExpirationDate).isAfter(today) - ? moment(subscriptionExpirationDate) - : today; + const updatedExpirationDate = dateToBeAddedTo.add( + duration, + duration_unit + ); + await setDoc( + doc(db, "users", req.session.user!.id), + { + subscriptionExpirationDate: updatedExpirationDate.toISOString(), + status: "active", + }, + { merge: true } + ); - const updatedExpirationDate = dateToBeAddedTo.add(duration, duration_unit); - await setDoc( - doc(db, "users", req.session.user.id), - { - subscriptionExpirationDate: updatedExpirationDate.toISOString(), - status: "active", - }, - { merge: true } - ); + try { + await setDoc(doc(db, "paypalpayments", v4()), { + orderId: id, + userId: req.session.user!.id, + status: request.data.status, + createdAt: new Date().toISOString(), + value: + request.data.purchase_units[0].payments.captures[0].amount.value, + currency: + request.data.purchase_units[0].payments.captures[0].amount + .currency_code, + subscriptionDuration: duration, + subscriptionDurationUnit: duration_unit, + subscriptionExpirationDate: updatedExpirationDate.toISOString(), + }); + } catch (err) { + console.error("Failed to insert paypal payment!", err); + } - try { - await setDoc(doc(db, "paypalpayments", v4()), { - orderId: id, - userId: req.session.user.id, - status: request.data.status, - createdAt: new Date().toISOString(), - value: request.data.purchase_units[0].payments.captures[0].amount.value, - currency: - request.data.purchase_units[0].payments.captures[0].amount - .currency_code, - subscriptionDuration: duration, - subscriptionDurationUnit: duration_unit, - subscriptionExpirationDate: updatedExpirationDate.toISOString(), - }); - } catch (err) { - console.error("Failed to insert paypal payment!", err); - } + if (user!.type === "corporate") { + const snapshot = await getDocs(collection(db, "groups")); + const groups: Group[] = ( + snapshot.docs.map((doc) => ({ + id: doc.id, + ...doc.data(), + })) as Group[] + ).filter((x) => x.admin === user!.id); - if (user.type === "corporate") { - const snapshot = await getDocs(collection(db, "groups")); - const groups: Group[] = ( - snapshot.docs.map((doc) => ({ - id: doc.id, - ...doc.data(), - })) as Group[] - ).filter((x) => x.admin === user.id); - - await Promise.all( - groups - .flatMap((x) => x.participants) - .map( - async (x) => - await setDoc( - doc(db, "users", x), - { - subscriptionExpirationDate: - updatedExpirationDate.toISOString(), - status: "active", - }, - { merge: true } + await Promise.all( + groups + .flatMap((x) => x.participants) + .map( + async (x) => + await setDoc( + doc(db, "users", x), + { + subscriptionExpirationDate: + updatedExpirationDate.toISOString(), + status: "active", + }, + { merge: true } + ) ) - ) - ); - } + ); + } - return res.status(200).json({ ok: true }); - } + return res.status(200).json({ ok: true }); + } - res.status(404).json({ - ok: false, - reason: "Order ID not found or purchase was not approved!", - }); + res.status(404).json({ + ok: false, + reason: "Order ID not found or purchase was not approved!", + }); + }) + .catch((err) => { + console.error(err.response.status, err.response.data); + res.status(err.response.status).json(err.response.data); + }); } diff --git a/src/pages/api/paypal/index.ts b/src/pages/api/paypal/index.ts index 2e793d31..9b01efe8 100644 --- a/src/pages/api/paypal/index.ts +++ b/src/pages/api/paypal/index.ts @@ -32,16 +32,29 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { return res.status(401).json({ ok: false, reason: "Missing tracking id!" }); const url = `${process.env.PAYPAL_ACCESS_TOKEN_URL}/v2/checkout/orders`; + const amount = { + currency_code: currencyCode, + value: price.toString(), + }; const data = { purchase_units: [ { invoice_id: `INV-${v4()}`, amount: { - currency_code: currencyCode, - value: price.toString(), + ...amount, + breakdown: { + item_total: amount, + }, }, - reference_id: v4(), + items: [ + { + name: "Encoach Subscription", + quantity: "1", + category: "DIGITAL_GOODS", + unit_amount: amount, + }, + ], }, ], payment_source: { @@ -74,7 +87,13 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { }) ); - const request = await axios.post(url, data, headers); - - res.status(request.status).json(request.data); + axios + .post(url, data, headers) + .then((request) => { + res.status(request.status).json(request.data); + }) + .catch((err) => { + console.error(err.response.status, err.response.data); + res.status(err.response.status).json(err.response.data); + }); }