@crossmint/client-sdk-react-ui 1.0.1-alpha.6 → 1.1.0-alpha.1
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/LICENSE +201 -201
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +21 -25
- package/src/components/CrossmintCollectionView.test.tsx +34 -0
- package/src/{CrossmintNFTCollectionView.tsx → components/CrossmintNFTCollectionView.tsx} +1 -3
- package/src/components/CrossmintNFTDetail.test.tsx +36 -0
- package/src/{CrossmintNFTDetail.tsx → components/CrossmintNFTDetail.tsx} +1 -3
- package/src/components/embed/CrossmintPaymentElement.test.tsx +78 -0
- package/src/components/embed/EmbeddedCheckoutIFrame.tsx +70 -0
- package/src/components/embed/crypto/CryptoEmbeddedCheckout.tsx +11 -0
- package/src/components/embed/crypto/CryptoEmbeddedCheckoutIFrame.tsx +88 -0
- package/src/components/embed/fiat/FiatEmbeddedCheckoutIFrame.tsx +10 -0
- package/src/{CrossmintPaymentElement.tsx → components/embed/fiat/FiatPaymentElement_OLD.tsx} +8 -8
- package/src/components/embed/index.tsx +19 -0
- package/src/components/hosted/CrossmintPayButton.test.tsx +187 -0
- package/src/{CrossmintPayButton.tsx → components/hosted/CrossmintPayButton.tsx} +14 -5
- package/src/components/hosted/index.ts +1 -0
- package/src/{styles/index.ts → components/hosted/styles.ts} +1 -0
- package/src/components/index.ts +5 -0
- package/src/consts/version.ts +1 -0
- package/src/{useEnvironment.ts → hooks/useEnvironment.ts} +10 -10
- package/src/index.ts +4 -6
- package/lib/index.cjs +0 -1
- package/lib/index.d.ts +0 -18
- package/lib/index.js +0 -1
- package/src/types.ts +0 -8
- package/src/version.ts +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/CrossmintNFTCollectionView.tsx","../src/consts/version.ts","../src/components/CrossmintNFTDetail.tsx","../src/components/embed/index.tsx","../src/components/embed/crypto/CryptoEmbeddedCheckout.tsx","../src/components/embed/crypto/CryptoEmbeddedCheckoutIFrame.tsx","../src/components/embed/EmbeddedCheckoutIFrame.tsx","../src/components/embed/fiat/FiatPaymentElement_OLD.tsx","../src/components/hosted/CrossmintPayButton.tsx","../src/hooks/useEnvironment.ts","../src/components/hosted/styles.ts","../src/index.ts"],"sourcesContent":["import {\n NFTCollectionViewProps,\n assertValidNFTCollectionViewProps,\n getNFTCollectionViewSrc,\n} from \"@crossmint/client-sdk-base\";\n\nimport { LIB_VERSION } from \"../consts/version\";\n\nexport function CrossmintNFTCollectionView(props: NFTCollectionViewProps) {\n assertValidNFTCollectionViewProps(props);\n\n const src = getNFTCollectionViewSrc(props, LIB_VERSION);\n\n return (\n <iframe\n src={src}\n width=\"100%\"\n height=\"100%\"\n style={{\n flexGrow: \"1\",\n border: \"none\",\n margin: \"0\",\n padding: \"0\",\n }}\n role=\"nft-collection-view\"\n />\n );\n}\n","export const LIB_VERSION = \"1.1.0-alpha.1\";\n","import { NFTDetailProps, assertValidValidateNFTDetailProps, getNFTDetailSrc } from \"@crossmint/client-sdk-base\";\n\nimport { LIB_VERSION } from \"../consts/version\";\n\nexport function CrossmintNFTDetail(props: NFTDetailProps) {\n assertValidValidateNFTDetailProps(props);\n\n const src = getNFTDetailSrc(props, LIB_VERSION);\n\n return (\n <iframe\n src={src}\n width=\"100%\"\n height=\"100%\"\n style={{\n flexGrow: \"1\",\n border: \"none\",\n margin: \"0\",\n padding: \"0\",\n }}\n role=\"nft-details\"\n />\n );\n}\n","import {\n CrossmintEmbeddedCheckoutProps,\n isCryptoEmbeddedCheckoutProps,\n isFiatEmbeddedCheckoutProps,\n} from \"@crossmint/client-sdk-base\";\n\nimport { CrossmintCryptoEmbeddedCheckout } from \"./crypto/CryptoEmbeddedCheckout\";\nimport { CrossmintFiatPaymentElement_OLD } from \"./fiat/FiatPaymentElement_OLD\";\n\n// TODO: Rename to CrossmintEmbeddedCheckout\nexport function CrossmintPaymentElement(props: CrossmintEmbeddedCheckoutProps) {\n if (isFiatEmbeddedCheckoutProps(props)) {\n return <CrossmintFiatPaymentElement_OLD {...props} />;\n }\n if (isCryptoEmbeddedCheckoutProps(props)) {\n return <CrossmintCryptoEmbeddedCheckout {...props} />;\n }\n throw new Error(\"Unsupported: Fiat is the only supported payment method.\");\n}\n","import { CryptoEmbeddedCheckoutProps, isCryptoEmbeddedCheckoutPropsWithSigner } from \"@crossmint/client-sdk-base\";\n\nimport CryptoEmbeddedCheckoutIFrame from \"./CryptoEmbeddedCheckoutIFrame\";\n\nexport function CrossmintCryptoEmbeddedCheckout(props: CryptoEmbeddedCheckoutProps) {\n if (!isCryptoEmbeddedCheckoutPropsWithSigner(props)) {\n throw new Error(\"Invalid parameters: signer is required in versions < 2.0.0\");\n }\n\n return <CryptoEmbeddedCheckoutIFrame {...props} />;\n}\n","import bs58 from \"bs58\";\nimport { useEffect } from \"react\";\n\nimport {\n CryptoEmbeddedCheckoutPropsWithSigner,\n ETHEmbeddedCheckoutSigner,\n IncomingInternalEvent,\n IncomingInternalEvents,\n OutgoingInternalEvents,\n SOLEmbeddedCheckoutSigner,\n crossmintIFrameService,\n embeddedCheckoutPropsToUpdatableParamsPayload,\n} from \"@crossmint/client-sdk-base\";\n\nimport CrossmintEmbeddedCheckoutIFrame from \"../EmbeddedCheckoutIFrame\";\n\nexport default function CryptoEmbeddedCheckoutIFrame(props: CryptoEmbeddedCheckoutPropsWithSigner) {\n const { emitInternalEvent } = crossmintIFrameService(props);\n\n const { signer, paymentMethod } = props;\n\n function onInternalEvent(event: IncomingInternalEvent) {\n const { type, payload } = event;\n\n if (type === IncomingInternalEvents.CRYPTO_PAYMENT_INCOMING_TRANSACTION) {\n const { serializedTransaction } = payload;\n console.log(\"[Crossmint] Received incoming transaction\", serializedTransaction);\n handleIncomingTransaction(serializedTransaction);\n }\n }\n\n async function handleIncomingTransaction(serializedTransaction: string) {\n try {\n let txId: string;\n switch (paymentMethod) {\n case \"SOL\":\n txId = await handleSOLTransaction(signer, serializedTransaction);\n break;\n case \"ETH\":\n txId = await handleETHTransaction(signer, serializedTransaction);\n break;\n default:\n throw new Error(`Unsupported payment method ${paymentMethod}`);\n }\n\n console.log(\"[Crossmint] Signed and sent transaction\", txId);\n emitInternalEvent({\n type: OutgoingInternalEvents.CRYPTO_PAYMENT_USER_ACCEPTED,\n payload: {\n txId,\n },\n });\n } catch (e) {\n console.error(\"[Crossmint] Failed to sign and send transaction\", e);\n emitInternalEvent({\n type: OutgoingInternalEvents.CRYPTO_PAYMENT_USER_REJECTED,\n payload: {},\n });\n }\n }\n\n async function handleSOLTransaction(signer: SOLEmbeddedCheckoutSigner, serializedTransaction: string) {\n // @ts-ignore - Error becasue we dont use 'module' field in tsconfig, which is expected because we use tsup to compile\n const { Transaction } = await import(\"@solana/web3.js\");\n const transaction = Transaction.from(bs58.decode(serializedTransaction));\n console.log(\"[Crossmint] Deserialized SOL transaction\", transaction);\n\n return await signer.signAndSendTransaction(transaction);\n }\n\n async function handleETHTransaction(signer: ETHEmbeddedCheckoutSigner, serializedTransaction: string) {\n // @ts-ignore - Error becasue we dont use 'module' field in tsconfig, which is expected because we use tsup to compile\n const { parse: parseTransaction } = await import(\"@ethersproject/transactions\");\n const transaction = parseTransaction(serializedTransaction);\n console.log(\"[Crossmint] Deserialized ETH transaction\", transaction);\n\n return await signer.signAndSendTransaction(transaction);\n }\n\n useEffect(() => {\n emitInternalEvent({\n type: \"params-update\",\n payload: embeddedCheckoutPropsToUpdatableParamsPayload(props),\n });\n }, [props.signer, props.recipient, props.mintConfig, props.locale, props.whPassThroughArgs]);\n\n return <CrossmintEmbeddedCheckoutIFrame onInternalEvent={onInternalEvent} {...props} />;\n}\n","import { useEffect, useState } from \"react\";\n\nimport { IncomingInternalEvent, IncomingInternalEvents, crossmintIFrameService } from \"@crossmint/client-sdk-base\";\nimport { CrossmintEmbeddedCheckoutProps } from \"@crossmint/client-sdk-base\";\n\ntype CrossmintEmbeddedCheckoutIFrameProps = CrossmintEmbeddedCheckoutProps & {\n onInternalEvent?: (event: IncomingInternalEvent) => void;\n};\n\nexport default function CrossmintEmbeddedCheckoutIFrame({\n onInternalEvent,\n ...props\n}: CrossmintEmbeddedCheckoutIFrameProps) {\n const { getUrl, listenToEvents, listenToInternalEvents, emitInternalEvent } = crossmintIFrameService(props);\n\n const [height, setHeight] = useState(0);\n const [url] = useState(getUrl(props));\n\n // Public events\n useEffect(() => {\n const clearListener = listenToEvents((event) => {\n props.onEvent?.(event.data);\n });\n\n return () => {\n clearListener();\n };\n }, []);\n\n // Internal events\n useEffect(() => {\n const clearListener = listenToInternalEvents((event) => {\n const { type, payload } = event.data;\n\n if (type === IncomingInternalEvents.UI_HEIGHT_CHANGED) {\n setHeight(payload.height);\n }\n\n onInternalEvent?.(event.data);\n });\n\n return () => {\n clearListener();\n };\n }, []);\n\n // TODO: Emit updatable parameters\n\n return (\n <iframe\n src={url}\n id=\"crossmint-embedded-checkout.iframe\"\n role=\"crossmint-embedded-checkout.iframe\"\n allow=\"payment *\"\n style={{\n border: \"none !important\",\n padding: \"0px !important\",\n width: \"100% !important\",\n minWidth: \"100% !important\",\n overflow: \"hidden !important\",\n display: \"block !important\",\n userSelect: \"none\",\n transform: \"translate(0px) !important\",\n opacity: \"1\",\n transition: \"ease 0s, opacity 0.4s ease 0.1s\",\n height: `${height}px`,\n }}\n />\n );\n}\n","import { useEffect, useState } from \"react\";\n\nimport type { FiatEmbeddedCheckoutProps } from \"@crossmint/client-sdk-base\";\nimport { crossmintPaymentService_OLD, crossmintUiService_OLD } from \"@crossmint/client-sdk-base\";\n\nexport function CrossmintFiatPaymentElement_OLD(props: FiatEmbeddedCheckoutProps) {\n const [height, setHeight] = useState(0);\n const { getIframeUrl, listenToEvents, emitQueryParams } = crossmintPaymentService_OLD(props);\n const { listenToEvents: listenToUiEvents } = crossmintUiService_OLD({ environment: props.environment });\n const [url] = useState(getIframeUrl());\n\n useEffect(() => {\n const clearListener = listenToEvents((event) => props.onEvent?.(event.data));\n\n return () => {\n if (clearListener) {\n clearListener();\n }\n };\n }, []);\n\n useEffect(() => {\n const clearListener = listenToUiEvents((event: MessageEvent<any>) => {\n const { type, payload } = event.data;\n\n switch (type) {\n case \"ui:height.changed\":\n setHeight(payload.height);\n break;\n default:\n return;\n }\n });\n\n return () => {\n if (clearListener) {\n clearListener();\n }\n };\n }, []);\n\n useEffect(() => {\n emitQueryParams({\n recipient: props.recipient,\n mintConfig: props.mintConfig,\n locale: props.locale,\n whPassThroughArgs: props.whPassThroughArgs,\n });\n }, [props.recipient, props.mintConfig, props.locale, props.whPassThroughArgs]);\n\n return (\n <iframe\n src={url}\n id=\"crossmint-embedded-checkout.iframe\"\n role=\"crossmint-embedded-checkout.iframe\"\n allow=\"payment *\"\n style={{\n border: \"none !important\",\n padding: \"0px !important\",\n width: \"100% !important\",\n minWidth: \"100% !important\",\n overflow: \"hidden !important\",\n display: \"block !important\",\n userSelect: \"none\",\n transform: \"translate(0px) !important\",\n opacity: \"1\",\n transition: \"ease 0s, opacity 0.4s ease 0.1s\",\n height: `${height}px`,\n }}\n ></iframe>\n );\n}\n","import { CSSProperties, MouseEvent, useMemo } from \"react\";\nimport { useState } from \"react\";\n\nimport {\n CrossmintPayButtonProps,\n clientNames,\n crossmintModalService,\n crossmintPayButtonService,\n} from \"@crossmint/client-sdk-base\";\n\nimport { LIB_VERSION } from \"../../consts/version\";\nimport useEnvironment from \"../../hooks/useEnvironment\";\nimport { formatProps, useStyles } from \"./styles\";\n\nexport type CrossmintPayButtonReactProps = CrossmintPayButtonProps & {\n onClick?: (e: MouseEvent<HTMLButtonElement>) => void;\n style?: CSSProperties;\n};\n\nexport function CrossmintPayButton(buttonProps: CrossmintPayButtonReactProps) {\n const {\n className,\n disabled,\n onClick,\n style,\n tabIndex,\n theme = \"dark\",\n mintTo,\n emailTo,\n listingId,\n auctionId,\n showOverlay = true,\n mintConfig,\n whPassThroughArgs,\n environment,\n paymentMethod,\n preferredSigninMethod,\n dismissOverlayOnClick,\n prepay,\n locale = \"en-US\",\n currency = \"usd\",\n successCallbackURL = \"\",\n failureCallbackURL = \"\",\n loginEmail = \"\",\n projectId,\n getButtonText,\n ...props\n } = buttonProps;\n\n const collectionId = \"clientId\" in props ? props.clientId : props.collectionId;\n\n const [connecting, setConnecting] = useState(false);\n const { isServerSideRendering } = useEnvironment();\n\n const { connect } = crossmintModalService({\n clientId: collectionId,\n projectId,\n showOverlay,\n dismissOverlayOnClick,\n setConnecting,\n libVersion: LIB_VERSION,\n environment,\n clientName: clientNames.reactUi,\n locale,\n currency,\n successCallbackURL,\n failureCallbackURL,\n loginEmail,\n });\n\n const { getButtonText: getButtonTextInternal, handleClick } = crossmintPayButtonService({\n onClick,\n connecting,\n paymentMethod,\n locale,\n });\n\n const _handleClick = (event: MouseEvent<HTMLButtonElement>) =>\n handleClick(event, () => {\n connect(\n mintConfig,\n mintTo,\n emailTo,\n listingId,\n whPassThroughArgs,\n paymentMethod,\n preferredSigninMethod,\n prepay\n );\n });\n\n const classes = useStyles(formatProps(theme));\n\n const content = useMemo(() => {\n return (\n <span className={classes.crossmintParagraph} role=\"button-paragraph\">\n {getButtonText != null\n ? getButtonText(connecting, paymentMethod || \"fiat\")\n : getButtonTextInternal(connecting)}\n </span>\n );\n }, [connecting, getButtonText, paymentMethod]);\n\n return (\n <>\n {!isServerSideRendering && (\n <button\n className={`${classes.crossmintButton} ${className || \"\"}`}\n disabled={disabled}\n onClick={_handleClick}\n style={{ ...style }}\n tabIndex={tabIndex}\n >\n <img\n className={classes.crossmintImg}\n src=\"https://www.crossmint.io/assets/crossmint/logo.svg\"\n alt=\"Crossmint logo\"\n />\n {content}\n </button>\n )}\n </>\n );\n}\n","import { useEffect, useState } from \"react\";\r\n\r\nexport default function useEnvironment() {\r\n const [isServerSideRendering, setIsServerSideRendering] = useState(true);\r\n useEffect(() => {\r\n setIsServerSideRendering(false);\r\n }, []);\r\n\r\n return { isServerSideRendering };\r\n}\r\n","import { createUseStyles } from \"react-jss\";\n\nconst DARK_BG = \"#1e1e1e\";\n\ninterface CustomStylingProps {\n buttonBgColor?: string;\n paragraphColor?: string;\n}\n\nconst themeIsLight = (theme: string) => theme === \"light\";\n\nexport const formatProps = (theme: string): CustomStylingProps => ({\n buttonBgColor: themeIsLight(theme) ? \"white\" : DARK_BG,\n paragraphColor: themeIsLight(theme) ? \"black\" : \"white\",\n});\n\nexport const useStyles = createUseStyles({\n \"@global\": {\n \"@import\":\n \"url('https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap')\",\n },\n crossmintButton: {\n display: \"flex\",\n \"flex-direction\": \"row\",\n \"align-items\": \"center\",\n padding: \"0.875rem 0.875rem\",\n \"font-weight\": \"900\",\n transition: \"opacity ease-in-out 0.25s\",\n \"border-radius\": \"0.5rem\",\n \"font-family\": `\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif`,\n outline: \"none\",\n border: \"none\",\n \"box-shadow\": \"0px 8px 15px rgba(0, 0, 0, 0.1)\",\n \"justify-content\": \"center\",\n background: ({ buttonBgColor }: CustomStylingProps) => buttonBgColor,\n\n \"&:hover:enabled\": {\n opacity: \"0.6\",\n cursor: \"pointer\",\n },\n },\n crossmintImg: {\n width: \"21px\",\n height: \"21px\",\n \"margin-right\": \"0.875rem\",\n },\n crossmintParagraph: {\n color: ({ paragraphColor }: CustomStylingProps) => paragraphColor,\n margin: \"0\",\n },\n});\n","export * from \"./components\";\n\nexport { CrossmintEvents, useCrossmintEvents } from \"@crossmint/client-sdk-base\";\nexport type { CrossmintEvent, CrossmintEventMap } from \"@crossmint/client-sdk-base\";\n"],"mappings":"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","names":["assertValidNFTCollectionViewProps","getNFTCollectionViewSrc","LIB_VERSION","jsx","CrossmintNFTCollectionView","props","assertValidNFTCollectionViewProps","src","getNFTCollectionViewSrc","LIB_VERSION","assertValidValidateNFTDetailProps","getNFTDetailSrc","jsx","CrossmintNFTDetail","props","assertValidValidateNFTDetailProps","src","getNFTDetailSrc","LIB_VERSION","isCryptoEmbeddedCheckoutProps","isFiatEmbeddedCheckoutProps","isCryptoEmbeddedCheckoutPropsWithSigner","bs58","useEffect","IncomingInternalEvents","OutgoingInternalEvents","crossmintIFrameService","embeddedCheckoutPropsToUpdatableParamsPayload","useEffect","useState","IncomingInternalEvents","crossmintIFrameService","jsx","CrossmintEmbeddedCheckoutIFrame","_a","_b","onInternalEvent","props","__objRest","getUrl","listenToEvents","listenToInternalEvents","emitInternalEvent","crossmintIFrameService","height","setHeight","useState","url","useEffect","clearListener","event","type","payload","IncomingInternalEvents","jsx","CryptoEmbeddedCheckoutIFrame","props","emitInternalEvent","crossmintIFrameService","signer","paymentMethod","onInternalEvent","event","type","payload","IncomingInternalEvents","serializedTransaction","handleIncomingTransaction","__async","txId","handleSOLTransaction","handleETHTransaction","OutgoingInternalEvents","e","Transaction","transaction","bs58","parseTransaction","useEffect","embeddedCheckoutPropsToUpdatableParamsPayload","CrossmintEmbeddedCheckoutIFrame","__spreadValues","jsx","CrossmintCryptoEmbeddedCheckout","props","isCryptoEmbeddedCheckoutPropsWithSigner","CryptoEmbeddedCheckoutIFrame","__spreadValues","useEffect","useState","crossmintPaymentService_OLD","crossmintUiService_OLD","jsx","CrossmintFiatPaymentElement_OLD","props","height","setHeight","getIframeUrl","listenToEvents","emitQueryParams","listenToUiEvents","url","clearListener","event","_a","type","payload","jsx","CrossmintPaymentElement","props","isFiatEmbeddedCheckoutProps","CrossmintFiatPaymentElement_OLD","__spreadValues","isCryptoEmbeddedCheckoutProps","CrossmintCryptoEmbeddedCheckout","useMemo","useState","clientNames","crossmintModalService","crossmintPayButtonService","useEffect","useState","useEnvironment","isServerSideRendering","setIsServerSideRendering","createUseStyles","DARK_BG","themeIsLight","theme","formatProps","useStyles","buttonBgColor","paragraphColor","Fragment","jsx","jsxs","CrossmintPayButton","buttonProps","_a","className","disabled","onClick","style","tabIndex","theme","mintTo","emailTo","listingId","auctionId","showOverlay","mintConfig","whPassThroughArgs","environment","paymentMethod","preferredSigninMethod","dismissOverlayOnClick","prepay","locale","currency","successCallbackURL","failureCallbackURL","loginEmail","projectId","getButtonText","props","__objRest","collectionId","connecting","setConnecting","useState","isServerSideRendering","useEnvironment","connect","crossmintModalService","LIB_VERSION","clientNames","getButtonTextInternal","handleClick","crossmintPayButtonService","_handleClick","event","classes","useStyles","formatProps","content","useMemo","__spreadValues","CrossmintEvents","useCrossmintEvents"]}
|
package/package.json
CHANGED
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crossmint/client-sdk-react-ui",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0-alpha.1",
|
|
4
4
|
"author": "Paella Labs Inc",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
|
-
"repository": "https://github.com/
|
|
6
|
+
"repository": "https://github.com/Crossmint/crossmint-client-sdk",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"sideEffects": false,
|
|
9
|
-
"main": "
|
|
10
|
-
"module": "
|
|
11
|
-
"types": "
|
|
9
|
+
"main": "./dist/index.cjs",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
12
|
"exports": {
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
"require": "./lib/index.cjs"
|
|
16
|
-
}
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"require": "./dist/index.cjs"
|
|
17
15
|
},
|
|
18
16
|
"files": [
|
|
19
|
-
"
|
|
17
|
+
"dist",
|
|
20
18
|
"src",
|
|
21
19
|
"LICENSE"
|
|
22
20
|
],
|
|
@@ -24,31 +22,29 @@
|
|
|
24
22
|
"access": "public"
|
|
25
23
|
},
|
|
26
24
|
"scripts": {
|
|
27
|
-
"create-version-file": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
|
|
25
|
+
"create-version-file": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/consts/version.ts",
|
|
28
26
|
"version": "yarn run create-version-file && git add .",
|
|
29
27
|
"prebuild": "yarn run create-version-file",
|
|
30
|
-
"clean": "shx rm -rf
|
|
31
|
-
"build": "yarn clean && tsup src/index.ts --external react,react-dom --format esm,cjs --outDir ./
|
|
28
|
+
"clean": "shx rm -rf dist/*",
|
|
29
|
+
"build": "yarn clean && tsup src/index.ts --external react,react-dom --format esm,cjs --outDir ./dist --minify --dts --sourcemap",
|
|
32
30
|
"test": "jest"
|
|
33
31
|
},
|
|
34
32
|
"dependencies": {
|
|
35
|
-
"@crossmint/client-sdk-base": "
|
|
36
|
-
"
|
|
37
|
-
"
|
|
33
|
+
"@crossmint/client-sdk-base": "1.1.0-alpha.1",
|
|
34
|
+
"@ethersproject/transactions": "5.7.0",
|
|
35
|
+
"@solana/web3.js": "1.78.5",
|
|
36
|
+
"bs58": "5.0.0",
|
|
37
|
+
"react-jss": "10.10.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"react": ">=17.0.2",
|
|
41
41
|
"react-dom": ">=17.0.2"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@
|
|
45
|
-
"@types/
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"jest": "^27.5.1",
|
|
49
|
-
"node-fetch": "^3.2.0",
|
|
50
|
-
"ts-jest": "^27.1.3",
|
|
51
|
-
"ts-node-dev": "^1.1.8"
|
|
44
|
+
"@types/react": "18.2.21",
|
|
45
|
+
"@types/react-dom": "18.2.7",
|
|
46
|
+
"react": "18.2.0",
|
|
47
|
+
"react-dom": "18.2.0"
|
|
52
48
|
},
|
|
53
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "78dd9eb5b5b762c164be3103965741f533c75f12"
|
|
54
50
|
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
|
|
4
|
+
import { CrossmintNFTCollectionView } from "./CrossmintNFTCollectionView";
|
|
5
|
+
|
|
6
|
+
const wallets = [{ chain: "solana", publicKey: "12345" }];
|
|
7
|
+
|
|
8
|
+
describe("when only passing mandatory fields", () => {
|
|
9
|
+
test("should add them to the iframe query params", () => {
|
|
10
|
+
render(<CrossmintNFTCollectionView wallets={wallets} />);
|
|
11
|
+
const iframe = screen.getByRole("nft-collection-view");
|
|
12
|
+
const src = iframe.getAttribute("src");
|
|
13
|
+
expect(src).toContain("wallets=%5B%7B%22chain%22%3A%22solana%22%2C%22publicKey%22%3A%2212345%22%7D%5D");
|
|
14
|
+
expect(src).toContain("clientVersion=");
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe("when not setting any environment", () => {
|
|
19
|
+
test("should default to production", () => {
|
|
20
|
+
render(<CrossmintNFTCollectionView wallets={wallets} />);
|
|
21
|
+
const iframe = screen.getByRole("nft-collection-view");
|
|
22
|
+
const src = iframe.getAttribute("src");
|
|
23
|
+
expect(src).toContain("https://www.crossmint.com/");
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe("when setting the environment to staging", () => {
|
|
28
|
+
test("should use the staging url", () => {
|
|
29
|
+
render(<CrossmintNFTCollectionView wallets={wallets} environment="staging" />);
|
|
30
|
+
const iframe = screen.getByRole("nft-collection-view");
|
|
31
|
+
const src = iframe.getAttribute("src");
|
|
32
|
+
expect(src).toContain("https://staging.crossmint.com/");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
1
|
import {
|
|
4
2
|
NFTCollectionViewProps,
|
|
5
3
|
assertValidNFTCollectionViewProps,
|
|
6
4
|
getNFTCollectionViewSrc,
|
|
7
5
|
} from "@crossmint/client-sdk-base";
|
|
8
6
|
|
|
9
|
-
import { LIB_VERSION } from "
|
|
7
|
+
import { LIB_VERSION } from "../consts/version";
|
|
10
8
|
|
|
11
9
|
export function CrossmintNFTCollectionView(props: NFTCollectionViewProps) {
|
|
12
10
|
assertValidNFTCollectionViewProps(props);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
|
|
4
|
+
import { NFT } from "@crossmint/client-sdk-base";
|
|
5
|
+
|
|
6
|
+
import { CrossmintNFTDetail } from "./CrossmintNFTDetail";
|
|
7
|
+
|
|
8
|
+
const nft: NFT = { chain: "ethereum", contractAddress: "0x12345", tokenId: "12" };
|
|
9
|
+
|
|
10
|
+
describe("when only passing mandatory fields", () => {
|
|
11
|
+
test("should add them to the iframe query params", () => {
|
|
12
|
+
render(<CrossmintNFTDetail nft={nft} />);
|
|
13
|
+
const iframe = screen.getByRole("nft-details");
|
|
14
|
+
const src = iframe.getAttribute("src");
|
|
15
|
+
expect(src).toContain("/sdk/wallets/tokens/ethereum:0x12345:12");
|
|
16
|
+
expect(src).toContain("clientVersion=");
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe("when not setting any environment", () => {
|
|
21
|
+
test("should default to production", () => {
|
|
22
|
+
render(<CrossmintNFTDetail nft={nft} />);
|
|
23
|
+
const iframe = screen.getByRole("nft-details");
|
|
24
|
+
const src = iframe.getAttribute("src");
|
|
25
|
+
expect(src).toContain("https://www.crossmint.com/");
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe("when setting the environment to staging", () => {
|
|
30
|
+
test("should use the staging url", () => {
|
|
31
|
+
render(<CrossmintNFTDetail nft={nft} environment="staging" />);
|
|
32
|
+
const iframe = screen.getByRole("nft-details");
|
|
33
|
+
const src = iframe.getAttribute("src");
|
|
34
|
+
expect(src).toContain("https://staging.crossmint.com/");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import * as React from "react";
|
|
2
|
-
|
|
3
1
|
import { NFTDetailProps, assertValidValidateNFTDetailProps, getNFTDetailSrc } from "@crossmint/client-sdk-base";
|
|
4
2
|
|
|
5
|
-
import { LIB_VERSION } from "
|
|
3
|
+
import { LIB_VERSION } from "../consts/version";
|
|
6
4
|
|
|
7
5
|
export function CrossmintNFTDetail(props: NFTDetailProps) {
|
|
8
6
|
assertValidValidateNFTDetailProps(props);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
|
|
4
|
+
import { CrossmintEvents } from "@crossmint/client-sdk-base";
|
|
5
|
+
|
|
6
|
+
import { CrossmintPaymentElement } from ".";
|
|
7
|
+
|
|
8
|
+
const embeddedCheckoutProps = {
|
|
9
|
+
clientId: "db218e78-d042-4761-83af-3c4e5e6659dd",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe("CrossmintPaymentElement", () => {
|
|
13
|
+
it("renders an iframe with the correct props", () => {
|
|
14
|
+
render(<CrossmintPaymentElement {...embeddedCheckoutProps} />);
|
|
15
|
+
const iframe = screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
16
|
+
|
|
17
|
+
expect(iframe).toHaveAttribute("src");
|
|
18
|
+
expect(iframe).toHaveAttribute("id", "crossmint-embedded-checkout.iframe");
|
|
19
|
+
expect(iframe).toHaveStyle({
|
|
20
|
+
padding: "0px !important",
|
|
21
|
+
width: "100% !important",
|
|
22
|
+
minWidth: "100% !important",
|
|
23
|
+
overflow: "hidden !important",
|
|
24
|
+
display: "block !important",
|
|
25
|
+
userSelect: "none",
|
|
26
|
+
transform: "translate(0px) !important",
|
|
27
|
+
opacity: "1",
|
|
28
|
+
transition: "ease 0s, opacity 0.4s ease 0.1s",
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("calls the onEvent prop when a CrossmintEvents is received", () => {
|
|
33
|
+
const onEvent = jest.fn();
|
|
34
|
+
render(<CrossmintPaymentElement {...embeddedCheckoutProps} onEvent={onEvent} environment="" />);
|
|
35
|
+
screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
36
|
+
|
|
37
|
+
// Simulate receiving a CrossmintEvents message
|
|
38
|
+
const eventData = { type: CrossmintEvents.QUOTE_STATUS_CHANGED, payload: {} };
|
|
39
|
+
const event = new MessageEvent("message", { data: eventData, origin: "https://www.crossmint.com" });
|
|
40
|
+
window.dispatchEvent(event);
|
|
41
|
+
|
|
42
|
+
expect(onEvent).toHaveBeenCalledWith(eventData);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("does not call the onEvent prop when a different origin than the environment is received in the event", () => {
|
|
46
|
+
const onEvent = jest.fn();
|
|
47
|
+
render(<CrossmintPaymentElement {...embeddedCheckoutProps} onEvent={onEvent} environment="" />);
|
|
48
|
+
screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
49
|
+
|
|
50
|
+
// Simulate receiving a CrossmintEvents message
|
|
51
|
+
const eventData = { type: CrossmintEvents.QUOTE_STATUS_CHANGED, payload: {} };
|
|
52
|
+
const event = new MessageEvent("message", { data: eventData, origin: "http://hacker.com" });
|
|
53
|
+
window.dispatchEvent(event);
|
|
54
|
+
|
|
55
|
+
expect(onEvent).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should add the `whPassThroughArgs` prop when passed", async () => {
|
|
59
|
+
render(<CrossmintPaymentElement {...embeddedCheckoutProps} whPassThroughArgs={{ hello: "hi" }} />);
|
|
60
|
+
const iframe = screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
61
|
+
|
|
62
|
+
expect(iframe.getAttribute("src")).toContain("whPassThroughArgs=%7B%22hello%22%3A%22hi%22%7D");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it("should add the clientId when passing the collectionId prop", () => {
|
|
66
|
+
render(<CrossmintPaymentElement collectionId={embeddedCheckoutProps.clientId} />);
|
|
67
|
+
const iframe = screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
68
|
+
|
|
69
|
+
expect(iframe.getAttribute("src")).toContain(`clientId=${embeddedCheckoutProps.clientId}`);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should add projectId when added", () => {
|
|
73
|
+
render(<CrossmintPaymentElement collectionId={embeddedCheckoutProps.clientId} projectId="123" />);
|
|
74
|
+
const iframe = screen.getByRole("crossmint-embedded-checkout.iframe");
|
|
75
|
+
|
|
76
|
+
expect(iframe.getAttribute("src")).toContain("projectId=123");
|
|
77
|
+
});
|
|
78
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
|
|
3
|
+
import { IncomingInternalEvent, IncomingInternalEvents, crossmintIFrameService } from "@crossmint/client-sdk-base";
|
|
4
|
+
import { CrossmintEmbeddedCheckoutProps } from "@crossmint/client-sdk-base";
|
|
5
|
+
|
|
6
|
+
type CrossmintEmbeddedCheckoutIFrameProps = CrossmintEmbeddedCheckoutProps & {
|
|
7
|
+
onInternalEvent?: (event: IncomingInternalEvent) => void;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default function CrossmintEmbeddedCheckoutIFrame({
|
|
11
|
+
onInternalEvent,
|
|
12
|
+
...props
|
|
13
|
+
}: CrossmintEmbeddedCheckoutIFrameProps) {
|
|
14
|
+
const { getUrl, listenToEvents, listenToInternalEvents, emitInternalEvent } = crossmintIFrameService(props);
|
|
15
|
+
|
|
16
|
+
const [height, setHeight] = useState(0);
|
|
17
|
+
const [url] = useState(getUrl(props));
|
|
18
|
+
|
|
19
|
+
// Public events
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
const clearListener = listenToEvents((event) => {
|
|
22
|
+
props.onEvent?.(event.data);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return () => {
|
|
26
|
+
clearListener();
|
|
27
|
+
};
|
|
28
|
+
}, []);
|
|
29
|
+
|
|
30
|
+
// Internal events
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const clearListener = listenToInternalEvents((event) => {
|
|
33
|
+
const { type, payload } = event.data;
|
|
34
|
+
|
|
35
|
+
if (type === IncomingInternalEvents.UI_HEIGHT_CHANGED) {
|
|
36
|
+
setHeight(payload.height);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
onInternalEvent?.(event.data);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return () => {
|
|
43
|
+
clearListener();
|
|
44
|
+
};
|
|
45
|
+
}, []);
|
|
46
|
+
|
|
47
|
+
// TODO: Emit updatable parameters
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<iframe
|
|
51
|
+
src={url}
|
|
52
|
+
id="crossmint-embedded-checkout.iframe"
|
|
53
|
+
role="crossmint-embedded-checkout.iframe"
|
|
54
|
+
allow="payment *"
|
|
55
|
+
style={{
|
|
56
|
+
border: "none !important",
|
|
57
|
+
padding: "0px !important",
|
|
58
|
+
width: "100% !important",
|
|
59
|
+
minWidth: "100% !important",
|
|
60
|
+
overflow: "hidden !important",
|
|
61
|
+
display: "block !important",
|
|
62
|
+
userSelect: "none",
|
|
63
|
+
transform: "translate(0px) !important",
|
|
64
|
+
opacity: "1",
|
|
65
|
+
transition: "ease 0s, opacity 0.4s ease 0.1s",
|
|
66
|
+
height: `${height}px`,
|
|
67
|
+
}}
|
|
68
|
+
/>
|
|
69
|
+
);
|
|
70
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CryptoEmbeddedCheckoutProps, isCryptoEmbeddedCheckoutPropsWithSigner } from "@crossmint/client-sdk-base";
|
|
2
|
+
|
|
3
|
+
import CryptoEmbeddedCheckoutIFrame from "./CryptoEmbeddedCheckoutIFrame";
|
|
4
|
+
|
|
5
|
+
export function CrossmintCryptoEmbeddedCheckout(props: CryptoEmbeddedCheckoutProps) {
|
|
6
|
+
if (!isCryptoEmbeddedCheckoutPropsWithSigner(props)) {
|
|
7
|
+
throw new Error("Invalid parameters: signer is required in versions < 2.0.0");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return <CryptoEmbeddedCheckoutIFrame {...props} />;
|
|
11
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import bs58 from "bs58";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
CryptoEmbeddedCheckoutPropsWithSigner,
|
|
6
|
+
ETHEmbeddedCheckoutSigner,
|
|
7
|
+
IncomingInternalEvent,
|
|
8
|
+
IncomingInternalEvents,
|
|
9
|
+
OutgoingInternalEvents,
|
|
10
|
+
SOLEmbeddedCheckoutSigner,
|
|
11
|
+
crossmintIFrameService,
|
|
12
|
+
embeddedCheckoutPropsToUpdatableParamsPayload,
|
|
13
|
+
} from "@crossmint/client-sdk-base";
|
|
14
|
+
|
|
15
|
+
import CrossmintEmbeddedCheckoutIFrame from "../EmbeddedCheckoutIFrame";
|
|
16
|
+
|
|
17
|
+
export default function CryptoEmbeddedCheckoutIFrame(props: CryptoEmbeddedCheckoutPropsWithSigner) {
|
|
18
|
+
const { emitInternalEvent } = crossmintIFrameService(props);
|
|
19
|
+
|
|
20
|
+
const { signer, paymentMethod } = props;
|
|
21
|
+
|
|
22
|
+
function onInternalEvent(event: IncomingInternalEvent) {
|
|
23
|
+
const { type, payload } = event;
|
|
24
|
+
|
|
25
|
+
if (type === IncomingInternalEvents.CRYPTO_PAYMENT_INCOMING_TRANSACTION) {
|
|
26
|
+
const { serializedTransaction } = payload;
|
|
27
|
+
console.log("[Crossmint] Received incoming transaction", serializedTransaction);
|
|
28
|
+
handleIncomingTransaction(serializedTransaction);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function handleIncomingTransaction(serializedTransaction: string) {
|
|
33
|
+
try {
|
|
34
|
+
let txId: string;
|
|
35
|
+
switch (paymentMethod) {
|
|
36
|
+
case "SOL":
|
|
37
|
+
txId = await handleSOLTransaction(signer, serializedTransaction);
|
|
38
|
+
break;
|
|
39
|
+
case "ETH":
|
|
40
|
+
txId = await handleETHTransaction(signer, serializedTransaction);
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
throw new Error(`Unsupported payment method ${paymentMethod}`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
console.log("[Crossmint] Signed and sent transaction", txId);
|
|
47
|
+
emitInternalEvent({
|
|
48
|
+
type: OutgoingInternalEvents.CRYPTO_PAYMENT_USER_ACCEPTED,
|
|
49
|
+
payload: {
|
|
50
|
+
txId,
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.error("[Crossmint] Failed to sign and send transaction", e);
|
|
55
|
+
emitInternalEvent({
|
|
56
|
+
type: OutgoingInternalEvents.CRYPTO_PAYMENT_USER_REJECTED,
|
|
57
|
+
payload: {},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function handleSOLTransaction(signer: SOLEmbeddedCheckoutSigner, serializedTransaction: string) {
|
|
63
|
+
// @ts-ignore - Error becasue we dont use 'module' field in tsconfig, which is expected because we use tsup to compile
|
|
64
|
+
const { Transaction } = await import("@solana/web3.js");
|
|
65
|
+
const transaction = Transaction.from(bs58.decode(serializedTransaction));
|
|
66
|
+
console.log("[Crossmint] Deserialized SOL transaction", transaction);
|
|
67
|
+
|
|
68
|
+
return await signer.signAndSendTransaction(transaction);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function handleETHTransaction(signer: ETHEmbeddedCheckoutSigner, serializedTransaction: string) {
|
|
72
|
+
// @ts-ignore - Error becasue we dont use 'module' field in tsconfig, which is expected because we use tsup to compile
|
|
73
|
+
const { parse: parseTransaction } = await import("@ethersproject/transactions");
|
|
74
|
+
const transaction = parseTransaction(serializedTransaction);
|
|
75
|
+
console.log("[Crossmint] Deserialized ETH transaction", transaction);
|
|
76
|
+
|
|
77
|
+
return await signer.signAndSendTransaction(transaction);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
emitInternalEvent({
|
|
82
|
+
type: "params-update",
|
|
83
|
+
payload: embeddedCheckoutPropsToUpdatableParamsPayload(props),
|
|
84
|
+
});
|
|
85
|
+
}, [props.signer, props.recipient, props.mintConfig, props.locale, props.whPassThroughArgs]);
|
|
86
|
+
|
|
87
|
+
return <CrossmintEmbeddedCheckoutIFrame onInternalEvent={onInternalEvent} {...props} />;
|
|
88
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FiatEmbeddedCheckoutProps } from "@crossmint/client-sdk-base";
|
|
2
|
+
|
|
3
|
+
import CrossmintEmbeddedCheckoutIFrame from "../EmbeddedCheckoutIFrame";
|
|
4
|
+
|
|
5
|
+
export default function FiatEmbeddedCheckoutIFrame(props: FiatEmbeddedCheckoutProps) {
|
|
6
|
+
throw new Error(
|
|
7
|
+
"Unsupported: This component should not be called yet, as its a placeholder for the v2 fiat checkout."
|
|
8
|
+
);
|
|
9
|
+
return <CrossmintEmbeddedCheckoutIFrame {...props} />;
|
|
10
|
+
}
|
package/src/{CrossmintPaymentElement.tsx → components/embed/fiat/FiatPaymentElement_OLD.tsx}
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
import {
|
|
3
|
+
import type { FiatEmbeddedCheckoutProps } from "@crossmint/client-sdk-base";
|
|
4
|
+
import { crossmintPaymentService_OLD, crossmintUiService_OLD } from "@crossmint/client-sdk-base";
|
|
5
5
|
|
|
6
|
-
export function
|
|
6
|
+
export function CrossmintFiatPaymentElement_OLD(props: FiatEmbeddedCheckoutProps) {
|
|
7
7
|
const [height, setHeight] = useState(0);
|
|
8
|
-
const { getIframeUrl, listenToEvents, emitQueryParams } =
|
|
9
|
-
const { listenToEvents: listenToUiEvents } =
|
|
8
|
+
const { getIframeUrl, listenToEvents, emitQueryParams } = crossmintPaymentService_OLD(props);
|
|
9
|
+
const { listenToEvents: listenToUiEvents } = crossmintUiService_OLD({ environment: props.environment });
|
|
10
10
|
const [url] = useState(getIframeUrl());
|
|
11
11
|
|
|
12
12
|
useEffect(() => {
|
|
@@ -51,8 +51,8 @@ export function CrossmintPaymentElement(props: PaymentElement) {
|
|
|
51
51
|
return (
|
|
52
52
|
<iframe
|
|
53
53
|
src={url}
|
|
54
|
-
id="
|
|
55
|
-
role="
|
|
54
|
+
id="crossmint-embedded-checkout.iframe"
|
|
55
|
+
role="crossmint-embedded-checkout.iframe"
|
|
56
56
|
allow="payment *"
|
|
57
57
|
style={{
|
|
58
58
|
border: "none !important",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CrossmintEmbeddedCheckoutProps,
|
|
3
|
+
isCryptoEmbeddedCheckoutProps,
|
|
4
|
+
isFiatEmbeddedCheckoutProps,
|
|
5
|
+
} from "@crossmint/client-sdk-base";
|
|
6
|
+
|
|
7
|
+
import { CrossmintCryptoEmbeddedCheckout } from "./crypto/CryptoEmbeddedCheckout";
|
|
8
|
+
import { CrossmintFiatPaymentElement_OLD } from "./fiat/FiatPaymentElement_OLD";
|
|
9
|
+
|
|
10
|
+
// TODO: Rename to CrossmintEmbeddedCheckout
|
|
11
|
+
export function CrossmintPaymentElement(props: CrossmintEmbeddedCheckoutProps) {
|
|
12
|
+
if (isFiatEmbeddedCheckoutProps(props)) {
|
|
13
|
+
return <CrossmintFiatPaymentElement_OLD {...props} />;
|
|
14
|
+
}
|
|
15
|
+
if (isCryptoEmbeddedCheckoutProps(props)) {
|
|
16
|
+
return <CrossmintCryptoEmbeddedCheckout {...props} />;
|
|
17
|
+
}
|
|
18
|
+
throw new Error("Unsupported: Fiat is the only supported payment method.");
|
|
19
|
+
}
|