@instincthub/react-ui 0.1.27 → 0.1.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/lib/paystack.js +1 -1
- package/dist/src/components/lib/paystack.js.map +1 -1
- package/dist/src/types/components/lib/helpFunction.d.ts +1 -1
- package/dist/src/types/components/tests/calculate_coupon.d.ts +11 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{asyncToGenerator as e,regenerator as n,objectSpread2 as a}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{
|
|
1
|
+
import{asyncToGenerator as e,regenerator as n,objectSpread2 as a}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{calculateCouponDeduction as t,setCookie as o,reqOptions as c,API_HOST_URL as r}from"./helpFunction.js";import{openConfirmModal as i,openToast as s,getUserEmailInputModal as u}from"./modals/modals.js";var l=function(e){return{authorization_code:e.authorization_code,reference:(new Date).getTime().toString(),email:e.email,first_name:e.first_name,last_name:e.last_name,amount:Math.round(100*e.amount),currency:e.currency||"NGN",publicKey:process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY,key:process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY,callback_url:window.location.href,metadata:e.metadata}},d=function(){var a=e(n().m(function e(a){var t,o,c,r,i;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:return t={method:"POST",body:JSON.stringify(a),headers:{Authorization:"Bearer ".concat(process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY),"Content-Type":"application/json"}},e.p=1,e.n=2,fetch("https://api.paystack.co/transaction/charge_authorization",t);case 2:return c=e.v,e.n=3,c.json();case 3:return r=e.v,"success"===(null===(o=r.data)||void 0===o?void 0:o.status)?s("Payment was successful with reference: ".concat(r.data.reference)):s("Payment failed with reference: ".concat(r.data.reference),400),e.a(2,r.data);case 4:return e.p=4,i=e.v,s("Payment processing error occurred",400),console.error("Payment authorization error:",i),e.a(2,{status:"failed",error:i})}},e,null,[[1,4]])}));return function(e){return a.apply(this,arguments)}}(),m=function(t){return new Promise(function(){var o=e(n().m(function e(o){var c;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if(e.p=0,window.PaystackPop){e.n=1;break}throw new Error("Paystack script not loaded");case 1:return e.n=2,window.PaystackPop.setup(a(a({},t),{},{callback:function(e){s("Payment complete! Reference: "+e.reference),o(a(a({},e),{},{email:t.email,amount:t.amount}))},onClose:function(){s("Transaction was not completed, window closed.",400),o({status:"canceled",cancelled:!0,reference:t.reference,email:t.email,amount:t.amount})}}));case 2:e.v.openIframe(),e.n=4;break;case 3:e.p=3,c=e.v,console.error("Paystack initialization error:",c),s("Payment could not be initiated",400),o({status:"failed",cancelled:!0,reference:t.reference,error:c,email:t.email,amount:t.amount});case 4:return e.a(2)}},e,null,[[0,3]])}));return function(e){return o.apply(this,arguments)}}())};function f(e){return p.apply(this,arguments)}function p(){return p=e(n().m(function f(p){var y,_,b;return n().w(function(f){for(;;)switch(f.n){case 0:if(p.e&&p.e.preventDefault(),!p.openConfirm||!p.defaultConfirm){f.n=2;break}return y="By clicking okay, you are enrolling for ".concat(p.label," with id ").concat(p.objects.object_id,"."),f.n=1,i(p.defaultMsg||y);case 1:if(f.v){f.n=2;break}return f.a(2);case 2:_=function(){var o=e(n().m(function e(){var o,u,f,y,_,b,h,v,g,k,w,j,O,P,C,N,S,B,A,T,D,E;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if(p.setStatus(0),o={id:0,code:"",email_list:"",object_id:"",valid_from:"",valid_to:"",days_count:0,discount_type:null,discount:0,amount:0,currency:"",active:!1,timestamp:"",channel:"",content_type:0,students:[]},!p.coupon){e.n=5;break}return y=null===(f=p.configObj.metadata)||void 0===f?void 0:f.channel_username,_=JSON.stringify({code:p.coupon,email:p.configObj.email,content_type:p.configObj.content_type,object_id:p.configObj.object_id}),b=c("POST",_,null,"json"),h="".concat(r,"coupons/").concat(y,"/validate-coupon/"),e.p=1,e.n=2,fetch(h,b);case 2:return v=e.v,e.n=3,v.json();case 3:(o=e.v).detail?s(o.detail,400):o.id&&s("".concat(o.discount||"".concat(o.currency).concat(o.amount),"% token was applied.")),e.n=5;break;case 4:e.p=4,E=e.v,console.error("Coupon validation error:",E),s("Could not validate coupon",400);case 5:if(!o.discount&&!o.amount){e.n=7;break}if(100!==o.discount||"percentage"!==o.discount_type){e.n=6;break}return g={email:p.configObj.email,amount:0,status:"success",reference:"COUPON__".concat(p.coupon,"__").concat(p.configObj.email),message:"Payment complete with 100% token coupon",transaction:"",canceled:!1},p.handleDBAction(g),p.setStatus(1),e.a(2);case 6:(k=t(p.configObj.amount,p.configObj.currency||"NGN",o)).discounted?(s(k.detail),u=a(a({},p.configObj),k)):(s(k.detail,400),u=p.configObj),e.n=8;break;case 7:u=p.configObj;case 8:if(p.gatwayCharges&&(w=p.gatwayCharges/100,j=u.amount/(1-w),O=parseFloat(j.toFixed(2)),P=O-u.amount,C=P>2e3?u.amount+2e3:O,u.amount=C),N=l(u),!u.amount){e.n=17;break}if(!u.authorization_code||!p.paymentMethod){e.n=14;break}return S="Would you prefer we charge your existing ".concat(p.paymentMethod.authorization.card_type," card that ends with ").concat(p.paymentMethod.last4,"?"),e.n=9,i(S,!0);case 9:if(!e.v){e.n=11;break}return e.n=10,d(N);case 10:B=e.v,p.handleDBAction(B),e.n=13;break;case 11:return e.n=12,m(N);case 12:A=e.v,p.handleDBAction(A);case 13:e.n=16;break;case 14:return console.log("Pay with paystack: "),e.n=15,m(N);case 15:T=e.v,p.handleDBAction(T);case 16:e.n=18;break;case 17:D={email:p.configObj.email,amount:0,status:"success",reference:"COUPON__".concat(p.coupon,"__").concat(p.configObj.email),message:"No payment required for free item",transaction:"",canceled:!1},p.handleDBAction(D);case 18:p.setStatus(1);case 19:return e.a(2)}},e,null,[[1,4]])}));return function(){return o.apply(this,arguments)}}(),b=function(){var a=e(n().m(function e(){var a;return n().w(function(e){for(;;)switch(e.n){case 0:if(p.configObj.email){e.n=4;break}return e.n=1,u(p.label);case 1:if(!(a=e.v)){e.n=2;break}p.configObj.email=a,o("email",a,2),_(),e.n=3;break;case 2:return s("You need to enter a valid email!",400),e.n=3,b();case 3:e.n=5;break;case 4:o("email",p.configObj.email,2),_();case 5:return e.a(2)}},e)}));return function(){return a.apply(this,arguments)}}(),b();case 3:return f.a(2)}},f)})),p.apply(this,arguments)}function y(e){return _.apply(this,arguments)}function _(){return(_=e(n().m(function e(d){var f,p,y,_,b,h,v,g,k,w,j,O,P,C,N,S,B,A,T,D,E,U;return n().w(function(e){for(;;)switch(e.p=e.n){case 0:if(d.e&&d.e.preventDefault(),!d.defaultConfirm){e.n=2;break}return f=d.defaultMsg||"By clicking okay, you are proceeding with payment for ".concat(d.label,"."),e.n=1,i(f);case 1:if(e.v){e.n=2;break}return e.a(2);case 2:return d.setStatus(0),e.n=3,u(d.label);case 3:if(p=e.v){e.n=4;break}return s("You need to enter a valid email to proceed!",400),d.setStatus(1),e.a(2);case 4:if(o("email",p,2),y={email:p,first_name:"Guest",last_name:"User",amount:d.amount,currency:d.currency||"NGN",metadata:d.metadata,content_type:d.content_type,object_id:d.object_id},!d.coupon){e.n=11;break}return b=null===(_=d.metadata)||void 0===_?void 0:_.channel_username,h=JSON.stringify({code:d.coupon,email:p,content_type:d.content_type,object_id:d.object_id}),v=c("POST",h,null,"json"),g="".concat(r,"coupons/").concat(b,"/validate-coupon/"),e.p=5,e.n=6,fetch(g,v);case 6:return k=e.v,e.n=7,k.json();case 7:if(w=e.v,j=w.discount||0,w.detail?s(w.detail,400):w.id&&s("".concat(j,"% discount was applied.")),!(O=t(y.amount,y.currency||"NGN",w)).discounted){e.n=9;break}if(100!==j){e.n=8;break}return P={email:y.email,amount:0,status:"success",reference:"COUPON__".concat(d.coupon,"__").concat(y.email),message:"No payment required for free item",transaction:"",canceled:!1},d.handleDBAction(P),d.setStatus(1),e.a(2);case 8:s(O.detail),y=a(a({},y),O);case 9:e.n=11;break;case 10:e.p=10,U=e.v,console.error("Coupon validation error:",U),s("Could not validate coupon",400);case 11:if(d.gatwayCharges&&(C=d.gatwayCharges/100,N=y.amount/(1-C),S=parseFloat(N.toFixed(2)),B=S-y.amount,A=B>2e3?y.amount+2e3:S,y.amount=A),T=l(y),!(y.amount>0)){e.n=13;break}return e.n=12,m(T);case 12:D=e.v,d.handleDBAction(D),e.n=14;break;case 13:E={email:y.email,amount:0,status:"success",reference:"COUPON__".concat(d.coupon,"__").concat(y.email),message:"No payment required for free item",transaction:"",canceled:!1},d.handleDBAction(E);case 14:d.setStatus(1);case 15:return e.a(2)}},e,null,[[5,10]])}))).apply(this,arguments)}export{d as chargeAuthorization,f as handlePaymentSubmit,y as handlePaymentWithoutUserData,m as payWithPaystack,l as paystackDataConfig};
|
|
2
2
|
//# sourceMappingURL=paystack.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paystack.js","sources":["../../../../src/components/lib/paystack.ts"],"sourcesContent":["import {\r\n API_HOST_URL,\r\n calculateAmountAfterDeduction,\r\n calculateCouponDeduction,\r\n reqOptions,\r\n setCookie,\r\n} from \"./helpFunction\";\r\nimport {\r\n getUserEmailInputModal,\r\n openConfirmModal,\r\n openToast,\r\n} from \"./modals/modals\";\r\nimport {\r\n PaystackConfigObjectType,\r\n PaystackConfigType,\r\n PaystackResponseType,\r\n PaymentContextType,\r\n CouponType,\r\n} from \"@/types\";\r\n\r\n/**\r\n * Context for processing payments\r\n * @property {Event | null} [e] - The event object that triggered the payment\r\n * @property {Object} objects - Details about the item being purchased\r\n * @property {string} objects.title - Title of the item\r\n * @property {string | number | null} [objects.object_type] - Model ID of the object being purchased\r\n * @property {string | number | null} [objects.object_id] - Object ID of the object being purchased\r\n * @property {PaystackConfigObjectType} configObj - Configuration for PayStack\r\n * @property {PaymentMethodType} [paymentMethod] - Saved payment method if available\r\n * @property {Function} setStatus - Function to update UI status during payment process\r\n * @property {Function} handleDBAction - Callback for processing successful payments\r\n * @property {boolean} [defaultConfirm] - Whether to show a confirmation dialog\r\n * @property {string} label - Label for the payment (usually item title)\r\n * @property {string} [coupon] - Coupon code if applicable\r\n * @property {string} [defaultMsg] - Custom confirmation message\r\n * @property {number} [gatwayCharges] - Payment gateway charges percentage\r\n */\r\n\r\n/**\r\n * Configures the Paystack payment data for processing\r\n * @param obj - Object containing payment details\r\n * @returns PaystackConfig - Configured payment data\r\n */\r\nexport const paystackDataConfig = (\r\n obj: PaystackConfigObjectType\r\n): PaystackConfigType => ({\r\n authorization_code: obj.authorization_code,\r\n reference: new Date().getTime().toString(),\r\n email: obj.email,\r\n first_name: obj.first_name,\r\n last_name: obj.last_name,\r\n amount: obj.amount * 100, // Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200\r\n currency: obj.currency || \"NGN\",\r\n publicKey: process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY,\r\n key: process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY,\r\n callback_url: window.location.href,\r\n metadata: obj.metadata,\r\n});\r\n\r\n/**\r\n * Charges a customer using an existing authorization\r\n * @param data - Payment configuration data\r\n * @returns Promise with transaction data\r\n */\r\nexport const chargeAuthorization = async (\r\n data: PaystackConfigType\r\n): Promise<any> => {\r\n // This function tries to charge user with existing card\r\n const url = \"https://api.paystack.co/transaction/charge_authorization\";\r\n const options = {\r\n method: \"POST\",\r\n body: JSON.stringify(data),\r\n headers: {\r\n Authorization: `Bearer ${process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY}`,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n };\r\n\r\n try {\r\n const req = await fetch(url, options);\r\n const res = await req.json();\r\n\r\n if (res.data?.status === \"success\") {\r\n openToast(`Payment was successful with reference: ${res.data.reference}`);\r\n } else {\r\n openToast(`Payment failed with reference: ${res.data.reference}`, 400);\r\n }\r\n\r\n return res.data;\r\n } catch (error) {\r\n openToast(\"Payment processing error occurred\", 400);\r\n console.error(\"Payment authorization error:\", error);\r\n return { status: \"failed\", error };\r\n }\r\n};\r\n\r\n/**\r\n * Initiates payment with Paystack popup\r\n * @param config - Payment configuration\r\n * @returns Promise with payment response\r\n */\r\nexport const payWithPaystack = (\r\n config: PaystackConfigType\r\n): Promise<PaystackResponseType> => {\r\n return new Promise(async (resolve) => {\r\n try {\r\n // Ensure PaystackPop is available\r\n if (!window.PaystackPop) {\r\n throw new Error(\"Paystack script not loaded\");\r\n }\r\n\r\n let handler = await window.PaystackPop.setup({\r\n ...config,\r\n callback: (response: PaystackResponseType) => {\r\n // This happens after the payment is completed successfully\r\n openToast(\"Payment complete! Reference: \" + response.reference);\r\n resolve({ ...response, email: config.email, amount: config.amount });\r\n },\r\n onClose: () => {\r\n openToast(\"Transaction was not completed, window closed.\", 400);\r\n resolve({\r\n status: \"canceled\",\r\n cancelled: true,\r\n reference: config.reference,\r\n email: config.email,\r\n amount: config.amount,\r\n } as PaystackResponseType);\r\n },\r\n });\r\n handler.openIframe();\r\n } catch (error) {\r\n console.error(\"Paystack initialization error:\", error);\r\n openToast(\"Payment could not be initiated\", 400);\r\n resolve({\r\n status: \"failed\",\r\n cancelled: true,\r\n reference: config.reference,\r\n error,\r\n email: config.email,\r\n amount: config.amount,\r\n } as PaystackResponseType);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Handles the complete payment submission process\r\n * @example\r\n * ```ts\r\n * handlePaymentSubmit({\r\n * openConfirm: true,\r\n * defaultConfirm: true,\r\n * defaultMsg: \"Are you sure you want to enroll for this course?\",\r\n * label: \"Course Name\",\r\n * objects: {\r\n * object_id: \"123\",\r\n * object_type: \"course\",\r\n * },\r\n * configObj: {\r\n * email: \"user@example.com\",\r\n * amount: 1000,\r\n * currency: \"NGN\",\r\n * authorization_code: \"1234567890\",\r\n * first_name: \"John\",\r\n * last_name: \"Doe\",\r\n * email: \"user@example.com\",\r\n * },\r\n * coupon: \"1234567890\",\r\n * gatwayCharges: 10,\r\n * paymentMethod: {\r\n * authorization: {\r\n * card_type: \"MasterCard\",\r\n * last4: \"1234\",\r\n * },\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * e: Event,\r\n * });\r\n * ```\r\n * @param contexts - Payment context information\r\n * @context This function orchestrates the entire payment flow from confirmation to processing\r\n */\r\nexport async function handlePaymentSubmit(\r\n contexts: PaymentContextType\r\n): Promise<void> {\r\n if (contexts.e) contexts.e.preventDefault();\r\n\r\n if (contexts.openConfirm && contexts.defaultConfirm) {\r\n let msg = `By clicking okay, you are enrolling for ${contexts.label} with id ${contexts.objects.object_id}.`;\r\n const confirm = await openConfirmModal(contexts.defaultMsg || msg);\r\n if (!confirm) return;\r\n }\r\n\r\n const makePayment = async (): Promise<void> => {\r\n contexts.setStatus(0);\r\n\r\n // Check if contexts.coupon is valid\r\n let coupon_res: CouponType = {\r\n id: 0,\r\n code: \"\",\r\n email_list: \"\",\r\n object_id: \"\",\r\n valid_from: \"\",\r\n valid_to: \"\",\r\n days_count: 0,\r\n discount_type: null,\r\n discount: 0,\r\n amount: 0,\r\n currency: \"\",\r\n active: false,\r\n timestamp: \"\",\r\n channel: \"\",\r\n content_type: 0,\r\n students: [],\r\n };\r\n\r\n let mewConfigObj: PaystackConfigObjectType;\r\n\r\n if (contexts.coupon) {\r\n const handle = contexts.configObj.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: contexts.coupon,\r\n email: contexts.configObj.email,\r\n content_type: contexts.configObj.content_type,\r\n object_id: contexts.configObj.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n coupon_res = (await dataset.json()) as CouponType;\r\n\r\n if (coupon_res.detail) {\r\n openToast(coupon_res.detail, 400);\r\n } else if (coupon_res.id) {\r\n openToast(\r\n `${\r\n coupon_res.discount ||\r\n `${coupon_res.currency}${coupon_res.amount}`\r\n }% token was applied.`\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Remove the discount from actual amount\r\n if (coupon_res.discount || coupon_res.amount) {\r\n if (coupon_res.discount === 100) {\r\n contexts.handleDBAction({ reference: `COUPON__${contexts.coupon}` });\r\n contexts.setStatus(1);\r\n return;\r\n }\r\n\r\n const amount = calculateCouponDeduction(\r\n contexts.configObj.amount,\r\n contexts.configObj.currency || \"NGN\",\r\n coupon_res\r\n );\r\n\r\n if (!amount.discounted) {\r\n openToast(amount.detail, 400);\r\n\r\n // Abort payment due to invalid coupon\r\n mewConfigObj = contexts.configObj;\r\n } else {\r\n openToast(amount.detail);\r\n mewConfigObj = {\r\n ...contexts.configObj,\r\n ...amount,\r\n };\r\n }\r\n } else {\r\n // No coupon applied\r\n mewConfigObj = contexts.configObj;\r\n }\r\n\r\n // Add paystack charges\r\n if (contexts.gatwayCharges) {\r\n const fee = contexts.gatwayCharges / 100;\r\n // Calculate the amount to charge so that after the fee deduction, it matches the intended amount\r\n const totalAmount = mewConfigObj.amount / (1 - fee);\r\n // Returns the amount rounded to 2 decimal places\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n\r\n // Local transactions fees are capped at ₦2000, meaning that's the absolute maximum you'll ever pay in fees per transaction\r\n const localCharges = decimalAmount - mewConfigObj.amount;\r\n\r\n // Only charge 2k if charges exceed threshold\r\n const noMoreThan2k =\r\n localCharges > 2000 ? mewConfigObj.amount + 2000 : decimalAmount;\r\n\r\n mewConfigObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(mewConfigObj);\r\n\r\n if (mewConfigObj.amount) {\r\n if (mewConfigObj.authorization_code && contexts.paymentMethod) {\r\n // Ask if user wants to use existing payment method\r\n const msg = `Would you prefer we charge your existing ${contexts.paymentMethod.authorization.card_type} card that ends with ${contexts.paymentMethod.last4}?`;\r\n const confirm = await openConfirmModal(msg, true);\r\n\r\n if (confirm) {\r\n // Charge user with existing card\r\n const res = await chargeAuthorization(dataset);\r\n contexts.handleDBAction(res);\r\n } else {\r\n // Request for user card details\r\n const payActivate = await payWithPaystack(dataset);\r\n\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // Request for user card details if payment method doesn't exist\r\n console.log(\"Pay with paystack: \");\r\n const payActivate = await payWithPaystack(dataset);\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // If cohort is free, don't request for payment\r\n contexts.handleDBAction();\r\n }\r\n\r\n contexts.setStatus(1);\r\n };\r\n\r\n // Get user email input if doesn't exist\r\n const checkEmailInConfig = async (): Promise<void> => {\r\n if (!contexts.configObj.email) {\r\n const emailValue = await getUserEmailInputModal(contexts.label);\r\n if (emailValue) {\r\n contexts.configObj.email = emailValue;\r\n setCookie(\"email\", emailValue, 2); // store for signup use\r\n makePayment();\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n await checkEmailInConfig();\r\n }\r\n } else {\r\n setCookie(\"email\", contexts.configObj.email, 2); // store for signup use\r\n makePayment();\r\n }\r\n };\r\n\r\n checkEmailInConfig();\r\n}\r\n\r\n/**\r\n * Handles payment submission without requiring user data upfront\r\n * Useful for guest checkout or anonymous payments\r\n * @example\r\n * ```ts\r\n * handlePaymentWithoutUserData({\r\n * amount: 5000,\r\n * label: \"Course Enrollment\",\r\n * currency: \"NGN\",\r\n * metadata: {\r\n * content_type: \"course\",\r\n * object_id: \"123\",\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * });\r\n * ```\r\n * @param config - Minimal payment configuration without user details\r\n */\r\nexport async function handlePaymentWithoutUserData(config: {\r\n amount: number;\r\n label: string;\r\n currency?: string;\r\n metadata?: PaystackConfigObjectType[\"metadata\"];\r\n handleDBAction: (data?: any) => void;\r\n setStatus: (status: number) => void;\r\n coupon?: string;\r\n gatwayCharges?: number;\r\n defaultConfirm?: boolean;\r\n defaultMsg?: string;\r\n e?: Event | null;\r\n content_type?: string | number;\r\n object_id?: string | number;\r\n}): Promise<void> {\r\n if (config.e) config.e.preventDefault();\r\n\r\n if (config.defaultConfirm) {\r\n const msg =\r\n config.defaultMsg ||\r\n `By clicking okay, you are proceeding with payment for ${config.label}.`;\r\n const confirm = await openConfirmModal(msg);\r\n if (!confirm) return;\r\n }\r\n\r\n config.setStatus(0);\r\n\r\n // Always prompt for email input\r\n const emailValue = await getUserEmailInputModal(config.label);\r\n\r\n if (!emailValue) {\r\n openToast(\"You need to enter a valid email to proceed!\", 400);\r\n config.setStatus(1);\r\n return;\r\n }\r\n\r\n // Store email for potential signup\r\n setCookie(\"email\", emailValue, 2);\r\n\r\n // Build minimal config object\r\n let configObj: PaystackConfigObjectType = {\r\n email: emailValue,\r\n first_name: \"Guest\",\r\n last_name: \"User\",\r\n amount: config.amount,\r\n currency: config.currency || \"NGN\",\r\n metadata: config.metadata,\r\n content_type: config.content_type,\r\n object_id: config.object_id,\r\n };\r\n\r\n // Handle coupon validation if provided\r\n if (config.coupon) {\r\n const handle = config.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: config.coupon,\r\n email: emailValue,\r\n content_type: config.content_type,\r\n object_id: config.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n const res = await dataset.json();\r\n\r\n const discount = res.discount || 0;\r\n if (res.detail) {\r\n openToast(res.detail, 400);\r\n } else if (res.id) {\r\n openToast(`${discount}% discount was applied.`);\r\n }\r\n\r\n // Apply discount\r\n if (discount) {\r\n if (discount === 100) {\r\n config.handleDBAction({ reference: `COUPON__${config.coupon}` });\r\n config.setStatus(1);\r\n return;\r\n }\r\n\r\n const amount = calculateAmountAfterDeduction(\r\n configObj.amount,\r\n discount\r\n );\r\n openToast(amount.detail);\r\n configObj = {\r\n ...configObj,\r\n ...amount,\r\n };\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Add gateway charges if applicable\r\n if (config.gatwayCharges) {\r\n const fee = config.gatwayCharges / 100;\r\n const totalAmount = configObj.amount / (1 - fee);\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n const localCharges = decimalAmount - configObj.amount;\r\n const noMoreThan2k =\r\n localCharges > 2000 ? configObj.amount + 2000 : decimalAmount;\r\n configObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(configObj);\r\n\r\n if (configObj.amount > 0) {\r\n // Process payment with Paystack\r\n const payActivate = await payWithPaystack(dataset);\r\n config.handleDBAction(payActivate);\r\n } else {\r\n // Free item\r\n config.handleDBAction();\r\n }\r\n\r\n config.setStatus(1);\r\n}\r\n\r\n// Add PaystackPop to Window interface\r\ndeclare global {\r\n interface Window {\r\n PaystackPop: {\r\n setup: (config: any) => { openIframe: () => void };\r\n };\r\n }\r\n}\r\n"],"names":["paystackDataConfig","obj","authorization_code","reference","Date","getTime","toString","email","first_name","last_name","amount","currency","publicKey","process","env","NEXT_PUBLIC_PAYSTACK_SECRET_KEY","key","NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY","callback_url","window","location","href","metadata","chargeAuthorization","_ref","_asyncToGenerator","_regenerator","m","_callee","data","options","_res$data","req","res","_t","w","_context","p","n","method","body","JSON","stringify","headers","Authorization","concat","fetch","v","json","status","openToast","a","console","error","_x","apply","this","arguments","payWithPaystack","config","Promise","_ref2","_callee2","resolve","_t2","_context2","PaystackPop","Error","setup","_objectSpread","callback","response","onClose","cancelled","openIframe","_x2","handlePaymentSubmit","_x3","_handlePaymentSubmit","_callee5","contexts","msg","makePayment","_checkEmailInConfig","_context5","e","preventDefault","openConfirm","defaultConfirm","label","objects","object_id","openConfirmModal","defaultMsg","_ref3","_callee3","coupon_res","mewConfigObj","_contexts$configObj$m","handle","couponObj","requestOptions","url","_dataset","fee","totalAmount","decimalAmount","localCharges","noMoreThan2k","dataset","_msg","payActivate","_payActivate","_t3","_context3","setStatus","id","code","email_list","valid_from","valid_to","days_count","discount_type","discount","active","timestamp","channel","content_type","students","coupon","configObj","channel_username","reqOptions","API_HOST_URL","detail","handleDBAction","calculateCouponDeduction","discounted","gatwayCharges","parseFloat","toFixed","paymentMethod","authorization","card_type","last4","log","checkEmailInConfig","_ref4","_callee4","emailValue","_context4","getUserEmailInputModal","setCookie","handlePaymentWithoutUserData","_x4","_handlePaymentWithoutUserData","_callee6","_config$metadata","_dataset2","_t4","_context6","calculateAmountAfterDeduction"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paystack.js","sources":["../../../../src/components/lib/paystack.ts"],"sourcesContent":["import {\r\n API_HOST_URL,\r\n calculateCouponDeduction,\r\n reqOptions,\r\n setCookie,\r\n} from \"./helpFunction\";\r\nimport {\r\n getUserEmailInputModal,\r\n openConfirmModal,\r\n openToast,\r\n} from \"./modals/modals\";\r\nimport {\r\n PaystackConfigObjectType,\r\n PaystackConfigType,\r\n PaystackResponseType,\r\n PaymentContextType,\r\n CouponType,\r\n} from \"@/types\";\r\n\r\n/**\r\n * Context for processing payments\r\n * @property {Event | null} [e] - The event object that triggered the payment\r\n * @property {Object} objects - Details about the item being purchased\r\n * @property {string} objects.title - Title of the item\r\n * @property {string | number | null} [objects.object_type] - Model ID of the object being purchased\r\n * @property {string | number | null} [objects.object_id] - Object ID of the object being purchased\r\n * @property {PaystackConfigObjectType} configObj - Configuration for PayStack\r\n * @property {PaymentMethodType} [paymentMethod] - Saved payment method if available\r\n * @property {Function} setStatus - Function to update UI status during payment process\r\n * @property {Function} handleDBAction - Callback for processing successful payments\r\n * @property {boolean} [defaultConfirm] - Whether to show a confirmation dialog\r\n * @property {string} label - Label for the payment (usually item title)\r\n * @property {string} [coupon] - Coupon code if applicable\r\n * @property {string} [defaultMsg] - Custom confirmation message\r\n * @property {number} [gatwayCharges] - Payment gateway charges percentage\r\n */\r\n\r\n/**\r\n * Configures the Paystack payment data for processing\r\n * @param obj - Object containing payment details\r\n * @returns PaystackConfig - Configured payment data\r\n */\r\nexport const paystackDataConfig = (\r\n obj: PaystackConfigObjectType\r\n): PaystackConfigType => ({\r\n authorization_code: obj.authorization_code,\r\n reference: new Date().getTime().toString(),\r\n email: obj.email,\r\n first_name: obj.first_name,\r\n last_name: obj.last_name,\r\n amount: Math.round(obj.amount * 100), // Amount is in the country's lowest currency. E.g Kobo, so 20000 kobo = N200\r\n currency: obj.currency || \"NGN\",\r\n publicKey: process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY,\r\n key: process.env.NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY,\r\n callback_url: window.location.href,\r\n metadata: obj.metadata,\r\n});\r\n\r\n/**\r\n * Charges a customer using an existing authorization\r\n * @param data - Payment configuration data\r\n * @returns Promise with transaction data\r\n */\r\nexport const chargeAuthorization = async (\r\n data: PaystackConfigType\r\n): Promise<any> => {\r\n // This function tries to charge user with existing card\r\n const url = \"https://api.paystack.co/transaction/charge_authorization\";\r\n const options = {\r\n method: \"POST\",\r\n body: JSON.stringify(data),\r\n headers: {\r\n Authorization: `Bearer ${process.env.NEXT_PUBLIC_PAYSTACK_SECRET_KEY}`,\r\n \"Content-Type\": \"application/json\",\r\n },\r\n };\r\n\r\n try {\r\n const req = await fetch(url, options);\r\n const res = await req.json();\r\n\r\n if (res.data?.status === \"success\") {\r\n openToast(`Payment was successful with reference: ${res.data.reference}`);\r\n } else {\r\n openToast(`Payment failed with reference: ${res.data.reference}`, 400);\r\n }\r\n\r\n return res.data;\r\n } catch (error) {\r\n openToast(\"Payment processing error occurred\", 400);\r\n console.error(\"Payment authorization error:\", error);\r\n return { status: \"failed\", error };\r\n }\r\n};\r\n\r\n/**\r\n * Initiates payment with Paystack popup\r\n * @param config - Payment configuration\r\n * @returns Promise with payment response\r\n */\r\nexport const payWithPaystack = (\r\n config: PaystackConfigType\r\n): Promise<PaystackResponseType> => {\r\n return new Promise(async (resolve) => {\r\n try {\r\n // Ensure PaystackPop is available\r\n if (!window.PaystackPop) {\r\n throw new Error(\"Paystack script not loaded\");\r\n }\r\n\r\n let handler = await window.PaystackPop.setup({\r\n ...config,\r\n callback: (response: PaystackResponseType) => {\r\n // This happens after the payment is completed successfully\r\n openToast(\"Payment complete! Reference: \" + response.reference);\r\n resolve({ ...response, email: config.email, amount: config.amount });\r\n },\r\n onClose: () => {\r\n openToast(\"Transaction was not completed, window closed.\", 400);\r\n resolve({\r\n status: \"canceled\",\r\n cancelled: true,\r\n reference: config.reference,\r\n email: config.email,\r\n amount: config.amount,\r\n } as PaystackResponseType);\r\n },\r\n });\r\n handler.openIframe();\r\n } catch (error) {\r\n console.error(\"Paystack initialization error:\", error);\r\n openToast(\"Payment could not be initiated\", 400);\r\n resolve({\r\n status: \"failed\",\r\n cancelled: true,\r\n reference: config.reference,\r\n error,\r\n email: config.email,\r\n amount: config.amount,\r\n } as PaystackResponseType);\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Handles the complete payment submission process\r\n * @example\r\n * ```ts\r\n * handlePaymentSubmit({\r\n * openConfirm: true,\r\n * defaultConfirm: true,\r\n * defaultMsg: \"Are you sure you want to enroll for this course?\",\r\n * label: \"Course Name\",\r\n * objects: {\r\n * object_id: \"123\",\r\n * object_type: \"course\",\r\n * },\r\n * configObj: {\r\n * email: \"user@example.com\",\r\n * amount: 1000,\r\n * currency: \"NGN\",\r\n * authorization_code: \"1234567890\",\r\n * first_name: \"John\",\r\n * last_name: \"Doe\",\r\n * email: \"user@example.com\",\r\n * },\r\n * coupon: \"1234567890\",\r\n * gatwayCharges: 10,\r\n * paymentMethod: {\r\n * authorization: {\r\n * card_type: \"MasterCard\",\r\n * last4: \"1234\",\r\n * },\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * e: Event,\r\n * });\r\n * ```\r\n * @param contexts - Payment context information\r\n * @context This function orchestrates the entire payment flow from confirmation to processing\r\n */\r\nexport async function handlePaymentSubmit(\r\n contexts: PaymentContextType\r\n): Promise<void> {\r\n if (contexts.e) contexts.e.preventDefault();\r\n\r\n if (contexts.openConfirm && contexts.defaultConfirm) {\r\n let msg = `By clicking okay, you are enrolling for ${contexts.label} with id ${contexts.objects.object_id}.`;\r\n const confirm = await openConfirmModal(contexts.defaultMsg || msg);\r\n if (!confirm) return;\r\n }\r\n\r\n const makePayment = async (): Promise<void> => {\r\n contexts.setStatus(0);\r\n\r\n // Check if contexts.coupon is valid\r\n let coupon_res: CouponType = {\r\n id: 0,\r\n code: \"\",\r\n email_list: \"\",\r\n object_id: \"\",\r\n valid_from: \"\",\r\n valid_to: \"\",\r\n days_count: 0,\r\n discount_type: null,\r\n discount: 0,\r\n amount: 0,\r\n currency: \"\",\r\n active: false,\r\n timestamp: \"\",\r\n channel: \"\",\r\n content_type: 0,\r\n students: [],\r\n };\r\n\r\n let mewConfigObj: PaystackConfigObjectType;\r\n\r\n if (contexts.coupon) {\r\n const handle = contexts.configObj.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: contexts.coupon,\r\n email: contexts.configObj.email,\r\n content_type: contexts.configObj.content_type,\r\n object_id: contexts.configObj.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n coupon_res = (await dataset.json()) as CouponType;\r\n\r\n if (coupon_res.detail) {\r\n openToast(coupon_res.detail, 400);\r\n } else if (coupon_res.id) {\r\n openToast(\r\n `${\r\n coupon_res.discount ||\r\n `${coupon_res.currency}${coupon_res.amount}`\r\n }% token was applied.`\r\n );\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Remove the discount from actual amount\r\n if (coupon_res.discount || coupon_res.amount) {\r\n if (\r\n coupon_res.discount === 100 &&\r\n coupon_res.discount_type === \"percentage\"\r\n ) {\r\n const resContext = {\r\n email: contexts.configObj.email,\r\n amount: 0,\r\n status: \"success\",\r\n reference: `COUPON__${contexts.coupon}__${contexts.configObj.email}`,\r\n message: \"Payment complete with 100% token coupon\",\r\n transaction: \"\",\r\n canceled: false,\r\n };\r\n contexts.handleDBAction(resContext);\r\n contexts.setStatus(1);\r\n return;\r\n }\r\n\r\n const amount = calculateCouponDeduction(\r\n contexts.configObj.amount,\r\n contexts.configObj.currency || \"NGN\",\r\n coupon_res\r\n );\r\n\r\n if (!amount.discounted) {\r\n openToast(amount.detail, 400);\r\n\r\n // Abort payment due to invalid coupon\r\n mewConfigObj = contexts.configObj;\r\n } else {\r\n openToast(amount.detail);\r\n mewConfigObj = {\r\n ...contexts.configObj,\r\n ...amount,\r\n };\r\n }\r\n } else {\r\n // No coupon applied\r\n mewConfigObj = contexts.configObj;\r\n }\r\n\r\n // Add paystack charges\r\n if (contexts.gatwayCharges) {\r\n const fee = contexts.gatwayCharges / 100;\r\n // Calculate the amount to charge so that after the fee deduction, it matches the intended amount\r\n const totalAmount = mewConfigObj.amount / (1 - fee);\r\n // Returns the amount rounded to 2 decimal places\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n\r\n // Local transactions fees are capped at ₦2000, meaning that's the absolute maximum you'll ever pay in fees per transaction\r\n const localCharges = decimalAmount - mewConfigObj.amount;\r\n\r\n // Only charge 2k if charges exceed threshold\r\n const noMoreThan2k =\r\n localCharges > 2000 ? mewConfigObj.amount + 2000 : decimalAmount;\r\n\r\n mewConfigObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(mewConfigObj);\r\n\r\n if (mewConfigObj.amount) {\r\n if (mewConfigObj.authorization_code && contexts.paymentMethod) {\r\n // Ask if user wants to use existing payment method\r\n const msg = `Would you prefer we charge your existing ${contexts.paymentMethod.authorization.card_type} card that ends with ${contexts.paymentMethod.last4}?`;\r\n const confirm = await openConfirmModal(msg, true);\r\n\r\n if (confirm) {\r\n // Charge user with existing card\r\n const res = await chargeAuthorization(dataset);\r\n contexts.handleDBAction(res);\r\n } else {\r\n // Request for user card details\r\n const payActivate = await payWithPaystack(dataset);\r\n\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // Request for user card details if payment method doesn't exist\r\n console.log(\"Pay with paystack: \");\r\n const payActivate = await payWithPaystack(dataset);\r\n contexts.handleDBAction(payActivate);\r\n }\r\n } else {\r\n // If cohort is free, don't request for payment\r\n const resContext = {\r\n email: contexts.configObj.email,\r\n amount: 0,\r\n status: \"success\",\r\n reference: `COUPON__${contexts.coupon}__${contexts.configObj.email}`,\r\n message: \"No payment required for free item\",\r\n transaction: \"\",\r\n canceled: false,\r\n };\r\n contexts.handleDBAction(resContext);\r\n }\r\n\r\n contexts.setStatus(1);\r\n };\r\n\r\n // Get user email input if doesn't exist\r\n const checkEmailInConfig = async (): Promise<void> => {\r\n if (!contexts.configObj.email) {\r\n const emailValue = await getUserEmailInputModal(contexts.label);\r\n if (emailValue) {\r\n contexts.configObj.email = emailValue;\r\n setCookie(\"email\", emailValue, 2); // store for signup use\r\n makePayment();\r\n } else {\r\n openToast(\"You need to enter a valid email!\", 400);\r\n await checkEmailInConfig();\r\n }\r\n } else {\r\n setCookie(\"email\", contexts.configObj.email, 2); // store for signup use\r\n makePayment();\r\n }\r\n };\r\n\r\n checkEmailInConfig();\r\n}\r\n\r\n/**\r\n * Handles payment submission without requiring user data upfront\r\n * Useful for guest checkout or anonymous payments\r\n * @example\r\n * ```ts\r\n * handlePaymentWithoutUserData({\r\n * amount: 5000,\r\n * label: \"Course Enrollment\",\r\n * currency: \"NGN\",\r\n * metadata: {\r\n * content_type: \"course\",\r\n * object_id: \"123\",\r\n * },\r\n * handleDBAction: (data: any) => {\r\n * console.log(data);\r\n * },\r\n * setStatus: (status: number) => {\r\n * console.log(status);\r\n * },\r\n * });\r\n * ```\r\n * @param config - Minimal payment configuration without user details\r\n */\r\nexport async function handlePaymentWithoutUserData(config: {\r\n amount: number;\r\n label: string;\r\n currency?: string;\r\n metadata?: PaystackConfigObjectType[\"metadata\"];\r\n handleDBAction: (data?: any) => void;\r\n setStatus: (status: number) => void;\r\n coupon?: string;\r\n gatwayCharges?: number;\r\n defaultConfirm?: boolean;\r\n defaultMsg?: string;\r\n e?: Event | null;\r\n content_type?: string | number;\r\n object_id?: string | number;\r\n}): Promise<void> {\r\n if (config.e) config.e.preventDefault();\r\n\r\n if (config.defaultConfirm) {\r\n const msg =\r\n config.defaultMsg ||\r\n `By clicking okay, you are proceeding with payment for ${config.label}.`;\r\n const confirm = await openConfirmModal(msg);\r\n if (!confirm) return;\r\n }\r\n\r\n config.setStatus(0);\r\n\r\n // Always prompt for email input\r\n const emailValue = await getUserEmailInputModal(config.label);\r\n\r\n if (!emailValue) {\r\n openToast(\"You need to enter a valid email to proceed!\", 400);\r\n config.setStatus(1);\r\n return;\r\n }\r\n\r\n // Store email for potential signup\r\n setCookie(\"email\", emailValue, 2);\r\n\r\n // Build minimal config object\r\n let configObj: PaystackConfigObjectType = {\r\n email: emailValue,\r\n first_name: \"Guest\",\r\n last_name: \"User\",\r\n amount: config.amount,\r\n currency: config.currency || \"NGN\",\r\n metadata: config.metadata,\r\n content_type: config.content_type,\r\n object_id: config.object_id,\r\n };\r\n\r\n // Handle coupon validation if provided\r\n if (config.coupon) {\r\n const handle = config.metadata?.channel_username;\r\n const couponObj = JSON.stringify({\r\n code: config.coupon,\r\n email: emailValue,\r\n content_type: config.content_type,\r\n object_id: config.object_id,\r\n });\r\n\r\n const requestOptions = reqOptions(\"POST\", couponObj, null, \"json\");\r\n const url = `${API_HOST_URL}coupons/${handle}/validate-coupon/`;\r\n\r\n try {\r\n const dataset = await fetch(url, requestOptions);\r\n const res = await dataset.json();\r\n\r\n const discount = res.discount || 0;\r\n if (res.detail) {\r\n openToast(res.detail, 400);\r\n } else if (res.id) {\r\n openToast(`${discount}% discount was applied.`);\r\n }\r\n\r\n const _discounted = calculateCouponDeduction(\r\n configObj.amount,\r\n configObj.currency || \"NGN\",\r\n res\r\n );\r\n\r\n // Apply discount\r\n if (_discounted.discounted) {\r\n if (discount === 100) {\r\n const resContext = {\r\n email: configObj.email,\r\n amount: 0,\r\n status: \"success\",\r\n reference: `COUPON__${config.coupon}__${configObj.email}`,\r\n message: \"No payment required for free item\",\r\n transaction: \"\",\r\n canceled: false,\r\n };\r\n config.handleDBAction(resContext);\r\n config.setStatus(1);\r\n return;\r\n }\r\n\r\n openToast(_discounted.detail);\r\n configObj = {\r\n ...configObj,\r\n ..._discounted,\r\n };\r\n }\r\n } catch (error) {\r\n console.error(\"Coupon validation error:\", error);\r\n openToast(\"Could not validate coupon\", 400);\r\n }\r\n }\r\n\r\n // Add gateway charges if applicable\r\n if (config.gatwayCharges) {\r\n const fee = config.gatwayCharges / 100;\r\n const totalAmount = configObj.amount / (1 - fee);\r\n const decimalAmount = parseFloat(totalAmount.toFixed(2));\r\n const localCharges = decimalAmount - configObj.amount;\r\n const noMoreThan2k =\r\n localCharges > 2000 ? configObj.amount + 2000 : decimalAmount;\r\n configObj.amount = noMoreThan2k;\r\n }\r\n\r\n const dataset = paystackDataConfig(configObj);\r\n\r\n if (configObj.amount > 0) {\r\n // Process payment with Paystack\r\n const payActivate = await payWithPaystack(dataset);\r\n config.handleDBAction(payActivate);\r\n } else {\r\n // Free item\r\n const resContext = {\r\n email: configObj.email,\r\n amount: 0,\r\n status: \"success\",\r\n reference: `COUPON__${config.coupon}__${configObj.email}`,\r\n message: \"No payment required for free item\",\r\n transaction: \"\",\r\n canceled: false,\r\n };\r\n config.handleDBAction(resContext);\r\n }\r\n\r\n config.setStatus(1);\r\n}\r\n\r\n// Add PaystackPop to Window interface\r\ndeclare global {\r\n interface Window {\r\n PaystackPop: {\r\n setup: (config: any) => { openIframe: () => void };\r\n };\r\n }\r\n}\r\n"],"names":["paystackDataConfig","obj","authorization_code","reference","Date","getTime","toString","email","first_name","last_name","amount","Math","round","currency","publicKey","process","env","NEXT_PUBLIC_PAYSTACK_SECRET_KEY","key","NEXT_PUBLIC_PAYSTACK_PUBLIC_KEY","callback_url","window","location","href","metadata","chargeAuthorization","_ref","_asyncToGenerator","_regenerator","m","_callee","data","options","_res$data","req","res","_t","w","_context","p","n","method","body","JSON","stringify","headers","Authorization","concat","fetch","v","json","status","openToast","a","console","error","_x","apply","this","arguments","payWithPaystack","config","Promise","_ref2","_callee2","resolve","_t2","_context2","PaystackPop","Error","setup","_objectSpread","callback","response","onClose","cancelled","openIframe","_x2","handlePaymentSubmit","_x3","_handlePaymentSubmit","_callee5","contexts","msg","makePayment","_checkEmailInConfig","_context5","e","preventDefault","openConfirm","defaultConfirm","label","objects","object_id","openConfirmModal","defaultMsg","_ref3","_callee3","coupon_res","mewConfigObj","_contexts$configObj$m","handle","couponObj","requestOptions","url","_dataset","resContext","fee","totalAmount","decimalAmount","localCharges","noMoreThan2k","dataset","_msg","payActivate","_payActivate","_resContext","_t3","_context3","setStatus","id","code","email_list","valid_from","valid_to","days_count","discount_type","discount","active","timestamp","channel","content_type","students","coupon","configObj","channel_username","reqOptions","API_HOST_URL","detail","message","transaction","canceled","handleDBAction","calculateCouponDeduction","discounted","gatwayCharges","parseFloat","toFixed","paymentMethod","authorization","card_type","last4","log","checkEmailInConfig","_ref4","_callee4","emailValue","_context4","getUserEmailInputModal","setCookie","handlePaymentWithoutUserData","_x4","_handlePaymentWithoutUserData","_callee6","_config$metadata","_dataset2","_discounted","_resContext2","_t4","_context6"],"mappings":"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"}
|
|
@@ -300,7 +300,7 @@ export declare const fetchAPI: <T>(session: {
|
|
|
300
300
|
status?: number | undefined;
|
|
301
301
|
error?: any;
|
|
302
302
|
}) => void;
|
|
303
|
-
} | ((data: T) => void), api: string, reqOptions: RequestOptions, isFunctionComponent?: boolean, setIsLoading?: ((loading: boolean) => void) | null | undefined, setStatus?: ((status: number | null) => void) | null | undefined, setError?: ((error: any) => void) | null | undefined, flag?: boolean) => Promise<
|
|
303
|
+
} | ((data: T) => void), api: string, reqOptions: RequestOptions, isFunctionComponent?: boolean, setIsLoading?: ((loading: boolean) => void) | null | undefined, setStatus?: ((status: number | null) => void) | null | undefined, setError?: ((error: any) => void) | null | undefined, flag?: boolean) => Promise<Error | T>;
|
|
304
304
|
/**
|
|
305
305
|
* Handles HTTP status errors with navigation.
|
|
306
306
|
* @param status HTTP status code
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculates amount after percentage deduction.
|
|
3
|
+
* @param amount Base amount
|
|
4
|
+
* @param coupon CouponType object
|
|
5
|
+
* @returns Object with final amount or error details
|
|
6
|
+
*/
|
|
7
|
+
export declare const calculateCouponDeduction: (amount: number, currency: string, coupon: any) => {
|
|
8
|
+
amount: number;
|
|
9
|
+
detail?: string | undefined;
|
|
10
|
+
discounted: boolean;
|
|
11
|
+
};
|