react-paysky-lightbox 0.1.0 → 0.1.2
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/README.md +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ Amount is in the **smallest currency unit** (1 EGP = `100`).
|
|
|
80
80
|
|
|
81
81
|
| `environment` | Script |
|
|
82
82
|
| --- | --- |
|
|
83
|
-
| `sandbox` (default) | `https://
|
|
83
|
+
| `sandbox` (default) | `https://red3.paysky.io:3011/LB/js/LightBox.js` |
|
|
84
84
|
| `production` | `https://cube.paysky.io:6006/js/LightBox.js` |
|
|
85
85
|
|
|
86
86
|
Override with `scriptUrl` if PaySky gives you a different host.
|
package/dist/index.cjs
CHANGED
|
@@ -31,7 +31,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
31
31
|
|
|
32
32
|
// src/constants.ts
|
|
33
33
|
var SCRIPT_URLS = {
|
|
34
|
-
sandbox: "https://
|
|
34
|
+
sandbox: "https://red3.paysky.io:3011/LB/js/LightBox.js",
|
|
35
35
|
production: "https://cube.paysky.io:6006/js/LightBox.js"
|
|
36
36
|
};
|
|
37
37
|
function resolveScriptUrl(environment = "sandbox", scriptUrl) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/loadScript.ts","../src/notify.ts","../src/checkout.ts","../src/usePaySky.ts","../src/PaySkyCheckout.tsx"],"sourcesContent":["export { SCRIPT_URLS, resolveScriptUrl } from './constants';\r\nexport { openLightbox, closeLightbox } from './checkout';\r\nexport { usePaySky } from './usePaySky';\r\nexport type { UsePaySkyResult } from './usePaySky';\r\nexport { PaySkyCheckout } from './PaySkyCheckout';\r\nexport type {\r\n PaySkyEnvironment,\r\n PaySkySession,\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyNotifyEvent,\r\n PaySkyNotifyPayload,\r\n PaySkyOpenOptions,\r\n PaySkyCheckoutProps,\r\n} from './types';\r\n","import type { PaySkyEnvironment } from './types';\r\n\r\nexport const SCRIPT_URLS: Record<PaySkyEnvironment, string> = {\r\n sandbox: 'https://grey.paysky.io:9006/invchost/JS/LightBox.js',\r\n production: 'https://cube.paysky.io:6006/js/LightBox.js',\r\n};\r\n\r\nexport function resolveScriptUrl(\r\n environment: PaySkyEnvironment = 'sandbox',\r\n scriptUrl?: string,\r\n): string {\r\n return scriptUrl ?? SCRIPT_URLS[environment];\r\n}\r\n","const loaders = new Map<string, Promise<void>>();\r\n\r\nexport function loadPaySkyScript(url: string): Promise<void> {\r\n const existing = loaders.get(url);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n\r\n script.addEventListener('load', () => resolve(), { once: true });\r\n script.addEventListener(\r\n 'error',\r\n () => {\r\n loaders.delete(url);\r\n reject(new Error(`Failed to load PaySky Lightbox script: ${url}`));\r\n },\r\n { once: true },\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n\r\n loaders.set(url, promise);\r\n return promise;\r\n}\r\n\r\n/** Test helper — clears cached loaders between tests. */\r\nexport function __resetPaySkyScriptLoaders(): void {\r\n loaders.clear();\r\n}\r\n","import type { PaySkyNotifyPayload } from './types';\r\n\r\nexport async function postNotify(\r\n notifyUrl: string,\r\n payload: PaySkyNotifyPayload,\r\n headers?: Record<string, string>,\r\n): Promise<void> {\r\n const response = await fetch(notifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `PaySky notify failed: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n}\r\n","import { resolveScriptUrl } from './constants';\r\nimport { loadPaySkyScript } from './loadScript';\r\nimport { postNotify } from './notify';\r\nimport type {\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyOpenOptions,\r\n PaySkySession,\r\n} from './types';\r\n\r\nlet openInProgress = false;\r\n\r\nfunction assertSession(session: PaySkySession): void {\r\n if (!session.mid?.trim()) {\r\n throw new Error('PaySky session.mid is required');\r\n }\r\n if (!session.tid?.trim()) {\r\n throw new Error('PaySky session.tid is required');\r\n }\r\n if (\r\n typeof session.amountTrxn !== 'number' ||\r\n !Number.isFinite(session.amountTrxn) ||\r\n session.amountTrxn <= 0\r\n ) {\r\n throw new Error('PaySky session.amountTrxn must be a positive number');\r\n }\r\n}\r\n\r\nfunction getCheckout() {\r\n const checkout = window.Lightbox?.Checkout;\r\n if (!checkout) {\r\n throw new Error(\r\n 'PaySky Lightbox is not available on window.Lightbox after script load',\r\n );\r\n }\r\n return checkout;\r\n}\r\n\r\nexport async function openLightbox(options: PaySkyOpenOptions): Promise<void> {\r\n const {\r\n session,\r\n environment = 'sandbox',\r\n scriptUrl,\r\n notifyUrl,\r\n notifyHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onNotifyError,\r\n } = options;\r\n\r\n assertSession(session);\r\n\r\n if (openInProgress) {\r\n throw new Error('PaySky Lightbox is already open');\r\n }\r\n\r\n const url = resolveScriptUrl(environment, scriptUrl);\r\n await loadPaySkyScript(url);\r\n\r\n const checkout = getCheckout();\r\n\r\n openInProgress = true;\r\n\r\n const safeNotify = (\r\n event: 'complete' | 'error',\r\n data: PaySkyCompleteData | PaySkyErrorData,\r\n ) => {\r\n if (!notifyUrl) return;\r\n void postNotify(notifyUrl, { event, data }, notifyHeaders).catch(\r\n (error) => {\r\n onNotifyError?.(error);\r\n },\r\n );\r\n };\r\n\r\n checkout.configure = {\r\n MID: session.mid,\r\n TID: session.tid,\r\n AmountTrxn: session.amountTrxn,\r\n ...(session.merchantReference != null\r\n ? { MerchantReference: session.merchantReference }\r\n : {}),\r\n ...(session.trxDateTime != null ? { TrxDateTime: session.trxDateTime } : {}),\r\n ...(session.secureHash != null ? { SecureHash: session.secureHash } : {}),\r\n completeCallback: (data: PaySkyCompleteData) => {\r\n openInProgress = false;\r\n onSuccess?.(data);\r\n safeNotify('complete', data);\r\n },\r\n errorCallback: (error: PaySkyErrorData) => {\r\n openInProgress = false;\r\n onError?.(error);\r\n safeNotify('error', error);\r\n },\r\n cancelCallback: () => {\r\n openInProgress = false;\r\n onCancel?.();\r\n },\r\n };\r\n\r\n checkout.showLightbox();\r\n}\r\n\r\nexport function closeLightbox(): void {\r\n openInProgress = false;\r\n window.Lightbox?.Checkout?.closeLightbox();\r\n}\r\n\r\n/** Test helper */\r\nexport function __resetCheckoutOpenState(): void {\r\n openInProgress = false;\r\n}\r\n","import { useCallback, useState } from 'react';\r\nimport { closeLightbox, openLightbox } from './checkout';\r\nimport type { PaySkyOpenOptions } from './types';\r\n\r\nexport interface UsePaySkyResult {\r\n openPayment: (options: PaySkyOpenOptions) => Promise<void>;\r\n closePayment: () => void;\r\n isOpen: boolean;\r\n isLoading: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function usePaySky(): UsePaySkyResult {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const closePayment = useCallback(() => {\r\n closeLightbox();\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const openPayment = useCallback(async (options: PaySkyOpenOptions) => {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await openLightbox({\r\n ...options,\r\n onSuccess: (data) => {\r\n setIsOpen(false);\r\n options.onSuccess?.(data);\r\n },\r\n onError: (err) => {\r\n setIsOpen(false);\r\n options.onError?.(err);\r\n },\r\n onCancel: () => {\r\n setIsOpen(false);\r\n options.onCancel?.();\r\n },\r\n });\r\n setIsOpen(true);\r\n } catch (err) {\r\n const next =\r\n err instanceof Error ? err : new Error('Failed to open PaySky Lightbox');\r\n setError(next);\r\n setIsOpen(false);\r\n throw next;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n openPayment,\r\n closePayment,\r\n isOpen,\r\n isLoading,\r\n error,\r\n };\r\n}\r\n","import type { PaySkyCheckoutProps } from './types';\r\nimport { usePaySky } from './usePaySky';\r\n\r\nexport function PaySkyCheckout({\r\n children = 'Pay with PaySky',\r\n className,\r\n disabled,\r\n ...options\r\n}: PaySkyCheckoutProps) {\r\n const { openPayment, isLoading, error } = usePaySky();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={className}\r\n disabled={disabled || isLoading}\r\n aria-busy={isLoading || undefined}\r\n data-error={error ? error.message : undefined}\r\n onClick={() => {\r\n void openPayment(options);\r\n }}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/loadScript.ts","../src/notify.ts","../src/checkout.ts","../src/usePaySky.ts","../src/PaySkyCheckout.tsx"],"sourcesContent":["export { SCRIPT_URLS, resolveScriptUrl } from './constants';\r\nexport { openLightbox, closeLightbox } from './checkout';\r\nexport { usePaySky } from './usePaySky';\r\nexport type { UsePaySkyResult } from './usePaySky';\r\nexport { PaySkyCheckout } from './PaySkyCheckout';\r\nexport type {\r\n PaySkyEnvironment,\r\n PaySkySession,\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyNotifyEvent,\r\n PaySkyNotifyPayload,\r\n PaySkyOpenOptions,\r\n PaySkyCheckoutProps,\r\n} from './types';\r\n","import type { PaySkyEnvironment } from './types';\r\n\r\nexport const SCRIPT_URLS: Record<PaySkyEnvironment, string> = {\r\n sandbox: 'https://red3.paysky.io:3011/LB/js/LightBox.js',\r\n production: 'https://cube.paysky.io:6006/js/LightBox.js',\r\n};\r\n\r\nexport function resolveScriptUrl(\r\n environment: PaySkyEnvironment = 'sandbox',\r\n scriptUrl?: string,\r\n): string {\r\n return scriptUrl ?? SCRIPT_URLS[environment];\r\n}\r\n","const loaders = new Map<string, Promise<void>>();\r\n\r\nexport function loadPaySkyScript(url: string): Promise<void> {\r\n const existing = loaders.get(url);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n\r\n script.addEventListener('load', () => resolve(), { once: true });\r\n script.addEventListener(\r\n 'error',\r\n () => {\r\n loaders.delete(url);\r\n reject(new Error(`Failed to load PaySky Lightbox script: ${url}`));\r\n },\r\n { once: true },\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n\r\n loaders.set(url, promise);\r\n return promise;\r\n}\r\n\r\n/** Test helper — clears cached loaders between tests. */\r\nexport function __resetPaySkyScriptLoaders(): void {\r\n loaders.clear();\r\n}\r\n","import type { PaySkyNotifyPayload } from './types';\r\n\r\nexport async function postNotify(\r\n notifyUrl: string,\r\n payload: PaySkyNotifyPayload,\r\n headers?: Record<string, string>,\r\n): Promise<void> {\r\n const response = await fetch(notifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `PaySky notify failed: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n}\r\n","import { resolveScriptUrl } from './constants';\r\nimport { loadPaySkyScript } from './loadScript';\r\nimport { postNotify } from './notify';\r\nimport type {\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyOpenOptions,\r\n PaySkySession,\r\n} from './types';\r\n\r\nlet openInProgress = false;\r\n\r\nfunction assertSession(session: PaySkySession): void {\r\n if (!session.mid?.trim()) {\r\n throw new Error('PaySky session.mid is required');\r\n }\r\n if (!session.tid?.trim()) {\r\n throw new Error('PaySky session.tid is required');\r\n }\r\n if (\r\n typeof session.amountTrxn !== 'number' ||\r\n !Number.isFinite(session.amountTrxn) ||\r\n session.amountTrxn <= 0\r\n ) {\r\n throw new Error('PaySky session.amountTrxn must be a positive number');\r\n }\r\n}\r\n\r\nfunction getCheckout() {\r\n const checkout = window.Lightbox?.Checkout;\r\n if (!checkout) {\r\n throw new Error(\r\n 'PaySky Lightbox is not available on window.Lightbox after script load',\r\n );\r\n }\r\n return checkout;\r\n}\r\n\r\nexport async function openLightbox(options: PaySkyOpenOptions): Promise<void> {\r\n const {\r\n session,\r\n environment = 'sandbox',\r\n scriptUrl,\r\n notifyUrl,\r\n notifyHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onNotifyError,\r\n } = options;\r\n\r\n assertSession(session);\r\n\r\n if (openInProgress) {\r\n throw new Error('PaySky Lightbox is already open');\r\n }\r\n\r\n const url = resolveScriptUrl(environment, scriptUrl);\r\n await loadPaySkyScript(url);\r\n\r\n const checkout = getCheckout();\r\n\r\n openInProgress = true;\r\n\r\n const safeNotify = (\r\n event: 'complete' | 'error',\r\n data: PaySkyCompleteData | PaySkyErrorData,\r\n ) => {\r\n if (!notifyUrl) return;\r\n void postNotify(notifyUrl, { event, data }, notifyHeaders).catch(\r\n (error) => {\r\n onNotifyError?.(error);\r\n },\r\n );\r\n };\r\n\r\n checkout.configure = {\r\n MID: session.mid,\r\n TID: session.tid,\r\n AmountTrxn: session.amountTrxn,\r\n ...(session.merchantReference != null\r\n ? { MerchantReference: session.merchantReference }\r\n : {}),\r\n ...(session.trxDateTime != null ? { TrxDateTime: session.trxDateTime } : {}),\r\n ...(session.secureHash != null ? { SecureHash: session.secureHash } : {}),\r\n completeCallback: (data: PaySkyCompleteData) => {\r\n openInProgress = false;\r\n onSuccess?.(data);\r\n safeNotify('complete', data);\r\n },\r\n errorCallback: (error: PaySkyErrorData) => {\r\n openInProgress = false;\r\n onError?.(error);\r\n safeNotify('error', error);\r\n },\r\n cancelCallback: () => {\r\n openInProgress = false;\r\n onCancel?.();\r\n },\r\n };\r\n\r\n checkout.showLightbox();\r\n}\r\n\r\nexport function closeLightbox(): void {\r\n openInProgress = false;\r\n window.Lightbox?.Checkout?.closeLightbox();\r\n}\r\n\r\n/** Test helper */\r\nexport function __resetCheckoutOpenState(): void {\r\n openInProgress = false;\r\n}\r\n","import { useCallback, useState } from 'react';\r\nimport { closeLightbox, openLightbox } from './checkout';\r\nimport type { PaySkyOpenOptions } from './types';\r\n\r\nexport interface UsePaySkyResult {\r\n openPayment: (options: PaySkyOpenOptions) => Promise<void>;\r\n closePayment: () => void;\r\n isOpen: boolean;\r\n isLoading: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function usePaySky(): UsePaySkyResult {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const closePayment = useCallback(() => {\r\n closeLightbox();\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const openPayment = useCallback(async (options: PaySkyOpenOptions) => {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await openLightbox({\r\n ...options,\r\n onSuccess: (data) => {\r\n setIsOpen(false);\r\n options.onSuccess?.(data);\r\n },\r\n onError: (err) => {\r\n setIsOpen(false);\r\n options.onError?.(err);\r\n },\r\n onCancel: () => {\r\n setIsOpen(false);\r\n options.onCancel?.();\r\n },\r\n });\r\n setIsOpen(true);\r\n } catch (err) {\r\n const next =\r\n err instanceof Error ? err : new Error('Failed to open PaySky Lightbox');\r\n setError(next);\r\n setIsOpen(false);\r\n throw next;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n openPayment,\r\n closePayment,\r\n isOpen,\r\n isLoading,\r\n error,\r\n };\r\n}\r\n","import type { PaySkyCheckoutProps } from './types';\r\nimport { usePaySky } from './usePaySky';\r\n\r\nexport function PaySkyCheckout({\r\n children = 'Pay with PaySky',\r\n className,\r\n disabled,\r\n ...options\r\n}: PaySkyCheckoutProps) {\r\n const { openPayment, isLoading, error } = usePaySky();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={className}\r\n disabled={disabled || isLoading}\r\n aria-busy={isLoading || undefined}\r\n data-error={error ? error.message : undefined}\r\n onClick={() => {\r\n void openPayment(options);\r\n }}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
2
|
var SCRIPT_URLS = {
|
|
3
|
-
sandbox: "https://
|
|
3
|
+
sandbox: "https://red3.paysky.io:3011/LB/js/LightBox.js",
|
|
4
4
|
production: "https://cube.paysky.io:6006/js/LightBox.js"
|
|
5
5
|
};
|
|
6
6
|
function resolveScriptUrl(environment = "sandbox", scriptUrl) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/loadScript.ts","../src/notify.ts","../src/checkout.ts","../src/usePaySky.ts","../src/PaySkyCheckout.tsx"],"sourcesContent":["import type { PaySkyEnvironment } from './types';\r\n\r\nexport const SCRIPT_URLS: Record<PaySkyEnvironment, string> = {\r\n sandbox: 'https://grey.paysky.io:9006/invchost/JS/LightBox.js',\r\n production: 'https://cube.paysky.io:6006/js/LightBox.js',\r\n};\r\n\r\nexport function resolveScriptUrl(\r\n environment: PaySkyEnvironment = 'sandbox',\r\n scriptUrl?: string,\r\n): string {\r\n return scriptUrl ?? SCRIPT_URLS[environment];\r\n}\r\n","const loaders = new Map<string, Promise<void>>();\r\n\r\nexport function loadPaySkyScript(url: string): Promise<void> {\r\n const existing = loaders.get(url);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n\r\n script.addEventListener('load', () => resolve(), { once: true });\r\n script.addEventListener(\r\n 'error',\r\n () => {\r\n loaders.delete(url);\r\n reject(new Error(`Failed to load PaySky Lightbox script: ${url}`));\r\n },\r\n { once: true },\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n\r\n loaders.set(url, promise);\r\n return promise;\r\n}\r\n\r\n/** Test helper — clears cached loaders between tests. */\r\nexport function __resetPaySkyScriptLoaders(): void {\r\n loaders.clear();\r\n}\r\n","import type { PaySkyNotifyPayload } from './types';\r\n\r\nexport async function postNotify(\r\n notifyUrl: string,\r\n payload: PaySkyNotifyPayload,\r\n headers?: Record<string, string>,\r\n): Promise<void> {\r\n const response = await fetch(notifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `PaySky notify failed: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n}\r\n","import { resolveScriptUrl } from './constants';\r\nimport { loadPaySkyScript } from './loadScript';\r\nimport { postNotify } from './notify';\r\nimport type {\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyOpenOptions,\r\n PaySkySession,\r\n} from './types';\r\n\r\nlet openInProgress = false;\r\n\r\nfunction assertSession(session: PaySkySession): void {\r\n if (!session.mid?.trim()) {\r\n throw new Error('PaySky session.mid is required');\r\n }\r\n if (!session.tid?.trim()) {\r\n throw new Error('PaySky session.tid is required');\r\n }\r\n if (\r\n typeof session.amountTrxn !== 'number' ||\r\n !Number.isFinite(session.amountTrxn) ||\r\n session.amountTrxn <= 0\r\n ) {\r\n throw new Error('PaySky session.amountTrxn must be a positive number');\r\n }\r\n}\r\n\r\nfunction getCheckout() {\r\n const checkout = window.Lightbox?.Checkout;\r\n if (!checkout) {\r\n throw new Error(\r\n 'PaySky Lightbox is not available on window.Lightbox after script load',\r\n );\r\n }\r\n return checkout;\r\n}\r\n\r\nexport async function openLightbox(options: PaySkyOpenOptions): Promise<void> {\r\n const {\r\n session,\r\n environment = 'sandbox',\r\n scriptUrl,\r\n notifyUrl,\r\n notifyHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onNotifyError,\r\n } = options;\r\n\r\n assertSession(session);\r\n\r\n if (openInProgress) {\r\n throw new Error('PaySky Lightbox is already open');\r\n }\r\n\r\n const url = resolveScriptUrl(environment, scriptUrl);\r\n await loadPaySkyScript(url);\r\n\r\n const checkout = getCheckout();\r\n\r\n openInProgress = true;\r\n\r\n const safeNotify = (\r\n event: 'complete' | 'error',\r\n data: PaySkyCompleteData | PaySkyErrorData,\r\n ) => {\r\n if (!notifyUrl) return;\r\n void postNotify(notifyUrl, { event, data }, notifyHeaders).catch(\r\n (error) => {\r\n onNotifyError?.(error);\r\n },\r\n );\r\n };\r\n\r\n checkout.configure = {\r\n MID: session.mid,\r\n TID: session.tid,\r\n AmountTrxn: session.amountTrxn,\r\n ...(session.merchantReference != null\r\n ? { MerchantReference: session.merchantReference }\r\n : {}),\r\n ...(session.trxDateTime != null ? { TrxDateTime: session.trxDateTime } : {}),\r\n ...(session.secureHash != null ? { SecureHash: session.secureHash } : {}),\r\n completeCallback: (data: PaySkyCompleteData) => {\r\n openInProgress = false;\r\n onSuccess?.(data);\r\n safeNotify('complete', data);\r\n },\r\n errorCallback: (error: PaySkyErrorData) => {\r\n openInProgress = false;\r\n onError?.(error);\r\n safeNotify('error', error);\r\n },\r\n cancelCallback: () => {\r\n openInProgress = false;\r\n onCancel?.();\r\n },\r\n };\r\n\r\n checkout.showLightbox();\r\n}\r\n\r\nexport function closeLightbox(): void {\r\n openInProgress = false;\r\n window.Lightbox?.Checkout?.closeLightbox();\r\n}\r\n\r\n/** Test helper */\r\nexport function __resetCheckoutOpenState(): void {\r\n openInProgress = false;\r\n}\r\n","import { useCallback, useState } from 'react';\r\nimport { closeLightbox, openLightbox } from './checkout';\r\nimport type { PaySkyOpenOptions } from './types';\r\n\r\nexport interface UsePaySkyResult {\r\n openPayment: (options: PaySkyOpenOptions) => Promise<void>;\r\n closePayment: () => void;\r\n isOpen: boolean;\r\n isLoading: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function usePaySky(): UsePaySkyResult {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const closePayment = useCallback(() => {\r\n closeLightbox();\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const openPayment = useCallback(async (options: PaySkyOpenOptions) => {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await openLightbox({\r\n ...options,\r\n onSuccess: (data) => {\r\n setIsOpen(false);\r\n options.onSuccess?.(data);\r\n },\r\n onError: (err) => {\r\n setIsOpen(false);\r\n options.onError?.(err);\r\n },\r\n onCancel: () => {\r\n setIsOpen(false);\r\n options.onCancel?.();\r\n },\r\n });\r\n setIsOpen(true);\r\n } catch (err) {\r\n const next =\r\n err instanceof Error ? err : new Error('Failed to open PaySky Lightbox');\r\n setError(next);\r\n setIsOpen(false);\r\n throw next;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n openPayment,\r\n closePayment,\r\n isOpen,\r\n isLoading,\r\n error,\r\n };\r\n}\r\n","import type { PaySkyCheckoutProps } from './types';\r\nimport { usePaySky } from './usePaySky';\r\n\r\nexport function PaySkyCheckout({\r\n children = 'Pay with PaySky',\r\n className,\r\n disabled,\r\n ...options\r\n}: PaySkyCheckoutProps) {\r\n const { openPayment, isLoading, error } = usePaySky();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={className}\r\n disabled={disabled || isLoading}\r\n aria-busy={isLoading || undefined}\r\n data-error={error ? error.message : undefined}\r\n onClick={() => {\r\n void openPayment(options);\r\n }}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/loadScript.ts","../src/notify.ts","../src/checkout.ts","../src/usePaySky.ts","../src/PaySkyCheckout.tsx"],"sourcesContent":["import type { PaySkyEnvironment } from './types';\r\n\r\nexport const SCRIPT_URLS: Record<PaySkyEnvironment, string> = {\r\n sandbox: 'https://red3.paysky.io:3011/LB/js/LightBox.js',\r\n production: 'https://cube.paysky.io:6006/js/LightBox.js',\r\n};\r\n\r\nexport function resolveScriptUrl(\r\n environment: PaySkyEnvironment = 'sandbox',\r\n scriptUrl?: string,\r\n): string {\r\n return scriptUrl ?? SCRIPT_URLS[environment];\r\n}\r\n","const loaders = new Map<string, Promise<void>>();\r\n\r\nexport function loadPaySkyScript(url: string): Promise<void> {\r\n const existing = loaders.get(url);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const promise = new Promise<void>((resolve, reject) => {\r\n const script = document.createElement('script');\r\n script.src = url;\r\n script.async = true;\r\n\r\n script.addEventListener('load', () => resolve(), { once: true });\r\n script.addEventListener(\r\n 'error',\r\n () => {\r\n loaders.delete(url);\r\n reject(new Error(`Failed to load PaySky Lightbox script: ${url}`));\r\n },\r\n { once: true },\r\n );\r\n\r\n document.head.appendChild(script);\r\n });\r\n\r\n loaders.set(url, promise);\r\n return promise;\r\n}\r\n\r\n/** Test helper — clears cached loaders between tests. */\r\nexport function __resetPaySkyScriptLoaders(): void {\r\n loaders.clear();\r\n}\r\n","import type { PaySkyNotifyPayload } from './types';\r\n\r\nexport async function postNotify(\r\n notifyUrl: string,\r\n payload: PaySkyNotifyPayload,\r\n headers?: Record<string, string>,\r\n): Promise<void> {\r\n const response = await fetch(notifyUrl, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: JSON.stringify(payload),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `PaySky notify failed: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n}\r\n","import { resolveScriptUrl } from './constants';\r\nimport { loadPaySkyScript } from './loadScript';\r\nimport { postNotify } from './notify';\r\nimport type {\r\n PaySkyCompleteData,\r\n PaySkyErrorData,\r\n PaySkyOpenOptions,\r\n PaySkySession,\r\n} from './types';\r\n\r\nlet openInProgress = false;\r\n\r\nfunction assertSession(session: PaySkySession): void {\r\n if (!session.mid?.trim()) {\r\n throw new Error('PaySky session.mid is required');\r\n }\r\n if (!session.tid?.trim()) {\r\n throw new Error('PaySky session.tid is required');\r\n }\r\n if (\r\n typeof session.amountTrxn !== 'number' ||\r\n !Number.isFinite(session.amountTrxn) ||\r\n session.amountTrxn <= 0\r\n ) {\r\n throw new Error('PaySky session.amountTrxn must be a positive number');\r\n }\r\n}\r\n\r\nfunction getCheckout() {\r\n const checkout = window.Lightbox?.Checkout;\r\n if (!checkout) {\r\n throw new Error(\r\n 'PaySky Lightbox is not available on window.Lightbox after script load',\r\n );\r\n }\r\n return checkout;\r\n}\r\n\r\nexport async function openLightbox(options: PaySkyOpenOptions): Promise<void> {\r\n const {\r\n session,\r\n environment = 'sandbox',\r\n scriptUrl,\r\n notifyUrl,\r\n notifyHeaders,\r\n onSuccess,\r\n onError,\r\n onCancel,\r\n onNotifyError,\r\n } = options;\r\n\r\n assertSession(session);\r\n\r\n if (openInProgress) {\r\n throw new Error('PaySky Lightbox is already open');\r\n }\r\n\r\n const url = resolveScriptUrl(environment, scriptUrl);\r\n await loadPaySkyScript(url);\r\n\r\n const checkout = getCheckout();\r\n\r\n openInProgress = true;\r\n\r\n const safeNotify = (\r\n event: 'complete' | 'error',\r\n data: PaySkyCompleteData | PaySkyErrorData,\r\n ) => {\r\n if (!notifyUrl) return;\r\n void postNotify(notifyUrl, { event, data }, notifyHeaders).catch(\r\n (error) => {\r\n onNotifyError?.(error);\r\n },\r\n );\r\n };\r\n\r\n checkout.configure = {\r\n MID: session.mid,\r\n TID: session.tid,\r\n AmountTrxn: session.amountTrxn,\r\n ...(session.merchantReference != null\r\n ? { MerchantReference: session.merchantReference }\r\n : {}),\r\n ...(session.trxDateTime != null ? { TrxDateTime: session.trxDateTime } : {}),\r\n ...(session.secureHash != null ? { SecureHash: session.secureHash } : {}),\r\n completeCallback: (data: PaySkyCompleteData) => {\r\n openInProgress = false;\r\n onSuccess?.(data);\r\n safeNotify('complete', data);\r\n },\r\n errorCallback: (error: PaySkyErrorData) => {\r\n openInProgress = false;\r\n onError?.(error);\r\n safeNotify('error', error);\r\n },\r\n cancelCallback: () => {\r\n openInProgress = false;\r\n onCancel?.();\r\n },\r\n };\r\n\r\n checkout.showLightbox();\r\n}\r\n\r\nexport function closeLightbox(): void {\r\n openInProgress = false;\r\n window.Lightbox?.Checkout?.closeLightbox();\r\n}\r\n\r\n/** Test helper */\r\nexport function __resetCheckoutOpenState(): void {\r\n openInProgress = false;\r\n}\r\n","import { useCallback, useState } from 'react';\r\nimport { closeLightbox, openLightbox } from './checkout';\r\nimport type { PaySkyOpenOptions } from './types';\r\n\r\nexport interface UsePaySkyResult {\r\n openPayment: (options: PaySkyOpenOptions) => Promise<void>;\r\n closePayment: () => void;\r\n isOpen: boolean;\r\n isLoading: boolean;\r\n error: Error | null;\r\n}\r\n\r\nexport function usePaySky(): UsePaySkyResult {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [error, setError] = useState<Error | null>(null);\r\n\r\n const closePayment = useCallback(() => {\r\n closeLightbox();\r\n setIsOpen(false);\r\n }, []);\r\n\r\n const openPayment = useCallback(async (options: PaySkyOpenOptions) => {\r\n setIsLoading(true);\r\n setError(null);\r\n\r\n try {\r\n await openLightbox({\r\n ...options,\r\n onSuccess: (data) => {\r\n setIsOpen(false);\r\n options.onSuccess?.(data);\r\n },\r\n onError: (err) => {\r\n setIsOpen(false);\r\n options.onError?.(err);\r\n },\r\n onCancel: () => {\r\n setIsOpen(false);\r\n options.onCancel?.();\r\n },\r\n });\r\n setIsOpen(true);\r\n } catch (err) {\r\n const next =\r\n err instanceof Error ? err : new Error('Failed to open PaySky Lightbox');\r\n setError(next);\r\n setIsOpen(false);\r\n throw next;\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, []);\r\n\r\n return {\r\n openPayment,\r\n closePayment,\r\n isOpen,\r\n isLoading,\r\n error,\r\n };\r\n}\r\n","import type { PaySkyCheckoutProps } from './types';\r\nimport { usePaySky } from './usePaySky';\r\n\r\nexport function PaySkyCheckout({\r\n children = 'Pay with PaySky',\r\n className,\r\n disabled,\r\n ...options\r\n}: PaySkyCheckoutProps) {\r\n const { openPayment, isLoading, error } = usePaySky();\r\n\r\n return (\r\n <button\r\n type=\"button\"\r\n className={className}\r\n disabled={disabled || isLoading}\r\n aria-busy={isLoading || undefined}\r\n data-error={error ? error.message : undefined}\r\n onClick={() => {\r\n void openPayment(options);\r\n }}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n"],"mappings":"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","names":[]}
|