@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 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 without successful signup
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
- (reason, notifyOnClose) => {
284
- if (!isOpenRef.current) {
285
- return;
286
- }
287
- setIsOpen(false);
288
- setIframeSrc(null);
289
- if (notifyOnClose && reason !== "success") {
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, true);
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", true);
366
+ closeInternal("iframe");
373
367
  return;
374
368
  }
375
369
  onErrorRef.current?.({ message: event.data.message });
@@ -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' | 'success';
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: Exclude<BrokerSignupCloseReason, 'success'>) => void;
21
+ onClose?: (reason: BrokerSignupCloseReason) => void;
22
22
  }
23
23
  interface BrokerSignupIntegrationControls {
24
24
  open: (signupToken: string) => void;
25
- close: (reason?: Exclude<BrokerSignupCloseReason, 'success'>) => void;
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' | 'success';
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: Exclude<BrokerSignupCloseReason, 'success'>) => void;
21
+ onClose?: (reason: BrokerSignupCloseReason) => void;
22
22
  }
23
23
  interface BrokerSignupIntegrationControls {
24
24
  open: (signupToken: string) => void;
25
- close: (reason?: Exclude<BrokerSignupCloseReason, 'success'>) => void;
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
- (reason, notifyOnClose) => {
258
- if (!isOpenRef.current) {
259
- return;
260
- }
261
- setIsOpen(false);
262
- setIframeSrc(null);
263
- if (notifyOnClose && reason !== "success") {
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, true);
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", true);
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.0",
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",