@tongo_fintech/react-broker-signup-integration 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 +3 -15
- package/dist/index.cjs +11 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +11 -17
- package/dist/index.js.map +1 -1
- package/package.json +7 -1
package/README.md
CHANGED
|
@@ -58,9 +58,9 @@ Options:
|
|
|
58
58
|
|
|
59
59
|
- `environment`: `'develop' | 'production'`
|
|
60
60
|
- `modal`: optional modal customization
|
|
61
|
-
- `onSuccess`: called when iframe posts `{ event: 'SUCCESS' }`
|
|
61
|
+
- `onSuccess`: called when iframe posts `{ event: 'SUCCESS' }` and does not close the modal
|
|
62
62
|
- `onError`: called when iframe posts `{ event: 'ERROR', message: string }`
|
|
63
|
-
- `onClose`: called when the modal closes
|
|
63
|
+
- `onClose`: called when the modal closes
|
|
64
64
|
|
|
65
65
|
## Environments
|
|
66
66
|
|
|
@@ -70,7 +70,7 @@ Options:
|
|
|
70
70
|
The iframe URL is generated as:
|
|
71
71
|
|
|
72
72
|
```ts
|
|
73
|
-
${base}/integration/signup?signupToken=${encodeURIComponent(token)}
|
|
73
|
+
${base}/integration/signup/index.html?signupToken=${encodeURIComponent(token)}
|
|
74
74
|
```
|
|
75
75
|
|
|
76
76
|
## What The Library Renders
|
|
@@ -78,15 +78,3 @@ ${base}/integration/signup?signupToken=${encodeURIComponent(token)}
|
|
|
78
78
|
- A fullscreen dark backdrop
|
|
79
79
|
- A white rounded modal shell
|
|
80
80
|
- A full-size iframe inside the shell
|
|
81
|
-
|
|
82
|
-
## What The iFrame Owns
|
|
83
|
-
|
|
84
|
-
- The close button in the top-right corner
|
|
85
|
-
- All headers, logos, progress steps, forms and buttons
|
|
86
|
-
- All inner layout and styling inside the modal
|
|
87
|
-
|
|
88
|
-
## Release process
|
|
89
|
-
|
|
90
|
-
1. Update the version in `package.json`.
|
|
91
|
-
2. Push to `main`.
|
|
92
|
-
3. GitHub Actions will build, test and publish the package if that version is not already in npm.
|
package/dist/index.cjs
CHANGED
|
@@ -25,7 +25,7 @@ __export(index_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(index_exports);
|
|
26
26
|
|
|
27
27
|
// src/constants.ts
|
|
28
|
-
var DEFAULT_SIGNUP_PATH = "/integration/signup";
|
|
28
|
+
var DEFAULT_SIGNUP_PATH = "/integration/signup/index.html";
|
|
29
29
|
var ENVIRONMENT_BASE_URLS = {
|
|
30
30
|
develop: "https://broker.tongoapp.io",
|
|
31
31
|
production: "https://broker.gettongo.com"
|
|
@@ -279,22 +279,17 @@ function useBrokerSignupIntegrationBase({
|
|
|
279
279
|
activeElementRef.current?.focus();
|
|
280
280
|
activeElementRef.current = null;
|
|
281
281
|
}, []);
|
|
282
|
-
const closeInternal = (0, import_react2.useCallback)(
|
|
283
|
-
(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
onCloseRef.current?.(reason);
|
|
291
|
-
}
|
|
292
|
-
},
|
|
293
|
-
[]
|
|
294
|
-
);
|
|
282
|
+
const closeInternal = (0, import_react2.useCallback)((reason) => {
|
|
283
|
+
if (!isOpenRef.current) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
setIsOpen(false);
|
|
287
|
+
setIframeSrc(null);
|
|
288
|
+
onCloseRef.current?.(reason);
|
|
289
|
+
}, []);
|
|
295
290
|
const close = (0, import_react2.useCallback)(
|
|
296
291
|
(reason = "api") => {
|
|
297
|
-
closeInternal(reason
|
|
292
|
+
closeInternal(reason);
|
|
298
293
|
},
|
|
299
294
|
[closeInternal]
|
|
300
295
|
);
|
|
@@ -364,12 +359,11 @@ function useBrokerSignupIntegrationBase({
|
|
|
364
359
|
return;
|
|
365
360
|
}
|
|
366
361
|
if (event.data.event === "SUCCESS") {
|
|
367
|
-
closeInternal("success", false);
|
|
368
362
|
onSuccessRef.current?.();
|
|
369
363
|
return;
|
|
370
364
|
}
|
|
371
365
|
if (event.data.event === "CLOSE") {
|
|
372
|
-
closeInternal("iframe"
|
|
366
|
+
closeInternal("iframe");
|
|
373
367
|
return;
|
|
374
368
|
}
|
|
375
369
|
onErrorRef.current?.({ message: event.data.message });
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/getEnvironmentBaseUrl.ts","../src/internal/useBrokerSignupIntegrationBase.tsx","../src/components/BrokerSignupModal.tsx","../src/utils/normalizeSignupPath.ts","../src/utils/buildSignupUrl.ts","../src/utils/isValidIframeMessage.ts","../src/useBrokerSignupIntegration.tsx"],"sourcesContent":["export { useBrokerSignupIntegration } from './useBrokerSignupIntegration';\nexport type {\n BrokerSignupCloseReason,\n BrokerSignupEnvironment,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n","import type { BrokerSignupEnvironment, BrokerSignupModalOptions } from './types';\n\nexport const DEFAULT_SIGNUP_PATH = '/integration/signup';\n\nexport const ENVIRONMENT_BASE_URLS: Record<BrokerSignupEnvironment, string> = {\n develop: 'https://broker.tongoapp.io',\n production: 'https://broker.gettongo.com',\n};\n\nexport const DEFAULT_MODAL_OPTIONS: Required<\n Pick<\n BrokerSignupModalOptions,\n | 'width'\n | 'height'\n | 'zIndex'\n | 'closeOnOverlayClick'\n | 'closeOnEscape'\n | 'iframeTitle'\n >\n> = {\n width: 1120,\n height: 880,\n zIndex: 1000,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n iframeTitle: 'Tongo broker signup',\n};\n","import { ENVIRONMENT_BASE_URLS } from '../constants';\nimport type { BrokerSignupEnvironment } from '../types';\n\nexport function getEnvironmentBaseUrl(environment: BrokerSignupEnvironment): string {\n return ENVIRONMENT_BASE_URLS[environment];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nimport { BrokerSignupModal } from '../components/BrokerSignupModal';\nimport { DEFAULT_MODAL_OPTIONS, DEFAULT_SIGNUP_PATH } from '../constants';\nimport type {\n BrokerSignupCloseReason,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\nimport { buildSignupUrlFromConfig } from '../utils/buildSignupUrl';\nimport { isValidIframeMessage } from '../utils/isValidIframeMessage';\n\nexport interface UseBrokerSignupIntegrationBaseOptions {\n baseUrl: string;\n signupPath?: string;\n modal?: BrokerSignupModalOptions;\n onSuccess?: () => void;\n onError?: (event: BrokerSignupErrorEvent) => void;\n onClose?: (reason: Exclude<BrokerSignupCloseReason, 'success'>) => void;\n}\n\nlet bodyScrollLockCount = 0;\nlet initialBodyOverflow = '';\n\nfunction lockBodyScroll() {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (bodyScrollLockCount === 0) {\n initialBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n bodyScrollLockCount += 1;\n}\n\nfunction unlockBodyScroll() {\n if (typeof document === 'undefined' || bodyScrollLockCount === 0) {\n return;\n }\n\n bodyScrollLockCount -= 1;\n\n if (bodyScrollLockCount === 0) {\n document.body.style.overflow = initialBodyOverflow;\n }\n}\n\nfunction resolveModalOptions(\n modalOptions?: BrokerSignupModalOptions,\n): ResolvedBrokerSignupModalOptions {\n return {\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n };\n}\n\nexport function useBrokerSignupIntegrationBase({\n baseUrl,\n signupPath = DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationBaseOptions): BrokerSignupIntegrationControls {\n const [isOpen, setIsOpen] = useState(false);\n const [iframeSrc, setIframeSrc] = useState<string | null>(null);\n\n const rootRef = useRef<Root | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeElementRef = useRef<HTMLElement | null>(null);\n const isOpenRef = useRef(isOpen);\n const scrollLockedRef = useRef(false);\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n const onCloseRef = useRef(onClose);\n\n isOpenRef.current = isOpen;\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n onCloseRef.current = onClose;\n\n const resolvedModalOptions = useMemo(() => resolveModalOptions(modal), [modal]);\n\n const teardownModalRoot = useCallback(() => {\n const root = rootRef.current;\n const container = containerRef.current;\n\n rootRef.current = null;\n containerRef.current = null;\n\n if (!root || !container) {\n return;\n }\n\n queueMicrotask(() => {\n root.unmount();\n container.remove();\n });\n }, []);\n\n const restoreFocus = useCallback(() => {\n activeElementRef.current?.focus();\n activeElementRef.current = null;\n }, []);\n\n const closeInternal = useCallback(\n (reason: BrokerSignupCloseReason, notifyOnClose: boolean) => {\n if (!isOpenRef.current) {\n return;\n }\n\n setIsOpen(false);\n setIframeSrc(null);\n\n if (notifyOnClose && reason !== 'success') {\n onCloseRef.current?.(reason);\n }\n },\n [],\n );\n\n const close = useCallback(\n (reason: Exclude<BrokerSignupCloseReason, 'success'> = 'api') => {\n closeInternal(reason, true);\n },\n [closeInternal],\n );\n\n const open = useCallback(\n (signupToken: string) => {\n if (typeof signupToken !== 'string') {\n throw new Error('signupToken is required');\n }\n\n const normalizedSignupToken = signupToken.trim();\n\n if (normalizedSignupToken === '') {\n throw new Error('signupToken is required');\n }\n\n if (typeof document !== 'undefined' && !activeElementRef.current) {\n activeElementRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n\n setIframeSrc(\n buildSignupUrlFromConfig(baseUrl, signupPath, normalizedSignupToken),\n );\n setIsOpen(true);\n },\n [baseUrl, signupPath],\n );\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (!isOpen || !iframeSrc) {\n rootRef.current?.render(null);\n return;\n }\n\n if (!containerRef.current) {\n containerRef.current = document.createElement('div');\n containerRef.current.dataset.brokerSignupIntegration = 'true';\n document.body.appendChild(containerRef.current);\n rootRef.current = createRoot(containerRef.current);\n }\n\n rootRef.current?.render(\n <BrokerSignupModal\n iframeSrc={iframeSrc}\n modalOptions={resolvedModalOptions}\n onRequestClose={close}\n />,\n );\n }, [close, iframeSrc, isOpen, resolvedModalOptions]);\n\n useEffect(() => {\n if (isOpen && !scrollLockedRef.current) {\n lockBodyScroll();\n scrollLockedRef.current = true;\n return;\n }\n\n if (!isOpen && scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n restoreFocus();\n }\n }, [isOpen, restoreFocus]);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !isOpen || !iframeSrc) {\n return;\n }\n\n const expectedOrigin = new URL(iframeSrc).origin;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== expectedOrigin || !isValidIframeMessage(event.data)) {\n return;\n }\n\n if (event.data.event === 'SUCCESS') {\n closeInternal('success', false);\n onSuccessRef.current?.();\n return;\n }\n\n if (event.data.event === 'CLOSE') {\n closeInternal('iframe', true);\n return;\n }\n\n onErrorRef.current?.({ message: event.data.message });\n };\n\n window.addEventListener('message', handleMessage);\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [closeInternal, iframeSrc, isOpen]);\n\n useEffect(() => {\n return () => {\n if (scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n }\n\n teardownModalRoot();\n restoreFocus();\n };\n }, [restoreFocus, teardownModalRoot]);\n\n return {\n open,\n close,\n isOpen,\n };\n}\n","import { useEffect, useRef } from 'react';\n\nimport type {\n BrokerSignupCloseReason,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\n\ninterface BrokerSignupModalProps {\n iframeSrc: string;\n modalOptions: ResolvedBrokerSignupModalOptions;\n onRequestClose: (reason: Exclude<BrokerSignupCloseReason, 'success'>) => void;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function BrokerSignupModal({\n iframeSrc,\n modalOptions,\n onRequestClose,\n}: BrokerSignupModalProps) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n dialogRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!modalOptions.closeOnEscape) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onRequestClose('escape');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [modalOptions.closeOnEscape, onRequestClose]);\n\n return (\n <div\n className={modalOptions.overlayClassName}\n data-testid=\"broker-signup-overlay\"\n onClick={(event) => {\n if (\n modalOptions.closeOnOverlayClick &&\n event.target === event.currentTarget\n ) {\n onRequestClose('overlay');\n }\n }}\n style={{\n alignItems: 'center',\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n display: 'flex',\n inset: 0,\n justifyContent: 'center',\n padding: 'clamp(12px, 3vw, 24px)',\n position: 'fixed',\n zIndex: modalOptions.zIndex,\n }}\n >\n <div\n aria-label={modalOptions.iframeTitle}\n aria-modal=\"true\"\n className={modalOptions.className}\n data-testid=\"broker-signup-dialog\"\n ref={dialogRef}\n role=\"dialog\"\n style={{\n backgroundColor: '#ffffff',\n borderRadius: 'clamp(16px, 2vw, 20px)',\n boxShadow: '0 24px 80px rgba(15, 23, 42, 0.22)',\n display: 'flex',\n flexDirection: 'column',\n height: `min(${toCssSize(modalOptions.height)}, calc(100vh - 48px))`,\n maxHeight: 'calc(100vh - 48px)',\n maxWidth: 'calc(100vw - 48px)',\n overflow: 'hidden',\n position: 'relative',\n width: `min(${toCssSize(modalOptions.width)}, calc(100vw - 48px))`,\n }}\n tabIndex={-1}\n >\n <iframe\n src={iframeSrc}\n style={{\n backgroundColor: '#ffffff',\n border: 0,\n display: 'block',\n flex: 1,\n height: '100%',\n width: '100%',\n }}\n title={modalOptions.iframeTitle}\n />\n </div>\n </div>\n );\n}\n","import { DEFAULT_SIGNUP_PATH } from '../constants';\n\nexport function normalizeSignupPath(signupPath: string = DEFAULT_SIGNUP_PATH): string {\n if (typeof signupPath !== 'string') {\n throw new Error('signupPath must be a pathname');\n }\n\n if (signupPath.includes('://')) {\n throw new Error('signupPath must not be a full URL');\n }\n\n if (signupPath.includes('?') || signupPath.includes('#')) {\n throw new Error('signupPath must not include query params or hash');\n }\n\n const trimmedPath = signupPath.trim();\n\n if (trimmedPath === '') {\n return '/';\n }\n\n if (trimmedPath === '/') {\n return '/';\n }\n\n return trimmedPath.startsWith('/') ? trimmedPath : `/${trimmedPath}`;\n}\n","import type { BrokerSignupEnvironment } from '../types';\nimport { DEFAULT_SIGNUP_PATH } from '../constants';\nimport { getEnvironmentBaseUrl } from './getEnvironmentBaseUrl';\nimport { normalizeSignupPath } from './normalizeSignupPath';\n\nfunction parseBaseUrl(baseUrl: string): URL {\n if (typeof baseUrl !== 'string' || baseUrl.trim() === '') {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n if (url.search || url.hash) {\n throw new Error('baseUrl must not include search params or hash');\n }\n\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('baseUrl must not include a pathname');\n }\n\n return url;\n}\n\nexport function getBaseUrlOrigin(baseUrl: string): string {\n return parseBaseUrl(baseUrl).origin;\n}\n\nexport function buildSignupUrlFromConfig(\n baseUrl: string,\n signupPath: string = DEFAULT_SIGNUP_PATH,\n signupToken: string,\n): string {\n const url = new URL(normalizeSignupPath(signupPath), getBaseUrlOrigin(baseUrl));\n url.searchParams.set('signupToken', signupToken);\n return url.toString();\n}\n\nexport function buildSignupUrl(\n environment: BrokerSignupEnvironment,\n signupToken: string,\n): string {\n return buildSignupUrlFromConfig(\n getEnvironmentBaseUrl(environment),\n DEFAULT_SIGNUP_PATH,\n signupToken,\n );\n}\n","import type { BrokerSignupIframeMessage } from '../types';\n\nexport function isValidIframeMessage(\n payload: unknown,\n): payload is BrokerSignupIframeMessage {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n\n if (!('event' in payload)) {\n return false;\n }\n\n if (payload.event === 'SUCCESS') {\n return true;\n }\n\n if (payload.event === 'CLOSE') {\n return true;\n }\n\n if (payload.event === 'ERROR') {\n return 'message' in payload && typeof payload.message === 'string';\n }\n\n return false;\n}\n","import { getEnvironmentBaseUrl } from './utils/getEnvironmentBaseUrl';\nimport { DEFAULT_SIGNUP_PATH } from './constants';\nimport { useBrokerSignupIntegrationBase } from './internal/useBrokerSignupIntegrationBase';\nimport type {\n BrokerSignupIntegrationControls,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n\nexport function useBrokerSignupIntegration({\n environment,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationOptions): BrokerSignupIntegrationControls {\n return useBrokerSignupIntegrationBase({\n baseUrl: getEnvironmentBaseUrl(environment),\n signupPath: DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils/getEnvironmentBaseUrl.ts","../src/internal/useBrokerSignupIntegrationBase.tsx","../src/components/BrokerSignupModal.tsx","../src/utils/normalizeSignupPath.ts","../src/utils/buildSignupUrl.ts","../src/utils/isValidIframeMessage.ts","../src/useBrokerSignupIntegration.tsx"],"sourcesContent":["export { useBrokerSignupIntegration } from './useBrokerSignupIntegration';\nexport type {\n BrokerSignupCloseReason,\n BrokerSignupEnvironment,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n","import type { BrokerSignupEnvironment, BrokerSignupModalOptions } from './types';\n\nexport const DEFAULT_SIGNUP_PATH = '/integration/signup/index.html';\n\nexport const ENVIRONMENT_BASE_URLS: Record<BrokerSignupEnvironment, string> = {\n develop: 'https://broker.tongoapp.io',\n production: 'https://broker.gettongo.com',\n};\n\nexport const DEFAULT_MODAL_OPTIONS: Required<\n Pick<\n BrokerSignupModalOptions,\n | 'width'\n | 'height'\n | 'zIndex'\n | 'closeOnOverlayClick'\n | 'closeOnEscape'\n | 'iframeTitle'\n >\n> = {\n width: 1120,\n height: 880,\n zIndex: 1000,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n iframeTitle: 'Tongo broker signup',\n};\n","import { ENVIRONMENT_BASE_URLS } from '../constants';\nimport type { BrokerSignupEnvironment } from '../types';\n\nexport function getEnvironmentBaseUrl(environment: BrokerSignupEnvironment): string {\n return ENVIRONMENT_BASE_URLS[environment];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nimport { BrokerSignupModal } from '../components/BrokerSignupModal';\nimport { DEFAULT_MODAL_OPTIONS, DEFAULT_SIGNUP_PATH } from '../constants';\nimport type {\n BrokerSignupCloseReason,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\nimport { buildSignupUrlFromConfig } from '../utils/buildSignupUrl';\nimport { isValidIframeMessage } from '../utils/isValidIframeMessage';\n\nexport interface UseBrokerSignupIntegrationBaseOptions {\n baseUrl: string;\n signupPath?: string;\n modal?: BrokerSignupModalOptions;\n onSuccess?: () => void;\n onError?: (event: BrokerSignupErrorEvent) => void;\n onClose?: (reason: BrokerSignupCloseReason) => void;\n}\n\nlet bodyScrollLockCount = 0;\nlet initialBodyOverflow = '';\n\nfunction lockBodyScroll() {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (bodyScrollLockCount === 0) {\n initialBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n bodyScrollLockCount += 1;\n}\n\nfunction unlockBodyScroll() {\n if (typeof document === 'undefined' || bodyScrollLockCount === 0) {\n return;\n }\n\n bodyScrollLockCount -= 1;\n\n if (bodyScrollLockCount === 0) {\n document.body.style.overflow = initialBodyOverflow;\n }\n}\n\nfunction resolveModalOptions(\n modalOptions?: BrokerSignupModalOptions,\n): ResolvedBrokerSignupModalOptions {\n return {\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n };\n}\n\nexport function useBrokerSignupIntegrationBase({\n baseUrl,\n signupPath = DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationBaseOptions): BrokerSignupIntegrationControls {\n const [isOpen, setIsOpen] = useState(false);\n const [iframeSrc, setIframeSrc] = useState<string | null>(null);\n\n const rootRef = useRef<Root | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeElementRef = useRef<HTMLElement | null>(null);\n const isOpenRef = useRef(isOpen);\n const scrollLockedRef = useRef(false);\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n const onCloseRef = useRef(onClose);\n\n isOpenRef.current = isOpen;\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n onCloseRef.current = onClose;\n\n const resolvedModalOptions = useMemo(() => resolveModalOptions(modal), [modal]);\n\n const teardownModalRoot = useCallback(() => {\n const root = rootRef.current;\n const container = containerRef.current;\n\n rootRef.current = null;\n containerRef.current = null;\n\n if (!root || !container) {\n return;\n }\n\n queueMicrotask(() => {\n root.unmount();\n container.remove();\n });\n }, []);\n\n const restoreFocus = useCallback(() => {\n activeElementRef.current?.focus();\n activeElementRef.current = null;\n }, []);\n\n const closeInternal = useCallback((reason: BrokerSignupCloseReason) => {\n if (!isOpenRef.current) {\n return;\n }\n\n setIsOpen(false);\n setIframeSrc(null);\n onCloseRef.current?.(reason);\n }, []);\n\n const close = useCallback(\n (reason: BrokerSignupCloseReason = 'api') => {\n closeInternal(reason);\n },\n [closeInternal],\n );\n\n const open = useCallback(\n (signupToken: string) => {\n if (typeof signupToken !== 'string') {\n throw new Error('signupToken is required');\n }\n\n const normalizedSignupToken = signupToken.trim();\n\n if (normalizedSignupToken === '') {\n throw new Error('signupToken is required');\n }\n\n if (typeof document !== 'undefined' && !activeElementRef.current) {\n activeElementRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n\n setIframeSrc(\n buildSignupUrlFromConfig(baseUrl, signupPath, normalizedSignupToken),\n );\n setIsOpen(true);\n },\n [baseUrl, signupPath],\n );\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (!isOpen || !iframeSrc) {\n rootRef.current?.render(null);\n return;\n }\n\n if (!containerRef.current) {\n containerRef.current = document.createElement('div');\n containerRef.current.dataset.brokerSignupIntegration = 'true';\n document.body.appendChild(containerRef.current);\n rootRef.current = createRoot(containerRef.current);\n }\n\n rootRef.current?.render(\n <BrokerSignupModal\n iframeSrc={iframeSrc}\n modalOptions={resolvedModalOptions}\n onRequestClose={close}\n />,\n );\n }, [close, iframeSrc, isOpen, resolvedModalOptions]);\n\n useEffect(() => {\n if (isOpen && !scrollLockedRef.current) {\n lockBodyScroll();\n scrollLockedRef.current = true;\n return;\n }\n\n if (!isOpen && scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n restoreFocus();\n }\n }, [isOpen, restoreFocus]);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !isOpen || !iframeSrc) {\n return;\n }\n\n const expectedOrigin = new URL(iframeSrc).origin;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== expectedOrigin || !isValidIframeMessage(event.data)) {\n return;\n }\n\n if (event.data.event === 'SUCCESS') {\n onSuccessRef.current?.();\n return;\n }\n\n if (event.data.event === 'CLOSE') {\n closeInternal('iframe');\n return;\n }\n\n onErrorRef.current?.({ message: event.data.message });\n };\n\n window.addEventListener('message', handleMessage);\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [closeInternal, iframeSrc, isOpen]);\n\n useEffect(() => {\n return () => {\n if (scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n }\n\n teardownModalRoot();\n restoreFocus();\n };\n }, [restoreFocus, teardownModalRoot]);\n\n return {\n open,\n close,\n isOpen,\n };\n}\n","import { useEffect, useRef } from 'react';\n\nimport type {\n BrokerSignupCloseReason,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\n\ninterface BrokerSignupModalProps {\n iframeSrc: string;\n modalOptions: ResolvedBrokerSignupModalOptions;\n onRequestClose: (reason: BrokerSignupCloseReason) => void;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function BrokerSignupModal({\n iframeSrc,\n modalOptions,\n onRequestClose,\n}: BrokerSignupModalProps) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n dialogRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!modalOptions.closeOnEscape) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onRequestClose('escape');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [modalOptions.closeOnEscape, onRequestClose]);\n\n return (\n <div\n className={modalOptions.overlayClassName}\n data-testid=\"broker-signup-overlay\"\n onClick={(event) => {\n if (\n modalOptions.closeOnOverlayClick &&\n event.target === event.currentTarget\n ) {\n onRequestClose('overlay');\n }\n }}\n style={{\n alignItems: 'center',\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n display: 'flex',\n inset: 0,\n justifyContent: 'center',\n padding: 'clamp(12px, 3vw, 24px)',\n position: 'fixed',\n zIndex: modalOptions.zIndex,\n }}\n >\n <div\n aria-label={modalOptions.iframeTitle}\n aria-modal=\"true\"\n className={modalOptions.className}\n data-testid=\"broker-signup-dialog\"\n ref={dialogRef}\n role=\"dialog\"\n style={{\n backgroundColor: '#ffffff',\n borderRadius: 'clamp(16px, 2vw, 20px)',\n boxShadow: '0 24px 80px rgba(15, 23, 42, 0.22)',\n display: 'flex',\n flexDirection: 'column',\n height: `min(${toCssSize(modalOptions.height)}, calc(100vh - 48px))`,\n maxHeight: 'calc(100vh - 48px)',\n maxWidth: 'calc(100vw - 48px)',\n overflow: 'hidden',\n position: 'relative',\n width: `min(${toCssSize(modalOptions.width)}, calc(100vw - 48px))`,\n }}\n tabIndex={-1}\n >\n <iframe\n src={iframeSrc}\n style={{\n backgroundColor: '#ffffff',\n border: 0,\n display: 'block',\n flex: 1,\n height: '100%',\n width: '100%',\n }}\n title={modalOptions.iframeTitle}\n />\n </div>\n </div>\n );\n}\n","import { DEFAULT_SIGNUP_PATH } from '../constants';\n\nexport function normalizeSignupPath(signupPath: string = DEFAULT_SIGNUP_PATH): string {\n if (typeof signupPath !== 'string') {\n throw new Error('signupPath must be a pathname');\n }\n\n if (signupPath.includes('://')) {\n throw new Error('signupPath must not be a full URL');\n }\n\n if (signupPath.includes('?') || signupPath.includes('#')) {\n throw new Error('signupPath must not include query params or hash');\n }\n\n const trimmedPath = signupPath.trim();\n\n if (trimmedPath === '') {\n return '/';\n }\n\n if (trimmedPath === '/') {\n return '/';\n }\n\n return trimmedPath.startsWith('/') ? trimmedPath : `/${trimmedPath}`;\n}\n","import type { BrokerSignupEnvironment } from '../types';\nimport { DEFAULT_SIGNUP_PATH } from '../constants';\nimport { getEnvironmentBaseUrl } from './getEnvironmentBaseUrl';\nimport { normalizeSignupPath } from './normalizeSignupPath';\n\nfunction parseBaseUrl(baseUrl: string): URL {\n if (typeof baseUrl !== 'string' || baseUrl.trim() === '') {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n if (url.search || url.hash) {\n throw new Error('baseUrl must not include search params or hash');\n }\n\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('baseUrl must not include a pathname');\n }\n\n return url;\n}\n\nexport function getBaseUrlOrigin(baseUrl: string): string {\n return parseBaseUrl(baseUrl).origin;\n}\n\nexport function buildSignupUrlFromConfig(\n baseUrl: string,\n signupPath: string = DEFAULT_SIGNUP_PATH,\n signupToken: string,\n): string {\n const url = new URL(normalizeSignupPath(signupPath), getBaseUrlOrigin(baseUrl));\n url.searchParams.set('signupToken', signupToken);\n return url.toString();\n}\n\nexport function buildSignupUrl(\n environment: BrokerSignupEnvironment,\n signupToken: string,\n): string {\n return buildSignupUrlFromConfig(\n getEnvironmentBaseUrl(environment),\n DEFAULT_SIGNUP_PATH,\n signupToken,\n );\n}\n","import type { BrokerSignupIframeMessage } from '../types';\n\nexport function isValidIframeMessage(\n payload: unknown,\n): payload is BrokerSignupIframeMessage {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n\n if (!('event' in payload)) {\n return false;\n }\n\n if (payload.event === 'SUCCESS') {\n return true;\n }\n\n if (payload.event === 'CLOSE') {\n return true;\n }\n\n if (payload.event === 'ERROR') {\n return 'message' in payload && typeof payload.message === 'string';\n }\n\n return false;\n}\n","import { getEnvironmentBaseUrl } from './utils/getEnvironmentBaseUrl';\nimport { DEFAULT_SIGNUP_PATH } from './constants';\nimport { useBrokerSignupIntegrationBase } from './internal/useBrokerSignupIntegrationBase';\nimport type {\n BrokerSignupIntegrationControls,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n\nexport function useBrokerSignupIntegration({\n environment,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationOptions): BrokerSignupIntegrationControls {\n return useBrokerSignupIntegrationBase({\n baseUrl: getEnvironmentBaseUrl(environment),\n signupPath: DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n });\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type BrokerSignupEnvironment = 'develop' | 'production';
|
|
2
|
-
type BrokerSignupCloseReason = 'overlay' | 'escape' | 'iframe' | 'api'
|
|
2
|
+
type BrokerSignupCloseReason = 'overlay' | 'escape' | 'iframe' | 'api';
|
|
3
3
|
interface BrokerSignupModalOptions {
|
|
4
4
|
width?: number | string;
|
|
5
5
|
height?: number | string;
|
|
@@ -18,11 +18,11 @@ interface UseBrokerSignupIntegrationOptions {
|
|
|
18
18
|
modal?: BrokerSignupModalOptions;
|
|
19
19
|
onSuccess?: () => void;
|
|
20
20
|
onError?: (event: BrokerSignupErrorEvent) => void;
|
|
21
|
-
onClose?: (reason:
|
|
21
|
+
onClose?: (reason: BrokerSignupCloseReason) => void;
|
|
22
22
|
}
|
|
23
23
|
interface BrokerSignupIntegrationControls {
|
|
24
24
|
open: (signupToken: string) => void;
|
|
25
|
-
close: (reason?:
|
|
25
|
+
close: (reason?: BrokerSignupCloseReason) => void;
|
|
26
26
|
isOpen: boolean;
|
|
27
27
|
}
|
|
28
28
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
type BrokerSignupEnvironment = 'develop' | 'production';
|
|
2
|
-
type BrokerSignupCloseReason = 'overlay' | 'escape' | 'iframe' | 'api'
|
|
2
|
+
type BrokerSignupCloseReason = 'overlay' | 'escape' | 'iframe' | 'api';
|
|
3
3
|
interface BrokerSignupModalOptions {
|
|
4
4
|
width?: number | string;
|
|
5
5
|
height?: number | string;
|
|
@@ -18,11 +18,11 @@ interface UseBrokerSignupIntegrationOptions {
|
|
|
18
18
|
modal?: BrokerSignupModalOptions;
|
|
19
19
|
onSuccess?: () => void;
|
|
20
20
|
onError?: (event: BrokerSignupErrorEvent) => void;
|
|
21
|
-
onClose?: (reason:
|
|
21
|
+
onClose?: (reason: BrokerSignupCloseReason) => void;
|
|
22
22
|
}
|
|
23
23
|
interface BrokerSignupIntegrationControls {
|
|
24
24
|
open: (signupToken: string) => void;
|
|
25
|
-
close: (reason?:
|
|
25
|
+
close: (reason?: BrokerSignupCloseReason) => void;
|
|
26
26
|
isOpen: boolean;
|
|
27
27
|
}
|
|
28
28
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
|
-
var DEFAULT_SIGNUP_PATH = "/integration/signup";
|
|
2
|
+
var DEFAULT_SIGNUP_PATH = "/integration/signup/index.html";
|
|
3
3
|
var ENVIRONMENT_BASE_URLS = {
|
|
4
4
|
develop: "https://broker.tongoapp.io",
|
|
5
5
|
production: "https://broker.gettongo.com"
|
|
@@ -253,22 +253,17 @@ function useBrokerSignupIntegrationBase({
|
|
|
253
253
|
activeElementRef.current?.focus();
|
|
254
254
|
activeElementRef.current = null;
|
|
255
255
|
}, []);
|
|
256
|
-
const closeInternal = useCallback(
|
|
257
|
-
(
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
onCloseRef.current?.(reason);
|
|
265
|
-
}
|
|
266
|
-
},
|
|
267
|
-
[]
|
|
268
|
-
);
|
|
256
|
+
const closeInternal = useCallback((reason) => {
|
|
257
|
+
if (!isOpenRef.current) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
setIsOpen(false);
|
|
261
|
+
setIframeSrc(null);
|
|
262
|
+
onCloseRef.current?.(reason);
|
|
263
|
+
}, []);
|
|
269
264
|
const close = useCallback(
|
|
270
265
|
(reason = "api") => {
|
|
271
|
-
closeInternal(reason
|
|
266
|
+
closeInternal(reason);
|
|
272
267
|
},
|
|
273
268
|
[closeInternal]
|
|
274
269
|
);
|
|
@@ -338,12 +333,11 @@ function useBrokerSignupIntegrationBase({
|
|
|
338
333
|
return;
|
|
339
334
|
}
|
|
340
335
|
if (event.data.event === "SUCCESS") {
|
|
341
|
-
closeInternal("success", false);
|
|
342
336
|
onSuccessRef.current?.();
|
|
343
337
|
return;
|
|
344
338
|
}
|
|
345
339
|
if (event.data.event === "CLOSE") {
|
|
346
|
-
closeInternal("iframe"
|
|
340
|
+
closeInternal("iframe");
|
|
347
341
|
return;
|
|
348
342
|
}
|
|
349
343
|
onErrorRef.current?.({ message: event.data.message });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/utils/getEnvironmentBaseUrl.ts","../src/internal/useBrokerSignupIntegrationBase.tsx","../src/components/BrokerSignupModal.tsx","../src/utils/normalizeSignupPath.ts","../src/utils/buildSignupUrl.ts","../src/utils/isValidIframeMessage.ts","../src/useBrokerSignupIntegration.tsx"],"sourcesContent":["import type { BrokerSignupEnvironment, BrokerSignupModalOptions } from './types';\n\nexport const DEFAULT_SIGNUP_PATH = '/integration/signup';\n\nexport const ENVIRONMENT_BASE_URLS: Record<BrokerSignupEnvironment, string> = {\n develop: 'https://broker.tongoapp.io',\n production: 'https://broker.gettongo.com',\n};\n\nexport const DEFAULT_MODAL_OPTIONS: Required<\n Pick<\n BrokerSignupModalOptions,\n | 'width'\n | 'height'\n | 'zIndex'\n | 'closeOnOverlayClick'\n | 'closeOnEscape'\n | 'iframeTitle'\n >\n> = {\n width: 1120,\n height: 880,\n zIndex: 1000,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n iframeTitle: 'Tongo broker signup',\n};\n","import { ENVIRONMENT_BASE_URLS } from '../constants';\nimport type { BrokerSignupEnvironment } from '../types';\n\nexport function getEnvironmentBaseUrl(environment: BrokerSignupEnvironment): string {\n return ENVIRONMENT_BASE_URLS[environment];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nimport { BrokerSignupModal } from '../components/BrokerSignupModal';\nimport { DEFAULT_MODAL_OPTIONS, DEFAULT_SIGNUP_PATH } from '../constants';\nimport type {\n BrokerSignupCloseReason,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\nimport { buildSignupUrlFromConfig } from '../utils/buildSignupUrl';\nimport { isValidIframeMessage } from '../utils/isValidIframeMessage';\n\nexport interface UseBrokerSignupIntegrationBaseOptions {\n baseUrl: string;\n signupPath?: string;\n modal?: BrokerSignupModalOptions;\n onSuccess?: () => void;\n onError?: (event: BrokerSignupErrorEvent) => void;\n onClose?: (reason: Exclude<BrokerSignupCloseReason, 'success'>) => void;\n}\n\nlet bodyScrollLockCount = 0;\nlet initialBodyOverflow = '';\n\nfunction lockBodyScroll() {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (bodyScrollLockCount === 0) {\n initialBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n bodyScrollLockCount += 1;\n}\n\nfunction unlockBodyScroll() {\n if (typeof document === 'undefined' || bodyScrollLockCount === 0) {\n return;\n }\n\n bodyScrollLockCount -= 1;\n\n if (bodyScrollLockCount === 0) {\n document.body.style.overflow = initialBodyOverflow;\n }\n}\n\nfunction resolveModalOptions(\n modalOptions?: BrokerSignupModalOptions,\n): ResolvedBrokerSignupModalOptions {\n return {\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n };\n}\n\nexport function useBrokerSignupIntegrationBase({\n baseUrl,\n signupPath = DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationBaseOptions): BrokerSignupIntegrationControls {\n const [isOpen, setIsOpen] = useState(false);\n const [iframeSrc, setIframeSrc] = useState<string | null>(null);\n\n const rootRef = useRef<Root | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeElementRef = useRef<HTMLElement | null>(null);\n const isOpenRef = useRef(isOpen);\n const scrollLockedRef = useRef(false);\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n const onCloseRef = useRef(onClose);\n\n isOpenRef.current = isOpen;\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n onCloseRef.current = onClose;\n\n const resolvedModalOptions = useMemo(() => resolveModalOptions(modal), [modal]);\n\n const teardownModalRoot = useCallback(() => {\n const root = rootRef.current;\n const container = containerRef.current;\n\n rootRef.current = null;\n containerRef.current = null;\n\n if (!root || !container) {\n return;\n }\n\n queueMicrotask(() => {\n root.unmount();\n container.remove();\n });\n }, []);\n\n const restoreFocus = useCallback(() => {\n activeElementRef.current?.focus();\n activeElementRef.current = null;\n }, []);\n\n const closeInternal = useCallback(\n (reason: BrokerSignupCloseReason, notifyOnClose: boolean) => {\n if (!isOpenRef.current) {\n return;\n }\n\n setIsOpen(false);\n setIframeSrc(null);\n\n if (notifyOnClose && reason !== 'success') {\n onCloseRef.current?.(reason);\n }\n },\n [],\n );\n\n const close = useCallback(\n (reason: Exclude<BrokerSignupCloseReason, 'success'> = 'api') => {\n closeInternal(reason, true);\n },\n [closeInternal],\n );\n\n const open = useCallback(\n (signupToken: string) => {\n if (typeof signupToken !== 'string') {\n throw new Error('signupToken is required');\n }\n\n const normalizedSignupToken = signupToken.trim();\n\n if (normalizedSignupToken === '') {\n throw new Error('signupToken is required');\n }\n\n if (typeof document !== 'undefined' && !activeElementRef.current) {\n activeElementRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n\n setIframeSrc(\n buildSignupUrlFromConfig(baseUrl, signupPath, normalizedSignupToken),\n );\n setIsOpen(true);\n },\n [baseUrl, signupPath],\n );\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (!isOpen || !iframeSrc) {\n rootRef.current?.render(null);\n return;\n }\n\n if (!containerRef.current) {\n containerRef.current = document.createElement('div');\n containerRef.current.dataset.brokerSignupIntegration = 'true';\n document.body.appendChild(containerRef.current);\n rootRef.current = createRoot(containerRef.current);\n }\n\n rootRef.current?.render(\n <BrokerSignupModal\n iframeSrc={iframeSrc}\n modalOptions={resolvedModalOptions}\n onRequestClose={close}\n />,\n );\n }, [close, iframeSrc, isOpen, resolvedModalOptions]);\n\n useEffect(() => {\n if (isOpen && !scrollLockedRef.current) {\n lockBodyScroll();\n scrollLockedRef.current = true;\n return;\n }\n\n if (!isOpen && scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n restoreFocus();\n }\n }, [isOpen, restoreFocus]);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !isOpen || !iframeSrc) {\n return;\n }\n\n const expectedOrigin = new URL(iframeSrc).origin;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== expectedOrigin || !isValidIframeMessage(event.data)) {\n return;\n }\n\n if (event.data.event === 'SUCCESS') {\n closeInternal('success', false);\n onSuccessRef.current?.();\n return;\n }\n\n if (event.data.event === 'CLOSE') {\n closeInternal('iframe', true);\n return;\n }\n\n onErrorRef.current?.({ message: event.data.message });\n };\n\n window.addEventListener('message', handleMessage);\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [closeInternal, iframeSrc, isOpen]);\n\n useEffect(() => {\n return () => {\n if (scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n }\n\n teardownModalRoot();\n restoreFocus();\n };\n }, [restoreFocus, teardownModalRoot]);\n\n return {\n open,\n close,\n isOpen,\n };\n}\n","import { useEffect, useRef } from 'react';\n\nimport type {\n BrokerSignupCloseReason,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\n\ninterface BrokerSignupModalProps {\n iframeSrc: string;\n modalOptions: ResolvedBrokerSignupModalOptions;\n onRequestClose: (reason: Exclude<BrokerSignupCloseReason, 'success'>) => void;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function BrokerSignupModal({\n iframeSrc,\n modalOptions,\n onRequestClose,\n}: BrokerSignupModalProps) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n dialogRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!modalOptions.closeOnEscape) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onRequestClose('escape');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [modalOptions.closeOnEscape, onRequestClose]);\n\n return (\n <div\n className={modalOptions.overlayClassName}\n data-testid=\"broker-signup-overlay\"\n onClick={(event) => {\n if (\n modalOptions.closeOnOverlayClick &&\n event.target === event.currentTarget\n ) {\n onRequestClose('overlay');\n }\n }}\n style={{\n alignItems: 'center',\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n display: 'flex',\n inset: 0,\n justifyContent: 'center',\n padding: 'clamp(12px, 3vw, 24px)',\n position: 'fixed',\n zIndex: modalOptions.zIndex,\n }}\n >\n <div\n aria-label={modalOptions.iframeTitle}\n aria-modal=\"true\"\n className={modalOptions.className}\n data-testid=\"broker-signup-dialog\"\n ref={dialogRef}\n role=\"dialog\"\n style={{\n backgroundColor: '#ffffff',\n borderRadius: 'clamp(16px, 2vw, 20px)',\n boxShadow: '0 24px 80px rgba(15, 23, 42, 0.22)',\n display: 'flex',\n flexDirection: 'column',\n height: `min(${toCssSize(modalOptions.height)}, calc(100vh - 48px))`,\n maxHeight: 'calc(100vh - 48px)',\n maxWidth: 'calc(100vw - 48px)',\n overflow: 'hidden',\n position: 'relative',\n width: `min(${toCssSize(modalOptions.width)}, calc(100vw - 48px))`,\n }}\n tabIndex={-1}\n >\n <iframe\n src={iframeSrc}\n style={{\n backgroundColor: '#ffffff',\n border: 0,\n display: 'block',\n flex: 1,\n height: '100%',\n width: '100%',\n }}\n title={modalOptions.iframeTitle}\n />\n </div>\n </div>\n );\n}\n","import { DEFAULT_SIGNUP_PATH } from '../constants';\n\nexport function normalizeSignupPath(signupPath: string = DEFAULT_SIGNUP_PATH): string {\n if (typeof signupPath !== 'string') {\n throw new Error('signupPath must be a pathname');\n }\n\n if (signupPath.includes('://')) {\n throw new Error('signupPath must not be a full URL');\n }\n\n if (signupPath.includes('?') || signupPath.includes('#')) {\n throw new Error('signupPath must not include query params or hash');\n }\n\n const trimmedPath = signupPath.trim();\n\n if (trimmedPath === '') {\n return '/';\n }\n\n if (trimmedPath === '/') {\n return '/';\n }\n\n return trimmedPath.startsWith('/') ? trimmedPath : `/${trimmedPath}`;\n}\n","import type { BrokerSignupEnvironment } from '../types';\nimport { DEFAULT_SIGNUP_PATH } from '../constants';\nimport { getEnvironmentBaseUrl } from './getEnvironmentBaseUrl';\nimport { normalizeSignupPath } from './normalizeSignupPath';\n\nfunction parseBaseUrl(baseUrl: string): URL {\n if (typeof baseUrl !== 'string' || baseUrl.trim() === '') {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n if (url.search || url.hash) {\n throw new Error('baseUrl must not include search params or hash');\n }\n\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('baseUrl must not include a pathname');\n }\n\n return url;\n}\n\nexport function getBaseUrlOrigin(baseUrl: string): string {\n return parseBaseUrl(baseUrl).origin;\n}\n\nexport function buildSignupUrlFromConfig(\n baseUrl: string,\n signupPath: string = DEFAULT_SIGNUP_PATH,\n signupToken: string,\n): string {\n const url = new URL(normalizeSignupPath(signupPath), getBaseUrlOrigin(baseUrl));\n url.searchParams.set('signupToken', signupToken);\n return url.toString();\n}\n\nexport function buildSignupUrl(\n environment: BrokerSignupEnvironment,\n signupToken: string,\n): string {\n return buildSignupUrlFromConfig(\n getEnvironmentBaseUrl(environment),\n DEFAULT_SIGNUP_PATH,\n signupToken,\n );\n}\n","import type { BrokerSignupIframeMessage } from '../types';\n\nexport function isValidIframeMessage(\n payload: unknown,\n): payload is BrokerSignupIframeMessage {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n\n if (!('event' in payload)) {\n return false;\n }\n\n if (payload.event === 'SUCCESS') {\n return true;\n }\n\n if (payload.event === 'CLOSE') {\n return true;\n }\n\n if (payload.event === 'ERROR') {\n return 'message' in payload && typeof payload.message === 'string';\n }\n\n return false;\n}\n","import { getEnvironmentBaseUrl } from './utils/getEnvironmentBaseUrl';\nimport { DEFAULT_SIGNUP_PATH } from './constants';\nimport { useBrokerSignupIntegrationBase } from './internal/useBrokerSignupIntegrationBase';\nimport type {\n BrokerSignupIntegrationControls,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n\nexport function useBrokerSignupIntegration({\n environment,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationOptions): BrokerSignupIntegrationControls {\n return useBrokerSignupIntegrationBase({\n baseUrl: getEnvironmentBaseUrl(environment),\n signupPath: DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n });\n}\n"],"mappings":"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","names":["useEffect","useRef","jsx","useRef","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/utils/getEnvironmentBaseUrl.ts","../src/internal/useBrokerSignupIntegrationBase.tsx","../src/components/BrokerSignupModal.tsx","../src/utils/normalizeSignupPath.ts","../src/utils/buildSignupUrl.ts","../src/utils/isValidIframeMessage.ts","../src/useBrokerSignupIntegration.tsx"],"sourcesContent":["import type { BrokerSignupEnvironment, BrokerSignupModalOptions } from './types';\n\nexport const DEFAULT_SIGNUP_PATH = '/integration/signup/index.html';\n\nexport const ENVIRONMENT_BASE_URLS: Record<BrokerSignupEnvironment, string> = {\n develop: 'https://broker.tongoapp.io',\n production: 'https://broker.gettongo.com',\n};\n\nexport const DEFAULT_MODAL_OPTIONS: Required<\n Pick<\n BrokerSignupModalOptions,\n | 'width'\n | 'height'\n | 'zIndex'\n | 'closeOnOverlayClick'\n | 'closeOnEscape'\n | 'iframeTitle'\n >\n> = {\n width: 1120,\n height: 880,\n zIndex: 1000,\n closeOnOverlayClick: true,\n closeOnEscape: true,\n iframeTitle: 'Tongo broker signup',\n};\n","import { ENVIRONMENT_BASE_URLS } from '../constants';\nimport type { BrokerSignupEnvironment } from '../types';\n\nexport function getEnvironmentBaseUrl(environment: BrokerSignupEnvironment): string {\n return ENVIRONMENT_BASE_URLS[environment];\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\n\nimport { BrokerSignupModal } from '../components/BrokerSignupModal';\nimport { DEFAULT_MODAL_OPTIONS, DEFAULT_SIGNUP_PATH } from '../constants';\nimport type {\n BrokerSignupCloseReason,\n BrokerSignupErrorEvent,\n BrokerSignupIntegrationControls,\n BrokerSignupModalOptions,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\nimport { buildSignupUrlFromConfig } from '../utils/buildSignupUrl';\nimport { isValidIframeMessage } from '../utils/isValidIframeMessage';\n\nexport interface UseBrokerSignupIntegrationBaseOptions {\n baseUrl: string;\n signupPath?: string;\n modal?: BrokerSignupModalOptions;\n onSuccess?: () => void;\n onError?: (event: BrokerSignupErrorEvent) => void;\n onClose?: (reason: BrokerSignupCloseReason) => void;\n}\n\nlet bodyScrollLockCount = 0;\nlet initialBodyOverflow = '';\n\nfunction lockBodyScroll() {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (bodyScrollLockCount === 0) {\n initialBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n }\n\n bodyScrollLockCount += 1;\n}\n\nfunction unlockBodyScroll() {\n if (typeof document === 'undefined' || bodyScrollLockCount === 0) {\n return;\n }\n\n bodyScrollLockCount -= 1;\n\n if (bodyScrollLockCount === 0) {\n document.body.style.overflow = initialBodyOverflow;\n }\n}\n\nfunction resolveModalOptions(\n modalOptions?: BrokerSignupModalOptions,\n): ResolvedBrokerSignupModalOptions {\n return {\n ...DEFAULT_MODAL_OPTIONS,\n ...modalOptions,\n };\n}\n\nexport function useBrokerSignupIntegrationBase({\n baseUrl,\n signupPath = DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationBaseOptions): BrokerSignupIntegrationControls {\n const [isOpen, setIsOpen] = useState(false);\n const [iframeSrc, setIframeSrc] = useState<string | null>(null);\n\n const rootRef = useRef<Root | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const activeElementRef = useRef<HTMLElement | null>(null);\n const isOpenRef = useRef(isOpen);\n const scrollLockedRef = useRef(false);\n const onSuccessRef = useRef(onSuccess);\n const onErrorRef = useRef(onError);\n const onCloseRef = useRef(onClose);\n\n isOpenRef.current = isOpen;\n onSuccessRef.current = onSuccess;\n onErrorRef.current = onError;\n onCloseRef.current = onClose;\n\n const resolvedModalOptions = useMemo(() => resolveModalOptions(modal), [modal]);\n\n const teardownModalRoot = useCallback(() => {\n const root = rootRef.current;\n const container = containerRef.current;\n\n rootRef.current = null;\n containerRef.current = null;\n\n if (!root || !container) {\n return;\n }\n\n queueMicrotask(() => {\n root.unmount();\n container.remove();\n });\n }, []);\n\n const restoreFocus = useCallback(() => {\n activeElementRef.current?.focus();\n activeElementRef.current = null;\n }, []);\n\n const closeInternal = useCallback((reason: BrokerSignupCloseReason) => {\n if (!isOpenRef.current) {\n return;\n }\n\n setIsOpen(false);\n setIframeSrc(null);\n onCloseRef.current?.(reason);\n }, []);\n\n const close = useCallback(\n (reason: BrokerSignupCloseReason = 'api') => {\n closeInternal(reason);\n },\n [closeInternal],\n );\n\n const open = useCallback(\n (signupToken: string) => {\n if (typeof signupToken !== 'string') {\n throw new Error('signupToken is required');\n }\n\n const normalizedSignupToken = signupToken.trim();\n\n if (normalizedSignupToken === '') {\n throw new Error('signupToken is required');\n }\n\n if (typeof document !== 'undefined' && !activeElementRef.current) {\n activeElementRef.current =\n document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n\n setIframeSrc(\n buildSignupUrlFromConfig(baseUrl, signupPath, normalizedSignupToken),\n );\n setIsOpen(true);\n },\n [baseUrl, signupPath],\n );\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return;\n }\n\n if (!isOpen || !iframeSrc) {\n rootRef.current?.render(null);\n return;\n }\n\n if (!containerRef.current) {\n containerRef.current = document.createElement('div');\n containerRef.current.dataset.brokerSignupIntegration = 'true';\n document.body.appendChild(containerRef.current);\n rootRef.current = createRoot(containerRef.current);\n }\n\n rootRef.current?.render(\n <BrokerSignupModal\n iframeSrc={iframeSrc}\n modalOptions={resolvedModalOptions}\n onRequestClose={close}\n />,\n );\n }, [close, iframeSrc, isOpen, resolvedModalOptions]);\n\n useEffect(() => {\n if (isOpen && !scrollLockedRef.current) {\n lockBodyScroll();\n scrollLockedRef.current = true;\n return;\n }\n\n if (!isOpen && scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n restoreFocus();\n }\n }, [isOpen, restoreFocus]);\n\n useEffect(() => {\n if (typeof window === 'undefined' || !isOpen || !iframeSrc) {\n return;\n }\n\n const expectedOrigin = new URL(iframeSrc).origin;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== expectedOrigin || !isValidIframeMessage(event.data)) {\n return;\n }\n\n if (event.data.event === 'SUCCESS') {\n onSuccessRef.current?.();\n return;\n }\n\n if (event.data.event === 'CLOSE') {\n closeInternal('iframe');\n return;\n }\n\n onErrorRef.current?.({ message: event.data.message });\n };\n\n window.addEventListener('message', handleMessage);\n return () => {\n window.removeEventListener('message', handleMessage);\n };\n }, [closeInternal, iframeSrc, isOpen]);\n\n useEffect(() => {\n return () => {\n if (scrollLockedRef.current) {\n unlockBodyScroll();\n scrollLockedRef.current = false;\n }\n\n teardownModalRoot();\n restoreFocus();\n };\n }, [restoreFocus, teardownModalRoot]);\n\n return {\n open,\n close,\n isOpen,\n };\n}\n","import { useEffect, useRef } from 'react';\n\nimport type {\n BrokerSignupCloseReason,\n ResolvedBrokerSignupModalOptions,\n} from '../types';\n\ninterface BrokerSignupModalProps {\n iframeSrc: string;\n modalOptions: ResolvedBrokerSignupModalOptions;\n onRequestClose: (reason: BrokerSignupCloseReason) => void;\n}\n\nfunction toCssSize(value: number | string): string {\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function BrokerSignupModal({\n iframeSrc,\n modalOptions,\n onRequestClose,\n}: BrokerSignupModalProps) {\n const dialogRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n dialogRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!modalOptions.closeOnEscape) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n onRequestClose('escape');\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [modalOptions.closeOnEscape, onRequestClose]);\n\n return (\n <div\n className={modalOptions.overlayClassName}\n data-testid=\"broker-signup-overlay\"\n onClick={(event) => {\n if (\n modalOptions.closeOnOverlayClick &&\n event.target === event.currentTarget\n ) {\n onRequestClose('overlay');\n }\n }}\n style={{\n alignItems: 'center',\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n display: 'flex',\n inset: 0,\n justifyContent: 'center',\n padding: 'clamp(12px, 3vw, 24px)',\n position: 'fixed',\n zIndex: modalOptions.zIndex,\n }}\n >\n <div\n aria-label={modalOptions.iframeTitle}\n aria-modal=\"true\"\n className={modalOptions.className}\n data-testid=\"broker-signup-dialog\"\n ref={dialogRef}\n role=\"dialog\"\n style={{\n backgroundColor: '#ffffff',\n borderRadius: 'clamp(16px, 2vw, 20px)',\n boxShadow: '0 24px 80px rgba(15, 23, 42, 0.22)',\n display: 'flex',\n flexDirection: 'column',\n height: `min(${toCssSize(modalOptions.height)}, calc(100vh - 48px))`,\n maxHeight: 'calc(100vh - 48px)',\n maxWidth: 'calc(100vw - 48px)',\n overflow: 'hidden',\n position: 'relative',\n width: `min(${toCssSize(modalOptions.width)}, calc(100vw - 48px))`,\n }}\n tabIndex={-1}\n >\n <iframe\n src={iframeSrc}\n style={{\n backgroundColor: '#ffffff',\n border: 0,\n display: 'block',\n flex: 1,\n height: '100%',\n width: '100%',\n }}\n title={modalOptions.iframeTitle}\n />\n </div>\n </div>\n );\n}\n","import { DEFAULT_SIGNUP_PATH } from '../constants';\n\nexport function normalizeSignupPath(signupPath: string = DEFAULT_SIGNUP_PATH): string {\n if (typeof signupPath !== 'string') {\n throw new Error('signupPath must be a pathname');\n }\n\n if (signupPath.includes('://')) {\n throw new Error('signupPath must not be a full URL');\n }\n\n if (signupPath.includes('?') || signupPath.includes('#')) {\n throw new Error('signupPath must not include query params or hash');\n }\n\n const trimmedPath = signupPath.trim();\n\n if (trimmedPath === '') {\n return '/';\n }\n\n if (trimmedPath === '/') {\n return '/';\n }\n\n return trimmedPath.startsWith('/') ? trimmedPath : `/${trimmedPath}`;\n}\n","import type { BrokerSignupEnvironment } from '../types';\nimport { DEFAULT_SIGNUP_PATH } from '../constants';\nimport { getEnvironmentBaseUrl } from './getEnvironmentBaseUrl';\nimport { normalizeSignupPath } from './normalizeSignupPath';\n\nfunction parseBaseUrl(baseUrl: string): URL {\n if (typeof baseUrl !== 'string' || baseUrl.trim() === '') {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n let url: URL;\n\n try {\n url = new URL(baseUrl);\n } catch {\n throw new Error('baseUrl must be a valid absolute URL');\n }\n\n if (url.search || url.hash) {\n throw new Error('baseUrl must not include search params or hash');\n }\n\n if (url.pathname !== '/' && url.pathname !== '') {\n throw new Error('baseUrl must not include a pathname');\n }\n\n return url;\n}\n\nexport function getBaseUrlOrigin(baseUrl: string): string {\n return parseBaseUrl(baseUrl).origin;\n}\n\nexport function buildSignupUrlFromConfig(\n baseUrl: string,\n signupPath: string = DEFAULT_SIGNUP_PATH,\n signupToken: string,\n): string {\n const url = new URL(normalizeSignupPath(signupPath), getBaseUrlOrigin(baseUrl));\n url.searchParams.set('signupToken', signupToken);\n return url.toString();\n}\n\nexport function buildSignupUrl(\n environment: BrokerSignupEnvironment,\n signupToken: string,\n): string {\n return buildSignupUrlFromConfig(\n getEnvironmentBaseUrl(environment),\n DEFAULT_SIGNUP_PATH,\n signupToken,\n );\n}\n","import type { BrokerSignupIframeMessage } from '../types';\n\nexport function isValidIframeMessage(\n payload: unknown,\n): payload is BrokerSignupIframeMessage {\n if (!payload || typeof payload !== 'object') {\n return false;\n }\n\n if (!('event' in payload)) {\n return false;\n }\n\n if (payload.event === 'SUCCESS') {\n return true;\n }\n\n if (payload.event === 'CLOSE') {\n return true;\n }\n\n if (payload.event === 'ERROR') {\n return 'message' in payload && typeof payload.message === 'string';\n }\n\n return false;\n}\n","import { getEnvironmentBaseUrl } from './utils/getEnvironmentBaseUrl';\nimport { DEFAULT_SIGNUP_PATH } from './constants';\nimport { useBrokerSignupIntegrationBase } from './internal/useBrokerSignupIntegrationBase';\nimport type {\n BrokerSignupIntegrationControls,\n UseBrokerSignupIntegrationOptions,\n} from './types';\n\nexport function useBrokerSignupIntegration({\n environment,\n modal,\n onSuccess,\n onError,\n onClose,\n}: UseBrokerSignupIntegrationOptions): BrokerSignupIntegrationControls {\n return useBrokerSignupIntegrationBase({\n baseUrl: getEnvironmentBaseUrl(environment),\n signupPath: DEFAULT_SIGNUP_PATH,\n modal,\n onSuccess,\n onError,\n onClose,\n });\n}\n"],"mappings":"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","names":["useEffect","useRef","jsx","useRef","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tongo_fintech/react-broker-signup-integration",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "React library for broker signup with Tongo using signup tokens.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -31,11 +31,16 @@
|
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"scripts": {
|
|
33
33
|
"build": "tsup",
|
|
34
|
+
"build:consumer-sandbox": "npm --prefix consumer-sandbox run build",
|
|
34
35
|
"build:playground": "vite build --config vite.playground.config.ts",
|
|
36
|
+
"dev:consumer-sandbox": "npm --prefix consumer-sandbox run dev",
|
|
35
37
|
"dev:playground": "vite --config vite.playground.config.ts",
|
|
38
|
+
"install:consumer-sandbox": "npm install --prefix consumer-sandbox",
|
|
36
39
|
"lint": "eslint .",
|
|
40
|
+
"preview:consumer-sandbox": "npm --prefix consumer-sandbox run preview",
|
|
37
41
|
"preview:playground": "vite preview --config vite.playground.config.ts",
|
|
38
42
|
"test": "vitest run test",
|
|
43
|
+
"test:coverage": "vitest run test --coverage.enabled",
|
|
39
44
|
"typecheck": "tsc --noEmit"
|
|
40
45
|
},
|
|
41
46
|
"peerDependencies": {
|
|
@@ -48,6 +53,7 @@
|
|
|
48
53
|
"@testing-library/react": "^16.1.0",
|
|
49
54
|
"@types/react": "^19.0.2",
|
|
50
55
|
"@types/react-dom": "^19.0.2",
|
|
56
|
+
"@vitest/coverage-v8": "^2.1.9",
|
|
51
57
|
"eslint": "^9.18.0",
|
|
52
58
|
"eslint-plugin-react-hooks": "^5.1.0",
|
|
53
59
|
"globals": "^15.14.0",
|