diff --git a/src/components/PaymobPayment.tsx b/src/components/PaymobPayment.tsx index 47cec9d6..6ff8b578 100644 --- a/src/components/PaymobPayment.tsx +++ b/src/components/PaymobPayment.tsx @@ -20,6 +20,7 @@ interface Props { export default function PaymobPayment({user, price, setIsPaymentLoading, currency, duration, duration_unit, onSuccess}: Props) { const [isLoading, setIsLoading] = useState(false); + console.log(user.id); const router = useRouter(); diff --git a/src/pages/(status)/PaymentDue.tsx b/src/pages/(status)/PaymentDue.tsx index a1fba804..cf04baa2 100644 --- a/src/pages/(status)/PaymentDue.tsx +++ b/src/pages/(status)/PaymentDue.tsx @@ -19,11 +19,10 @@ import moment from "moment"; interface Props { user: User; hasExpired?: boolean; - clientID: string; reload: () => void; } -export default function PaymentDue({user, hasExpired = false, clientID, reload}: Props) { +export default function PaymentDue({user, hasExpired = false, reload}: Props) { const [isLoading, setIsLoading] = useState(false); const [appliedDiscount, setAppliedDiscount] = useState(0); @@ -137,7 +136,6 @@ export default function PaymentDue({user, hasExpired = false, clientID, reload}: )} { @@ -177,7 +175,6 @@ export default function PaymentDue({user, hasExpired = false, clientID, reload}: {user.corporateInformation.payment.value} {user.corporateInformation.payment.currency} ( "https://oman.paymob.com/v1/intention/", - {...intention, payment_methods: [parseInt(process.env.PAYMOB_INTEGRATION_ID || "0")], items: []}, + { + ...intention, + payment_methods: [parseInt(process.env.PAYMOB_INTEGRATION_ID || "0")], + items: [], + extras: {...intention.extras, userID: req.session.user!.id}, + } as PaymentIntention, {headers: {Authorization: `Token ${process.env.PAYMOB_SECRET_KEY}`}}, ); const intentionResult = response.data; diff --git a/src/pages/api/paymob/webhook.ts b/src/pages/api/paymob/webhook.ts index 749dbd68..b4cf1bb4 100644 --- a/src/pages/api/paymob/webhook.ts +++ b/src/pages/api/paymob/webhook.ts @@ -22,8 +22,9 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const transactionResult = req.body as TransactionResult; const authToken = await authenticatePaymob(); + console.log("WEBHOOK: ", transactionResult); if (!checkTransaction(authToken, transactionResult.transaction.order.id)) return res.status(404).json({ok: false}); - if (!transactionResult.transaction.success) return res.status(200).json({ok: false}); + if (!transactionResult.transaction.success) return res.status(400).json({ok: false}); const {userID, duration, duration_unit} = transactionResult.intention.extras.creation_extras as { userID: string; @@ -42,9 +43,9 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const initialDate = moment(subscriptionExpirationDate).isAfter(moment()) ? moment(subscriptionExpirationDate) : moment(); - const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).toISOString(); + const updatedSubscriptionExpirationDate = moment(initialDate).add(duration, duration_unit).endOf("day").subtract(2, "hours").toISOString(); - await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); + await setDoc(userSnapshot.ref, {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"}, {merge: true}); await setDoc(doc(db, "paypalpayments", v4()), { createdAt: new Date().toISOString(), currency: transactionResult.transaction.currency, @@ -64,10 +65,16 @@ async function post(req: NextApiRequest, res: NextApiResponse) { const participants = (await Promise.all( groups.flatMap((x) => x.participants).map(async (x) => ({...(await getDoc(doc(db, "users", x))).data(), id: x})), )) as User[]; - const sameExpiryDateParticipants = participants.filter((x) => x.subscriptionExpirationDate === subscriptionExpirationDate); + const sameExpiryDateParticipants = participants.filter( + (x) => x.subscriptionExpirationDate === subscriptionExpirationDate && x.status !== "disabled", + ); for (const participant of sameExpiryDateParticipants) { - await setDoc(doc(db, "users", participant.id), {subscriptionExpirationDate: updatedSubscriptionExpirationDate}, {merge: true}); + await setDoc( + doc(db, "users", participant.id), + {subscriptionExpirationDate: updatedSubscriptionExpirationDate, status: "active"}, + {merge: true}, + ); } } diff --git a/src/pages/index.tsx b/src/pages/index.tsx index b74662b4..bd3365ea 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -49,7 +49,7 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => { redirect: { destination: "/login", permanent: false, - } + }, }; } @@ -63,7 +63,7 @@ interface Props { envVariables: {[key: string]: string}; } export default function Home(props: Props) { - const { envVariables} = props; + const {envVariables} = props; const [showDiagnostics, setShowDiagnostics] = useState(false); const [showDemographicInput, setShowDemographicInput] = useState(false); const [selectedScreen, setSelectedScreen] = useState("admin"); @@ -112,15 +112,7 @@ export default function Home(props: Props) { )} - {(user.status === "paymentDue" || checkIfUserExpired()) && ( - - )} + {(user.status === "paymentDue" || checkIfUserExpired()) && } ); } diff --git a/src/pages/payment.tsx b/src/pages/payment.tsx index f249b1c6..bc2984f3 100644 --- a/src/pages/payment.tsx +++ b/src/pages/payment.tsx @@ -1,62 +1,51 @@ /* eslint-disable @next/next/no-img-element */ import Head from "next/head"; -import { withIronSessionSsr } from "iron-session/next"; -import { sessionOptions } from "@/lib/session"; +import {withIronSessionSsr} from "iron-session/next"; +import {sessionOptions} from "@/lib/session"; import useUser from "@/hooks/useUser"; import PaymentDue from "./(status)/PaymentDue"; -import { useRouter } from "next/router"; +import {useRouter} from "next/router"; -export const getServerSideProps = withIronSessionSsr(({ req, res }) => { - const user = req.session.user; +export const getServerSideProps = withIronSessionSsr(({req, res}) => { + const user = req.session.user; - const envVariables: { [key: string]: string } = {}; - Object.keys(process.env) - .filter((x) => x.startsWith("NEXT_PUBLIC")) - .forEach((x: string) => { - envVariables[x] = process.env[x]!; - }); + const envVariables: {[key: string]: string} = {}; + Object.keys(process.env) + .filter((x) => x.startsWith("NEXT_PUBLIC")) + .forEach((x: string) => { + envVariables[x] = process.env[x]!; + }); - if (!user || !user.isVerified) { - return { + if (!user || !user.isVerified) { + return { redirect: { destination: "/login", permanent: false, - } + }, }; - } + } - return { - props: { user: req.session.user, envVariables }, - }; + return { + props: {user: req.session.user, envVariables}, + }; }, sessionOptions); -export default function Home({ - envVariables, -}: { - envVariables: { [key: string]: string }; -}) { - const { user } = useUser({ redirectTo: "/login" }); - const router = useRouter(); +export default function Home({envVariables}: {envVariables: {[key: string]: string}}) { + const {user} = useUser({redirectTo: "/login"}); + const router = useRouter(); - return ( - <> - - EnCoach - - - - - {user && ( - - )} - - ); + return ( + <> + + EnCoach + + + + + {user && } + + ); }