@crossmint/client-sdk-react-ui 0.0.4
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 -0
- package/README.md +30 -0
- package/lib/cjs/CrossMintButton.d.ts +14 -0
- package/lib/cjs/CrossMintButton.js +55 -0
- package/lib/cjs/CrossMintButton.js.map +1 -0
- package/lib/cjs/CrossMintModal.d.ts +6 -0
- package/lib/cjs/CrossMintModal.js +55 -0
- package/lib/cjs/CrossMintModal.js.map +1 -0
- package/lib/cjs/CrossMintModalProvider.d.ts +6 -0
- package/lib/cjs/CrossMintModalProvider.js +48 -0
- package/lib/cjs/CrossMintModalProvider.js.map +1 -0
- package/lib/cjs/CrossMintPopupProvider.d.ts +6 -0
- package/lib/cjs/CrossMintPopupProvider.js +69 -0
- package/lib/cjs/CrossMintPopupProvider.js.map +1 -0
- package/lib/cjs/CrossMintProvider.d.ts +7 -0
- package/lib/cjs/CrossMintProvider.js +50 -0
- package/lib/cjs/CrossMintProvider.js.map +1 -0
- package/lib/cjs/index.d.ts +5 -0
- package/lib/cjs/index.js +18 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/useCrossMintModal.d.ts +7 -0
- package/lib/cjs/useCrossMintModal.js +10 -0
- package/lib/cjs/useCrossMintModal.js.map +1 -0
- package/lib/cjs/useCrossMintPopup.d.ts +8 -0
- package/lib/cjs/useCrossMintPopup.js +10 -0
- package/lib/cjs/useCrossMintPopup.js.map +1 -0
- package/lib/esm/CrossMintButton.d.ts +14 -0
- package/lib/esm/CrossMintButton.js +20 -0
- package/lib/esm/CrossMintButton.js.map +1 -0
- package/lib/esm/CrossMintModal.d.ts +6 -0
- package/lib/esm/CrossMintModal.js +32 -0
- package/lib/esm/CrossMintModal.js.map +1 -0
- package/lib/esm/CrossMintModalProvider.d.ts +6 -0
- package/lib/esm/CrossMintModalProvider.js +13 -0
- package/lib/esm/CrossMintModalProvider.js.map +1 -0
- package/lib/esm/CrossMintPopupProvider.d.ts +6 -0
- package/lib/esm/CrossMintPopupProvider.js +46 -0
- package/lib/esm/CrossMintPopupProvider.js.map +1 -0
- package/lib/esm/CrossMintProvider.d.ts +7 -0
- package/lib/esm/CrossMintProvider.js +15 -0
- package/lib/esm/CrossMintProvider.js.map +1 -0
- package/lib/esm/index.d.ts +5 -0
- package/lib/esm/index.js +6 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/package.json +3 -0
- package/lib/esm/useCrossMintModal.d.ts +7 -0
- package/lib/esm/useCrossMintModal.js +6 -0
- package/lib/esm/useCrossMintModal.js.map +1 -0
- package/lib/esm/useCrossMintPopup.d.ts +8 -0
- package/lib/esm/useCrossMintPopup.js +6 -0
- package/lib/esm/useCrossMintPopup.js.map +1 -0
- package/package.json +44 -0
- package/src/CrossMintButton.tsx +64 -0
- package/src/CrossMintModal.tsx +54 -0
- package/src/CrossMintModalProvider.tsx +24 -0
- package/src/CrossMintPopupProvider.tsx +88 -0
- package/src/CrossMintProvider.tsx +28 -0
- package/src/index.ts +5 -0
- package/src/useCrossMintModal.tsx +12 -0
- package/src/useCrossMintPopup.tsx +19 -0
- package/styles.css +118 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCrossMintModal.js","sourceRoot":"","sources":["../../src/useCrossMintModal.tsx"],"names":[],"mappings":";;;AAAA,iCAAkD;AAOrC,QAAA,qBAAqB,GAAG,IAAA,qBAAa,EAA6B,EAAgC,CAAC,CAAC;AAEjH,SAAgB,iBAAiB;IAC7B,OAAO,IAAA,kBAAU,EAAC,6BAAqB,CAAC,CAAC;AAC7C,CAAC;AAFD,8CAEC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface PopupContextState {
|
|
3
|
+
connecting: boolean;
|
|
4
|
+
connect: (candyMachineId: string, collectionTitle?: string, collectionDescription?: string, collectionPhoto?: string) => void;
|
|
5
|
+
popup: Window | null;
|
|
6
|
+
}
|
|
7
|
+
export declare const PopupContext: import("react").Context<PopupContextState>;
|
|
8
|
+
export declare function useCrossMintPopup(): PopupContextState;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useCrossMintPopup = exports.PopupContext = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
exports.PopupContext = (0, react_1.createContext)({});
|
|
6
|
+
function useCrossMintPopup() {
|
|
7
|
+
return (0, react_1.useContext)(exports.PopupContext);
|
|
8
|
+
}
|
|
9
|
+
exports.useCrossMintPopup = useCrossMintPopup;
|
|
10
|
+
//# sourceMappingURL=useCrossMintPopup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCrossMintPopup.js","sourceRoot":"","sources":["../../src/useCrossMintPopup.tsx"],"names":[],"mappings":";;;AAAA,iCAAkD;AAcrC,QAAA,YAAY,GAAG,IAAA,qBAAa,EAAoB,EAAuB,CAAC,CAAC;AAEtF,SAAgB,iBAAiB;IAC7B,OAAO,IAAA,kBAAU,EAAC,oBAAY,CAAC,CAAC;AACpC,CAAC;AAFD,8CAEC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CSSProperties, FC, MouseEvent } from "react";
|
|
2
|
+
export interface ButtonProps {
|
|
3
|
+
candyMachineId: string;
|
|
4
|
+
className?: string;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
7
|
+
style?: CSSProperties;
|
|
8
|
+
tabIndex?: number;
|
|
9
|
+
theme?: "light" | "dark";
|
|
10
|
+
collectionTitle?: string;
|
|
11
|
+
collectionDescription?: string;
|
|
12
|
+
collectionPhoto?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const CrossMintButton: FC<ButtonProps>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React, { useMemo, useCallback } from "react";
|
|
2
|
+
import { useCrossMintPopup } from "./useCrossMintPopup";
|
|
3
|
+
export const CrossMintButton = ({ candyMachineId, className, disabled, onClick, style, tabIndex, theme = "dark", collectionTitle, collectionDescription, collectionPhoto, ...props }) => {
|
|
4
|
+
const { connecting, connect } = useCrossMintPopup();
|
|
5
|
+
const handleClick = useCallback((event) => {
|
|
6
|
+
if (onClick)
|
|
7
|
+
onClick(event);
|
|
8
|
+
if (!event.defaultPrevented)
|
|
9
|
+
connect(candyMachineId, collectionTitle, collectionDescription, collectionPhoto);
|
|
10
|
+
}, [onClick]);
|
|
11
|
+
const content = useMemo(() => {
|
|
12
|
+
if (connecting)
|
|
13
|
+
return React.createElement("p", null, "Connecting ...");
|
|
14
|
+
return React.createElement("p", null, "Buy with credit card");
|
|
15
|
+
}, [connecting]);
|
|
16
|
+
return (React.createElement("button", { className: `client-sdk-button-trigger client-sdk-button-trigger-${theme}`, disabled: disabled, onClick: handleClick, style: { ...style }, tabIndex: tabIndex, ...props },
|
|
17
|
+
React.createElement("img", { className: "client-sdk-button-icon", src: "https://www.crossmint.io/assets/crossmint/logo.png", alt: "Crossmint logo" }),
|
|
18
|
+
content));
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=CrossMintButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossMintButton.js","sourceRoot":"","sources":["../../src/CrossMintButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAoD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACtG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAexD,MAAM,CAAC,MAAM,eAAe,GAAoB,CAAC,EAC7C,cAAc,EACd,SAAS,EACT,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,GAAG,MAAM,EACd,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,GAAG,KAAK,EACX,EAAE,EAAE;IACD,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAEpD,MAAM,WAAW,GAAyC,WAAW,CACjE,CAAC,KAAK,EAAE,EAAE;QACN,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,gBAAgB;YACvB,OAAO,CAAC,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,IAAI,UAAU;YAAE,OAAO,gDAAqB,CAAC;QAC7C,OAAO,sDAA2B,CAAC;IACvC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,CACH,gCACI,SAAS,EAAE,uDAAuD,KAAK,EAAE,EACzE,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EACnB,QAAQ,EAAE,QAAQ,KACd,KAAK;QAET,6BACI,SAAS,EAAC,wBAAwB,EAClC,GAAG,EAAC,oDAAoD,EACxD,GAAG,EAAC,gBAAgB,GACtB;QACD,OAAO,CACH,CACZ,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React, { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
+
import { createPortal } from "react-dom";
|
|
3
|
+
import { useCrossMintModal } from "./useCrossMintModal";
|
|
4
|
+
export const CrossMintModal = ({ className = "", container = "body" }) => {
|
|
5
|
+
const ref = useRef(null);
|
|
6
|
+
const { setVisible } = useCrossMintModal();
|
|
7
|
+
const [fadeIn, setFadeIn] = useState(false);
|
|
8
|
+
const [portal, setPortal] = useState(null);
|
|
9
|
+
const hideModal = useCallback(() => {
|
|
10
|
+
setFadeIn(false);
|
|
11
|
+
setTimeout(() => setVisible(false), 150);
|
|
12
|
+
}, [setFadeIn, setVisible]);
|
|
13
|
+
useLayoutEffect(() => {
|
|
14
|
+
// Get original overflow
|
|
15
|
+
const { overflow } = window.getComputedStyle(document.body);
|
|
16
|
+
// Hack to enable fade in animation after mount
|
|
17
|
+
setTimeout(() => setFadeIn(true), 0);
|
|
18
|
+
// Prevent scrolling on mount
|
|
19
|
+
document.body.style.overflow = "hidden";
|
|
20
|
+
return () => {
|
|
21
|
+
// Re-enable scrolling when component unmounts
|
|
22
|
+
document.body.style.overflow = overflow;
|
|
23
|
+
};
|
|
24
|
+
}, [hideModal]);
|
|
25
|
+
useLayoutEffect(() => setPortal(document.querySelector(container)), [setPortal, container]);
|
|
26
|
+
return (portal &&
|
|
27
|
+
createPortal(React.createElement("div", { "aria-modal": "true", className: `client-sdk-modal ${fadeIn && "client-sdk-modal-fade-in"} ${className}`, ref: ref },
|
|
28
|
+
React.createElement("div", { className: "client-sdk-modal-container" },
|
|
29
|
+
React.createElement("span", { className: "client-sdk-modal-loader" })),
|
|
30
|
+
React.createElement("div", { className: "client-sdk-modal-overlay" })), portal));
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=CrossMintModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossMintModal.js","sourceRoot":"","sources":["../../src/CrossMintModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAM,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAOxD,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,EAAE,SAAS,GAAG,EAAE,EAAE,SAAS,GAAG,MAAM,EAAE,EAAE,EAAE;IAC9F,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAE3C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiB,IAAI,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,SAAS,CAAC,KAAK,CAAC,CAAC;QACjB,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAE5B,eAAe,CAAC,GAAG,EAAE;QACjB,wBAAwB;QACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5D,+CAA+C;QAC/C,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,6BAA6B;QAC7B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAExC,OAAO,GAAG,EAAE;YACR,8CAA8C;YAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC5C,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,eAAe,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE5F,OAAO,CACH,MAAM;QACN,YAAY,CACR,2CACe,MAAM,EACjB,SAAS,EAAE,oBAAoB,MAAM,IAAI,0BAA0B,IAAI,SAAS,EAAE,EAClF,GAAG,EAAE,GAAG;YAER,6BAAK,SAAS,EAAC,4BAA4B;gBACvC,8BAAM,SAAS,EAAC,yBAAyB,GAAG,CAC1C;YACN,6BAAK,SAAS,EAAC,0BAA0B,GAAG,CAC1C,EACN,MAAM,CACT,CACJ,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FC, ReactNode } from "react";
|
|
2
|
+
import { CrossMintModalProps } from "./CrossMintModal";
|
|
3
|
+
export interface CrossMintModalProviderProps extends CrossMintModalProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare const CrossMintModalProvider: FC<CrossMintModalProviderProps>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { CrossMintModal } from "./CrossMintModal";
|
|
3
|
+
import { CrossMintModalContext } from "./useCrossMintModal";
|
|
4
|
+
export const CrossMintModalProvider = ({ children, ...props }) => {
|
|
5
|
+
const [visible, setVisible] = useState(false);
|
|
6
|
+
return (React.createElement(CrossMintModalContext.Provider, { value: {
|
|
7
|
+
visible,
|
|
8
|
+
setVisible,
|
|
9
|
+
} },
|
|
10
|
+
children,
|
|
11
|
+
visible && React.createElement(CrossMintModal, { ...props })));
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=CrossMintModalProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossMintModalProvider.js","sourceRoot":"","sources":["../../src/CrossMintModalProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAO5D,MAAM,CAAC,MAAM,sBAAsB,GAAoC,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAC9F,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,CACH,oBAAC,qBAAqB,CAAC,QAAQ,IAC3B,KAAK,EAAE;YACH,OAAO;YACP,UAAU;SACb;QAEA,QAAQ;QACR,OAAO,IAAI,oBAAC,cAAc,OAAK,KAAK,GAAI,CACZ,CACpC,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { useCrossMintModal } from ".";
|
|
3
|
+
import { PopupContext } from "./useCrossMintPopup";
|
|
4
|
+
const PROD_URL = "https://crossmint.io";
|
|
5
|
+
const DEV_URL = "http://localhost:3001";
|
|
6
|
+
export const CrossMintPopupProvider = ({ development, children }) => {
|
|
7
|
+
const [connecting, setConnecting] = useState(false);
|
|
8
|
+
const [popup, setPopup] = useState(null);
|
|
9
|
+
const { setVisible } = useCrossMintModal();
|
|
10
|
+
const createPopup = (candyMachineId, collectionTitle, collectionDescription, collectionPhoto) => {
|
|
11
|
+
const pop = window.open(`${development ? DEV_URL : PROD_URL}/signin?callbackUrl=${encodeURIComponent(`${development ? DEV_URL : PROD_URL}/checkout/mint?candyMachineId=${candyMachineId}&closeOnSuccess=false${collectionTitle ? `&collectionTitle=${collectionTitle}` : ""}${collectionDescription ? `&collectionDescription=${collectionDescription}` : ""}${collectionPhoto ? `&collectionPhoto=${collectionPhoto}` : ""}`)}`, "popUpWindow", createPopupString());
|
|
12
|
+
if (pop) {
|
|
13
|
+
setVisible(true);
|
|
14
|
+
setPopup(pop);
|
|
15
|
+
registerListeners(pop);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
setConnecting(false);
|
|
19
|
+
console.log("Failed to open popup window");
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
const connect = (candyMachineId, collectionTitle, collectionDescription, collectionPhoto) => {
|
|
23
|
+
if (connecting)
|
|
24
|
+
return;
|
|
25
|
+
setConnecting(true);
|
|
26
|
+
createPopup(candyMachineId, collectionTitle, collectionDescription, collectionPhoto);
|
|
27
|
+
};
|
|
28
|
+
function registerListeners(pop) {
|
|
29
|
+
const timer = setInterval(function () {
|
|
30
|
+
if (pop.closed) {
|
|
31
|
+
clearInterval(timer);
|
|
32
|
+
setConnecting(false);
|
|
33
|
+
setVisible(false);
|
|
34
|
+
}
|
|
35
|
+
}, 500);
|
|
36
|
+
}
|
|
37
|
+
function createPopupString() {
|
|
38
|
+
return `height=750,width=400,left=${window.innerWidth / 2 - 200},top=${window.innerHeight / 2 - 375},resizable=yes,scrollbars=yes,toolbar=yes,menubar=true,location=no,directories=no, status=yes`;
|
|
39
|
+
}
|
|
40
|
+
return (React.createElement(PopupContext.Provider, { value: {
|
|
41
|
+
connecting,
|
|
42
|
+
popup,
|
|
43
|
+
connect,
|
|
44
|
+
} }, children));
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=CrossMintPopupProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossMintPopupProvider.js","sourceRoot":"","sources":["../../src/CrossMintPopupProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOnD,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AACxC,MAAM,OAAO,GAAG,uBAAuB,CAAC;AAExC,MAAM,CAAC,MAAM,sBAAsB,GAA2B,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,EAAE,UAAU,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAG,CAChB,cAAsB,EACtB,eAAwB,EACxB,qBAA8B,EAC9B,eAAwB,EAC1B,EAAE;QACA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CACnB,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,uBAAuB,kBAAkB,CACxE,GACI,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAC5B,iCAAiC,cAAc,wBAC3C,eAAe,CAAC,CAAC,CAAC,oBAAoB,eAAe,EAAE,CAAC,CAAC,CAAC,EAC9D,GAAG,qBAAqB,CAAC,CAAC,CAAC,0BAA0B,qBAAqB,EAAE,CAAC,CAAC,CAAC,EAAE,GAC7E,eAAe,CAAC,CAAC,CAAC,oBAAoB,eAAe,EAAE,CAAC,CAAC,CAAC,EAC9D,EAAE,CACL,EAAE,EACH,aAAa,EACb,iBAAiB,EAAE,CACtB,CAAC;QACF,IAAI,GAAG,EAAE;YACL,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,iBAAiB,CAAC,GAAG,CAAC,CAAC;SAC1B;aAAM;YACH,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;SAC9C;IACL,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CACZ,cAAsB,EACtB,eAAwB,EACxB,qBAA8B,EAC9B,eAAwB,EAC1B,EAAE;QACA,IAAI,UAAU;YAAE,OAAO;QAEvB,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,WAAW,CAAC,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC,CAAC;IAEF,SAAS,iBAAiB,CAAC,GAAW;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC;YACtB,IAAI,GAAG,CAAC,MAAM,EAAE;gBACZ,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,UAAU,CAAC,KAAK,CAAC,CAAC;aACrB;QACL,CAAC,EAAE,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,SAAS,iBAAiB;QACtB,OAAO,6BAA6B,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,GAAG,QAC3D,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,GAC7B,+FAA+F,CAAC;IACpG,CAAC;IAED,OAAO,CACH,oBAAC,YAAY,CAAC,QAAQ,IAClB,KAAK,EAAE;YACH,UAAU;YACV,KAAK;YACL,OAAO;SACV,IAEA,QAAQ,CACW,CAC3B,CAAC;AACN,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FC, ReactNode } from "react";
|
|
2
|
+
import { CrossMintModalProps } from "./CrossMintModal";
|
|
3
|
+
export interface CrossMintProviderProps extends CrossMintModalProps {
|
|
4
|
+
development?: boolean;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare const CrossMintProvider: FC<CrossMintProviderProps>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { CrossMintModal } from "./CrossMintModal";
|
|
3
|
+
import { CrossMintPopupProvider } from "./CrossMintPopupProvider";
|
|
4
|
+
import { CrossMintModalContext } from "./useCrossMintModal";
|
|
5
|
+
export const CrossMintProvider = ({ development = false, children, ...props }) => {
|
|
6
|
+
const [visible, setVisible] = useState(false);
|
|
7
|
+
return (React.createElement(CrossMintModalContext.Provider, { value: {
|
|
8
|
+
visible,
|
|
9
|
+
setVisible,
|
|
10
|
+
} },
|
|
11
|
+
React.createElement(CrossMintPopupProvider, { development: development },
|
|
12
|
+
children,
|
|
13
|
+
visible && React.createElement(CrossMintModal, { ...props }))));
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=CrossMintProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CrossMintProvider.js","sourceRoot":"","sources":["../../src/CrossMintProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAiB,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAQ5D,MAAM,CAAC,MAAM,iBAAiB,GAA+B,CAAC,EAAE,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IACzG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,OAAO,CACH,oBAAC,qBAAqB,CAAC,QAAQ,IAC3B,KAAK,EAAE;YACH,OAAO;YACP,UAAU;SACb;QAED,oBAAC,sBAAsB,IAAC,WAAW,EAAE,WAAW;YAC3C,QAAQ;YACR,OAAO,IAAI,oBAAC,cAAc,OAAK,KAAK,GAAI,CACpB,CACI,CACpC,CAAC;AACN,CAAC,CAAC"}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface CrossMintModalContextState {
|
|
3
|
+
visible: boolean;
|
|
4
|
+
setVisible: (open: boolean) => void;
|
|
5
|
+
}
|
|
6
|
+
export declare const CrossMintModalContext: import("react").Context<CrossMintModalContextState>;
|
|
7
|
+
export declare function useCrossMintModal(): CrossMintModalContextState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCrossMintModal.js","sourceRoot":"","sources":["../../src/useCrossMintModal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAOlD,MAAM,CAAC,MAAM,qBAAqB,GAAG,aAAa,CAA6B,EAAgC,CAAC,CAAC;AAEjH,MAAM,UAAU,iBAAiB;IAC7B,OAAO,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface PopupContextState {
|
|
3
|
+
connecting: boolean;
|
|
4
|
+
connect: (candyMachineId: string, collectionTitle?: string, collectionDescription?: string, collectionPhoto?: string) => void;
|
|
5
|
+
popup: Window | null;
|
|
6
|
+
}
|
|
7
|
+
export declare const PopupContext: import("react").Context<PopupContextState>;
|
|
8
|
+
export declare function useCrossMintPopup(): PopupContextState;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCrossMintPopup.js","sourceRoot":"","sources":["../../src/useCrossMintPopup.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAclD,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAoB,EAAuB,CAAC,CAAC;AAEtF,MAAM,UAAU,iBAAiB;IAC7B,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@crossmint/client-sdk-react-ui",
|
|
3
|
+
"version": "0.0.4",
|
|
4
|
+
"author": "Paella Labs Inc",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": "https://github.com/CrossMint/crossmint-client-sdk",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"main": "lib/cjs/index.js",
|
|
10
|
+
"module": "lib/esm/index.js",
|
|
11
|
+
"types": "lib/esm/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./lib/esm/index.js",
|
|
15
|
+
"require": "./lib/cjs/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./styles.css": "./styles.css"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"lib",
|
|
21
|
+
"src",
|
|
22
|
+
"LICENSE",
|
|
23
|
+
"styles.css"
|
|
24
|
+
],
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"clean": "shx rm -rf lib/*",
|
|
30
|
+
"build": "yarn clean && tsc -p tsconfig.json && tsc -p tsconfig-cjs.json",
|
|
31
|
+
"postbuild": "echo '{\"type\":\"commonjs\"}' | npx json > lib/cjs/package.json && echo '{\"type\":\"module\"} ' | npx json > lib/esm/package.json"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"react": "^17.0.2",
|
|
35
|
+
"react-dom": "^17.0.2"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/react": "^17.0.24",
|
|
39
|
+
"@types/react-dom": "^17.0.11",
|
|
40
|
+
"react": "^17.0.2",
|
|
41
|
+
"react-dom": "^17.0.2"
|
|
42
|
+
},
|
|
43
|
+
"gitHead": "3fc180174454711b26970e42964360f81138f927"
|
|
44
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import React, { CSSProperties, FC, MouseEvent, MouseEventHandler, useMemo, useCallback } from "react";
|
|
2
|
+
import { useCrossMintPopup } from "./useCrossMintPopup";
|
|
3
|
+
|
|
4
|
+
export interface ButtonProps {
|
|
5
|
+
candyMachineId: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
onClick?: (e: MouseEvent<HTMLButtonElement>) => void;
|
|
9
|
+
style?: CSSProperties;
|
|
10
|
+
tabIndex?: number;
|
|
11
|
+
theme?: "light" | "dark";
|
|
12
|
+
collectionTitle?: string;
|
|
13
|
+
collectionDescription?: string;
|
|
14
|
+
collectionPhoto?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const CrossMintButton: FC<ButtonProps> = ({
|
|
18
|
+
candyMachineId,
|
|
19
|
+
className,
|
|
20
|
+
disabled,
|
|
21
|
+
onClick,
|
|
22
|
+
style,
|
|
23
|
+
tabIndex,
|
|
24
|
+
theme = "dark",
|
|
25
|
+
collectionTitle,
|
|
26
|
+
collectionDescription,
|
|
27
|
+
collectionPhoto,
|
|
28
|
+
...props
|
|
29
|
+
}) => {
|
|
30
|
+
const { connecting, connect } = useCrossMintPopup();
|
|
31
|
+
|
|
32
|
+
const handleClick: MouseEventHandler<HTMLButtonElement> = useCallback(
|
|
33
|
+
(event) => {
|
|
34
|
+
if (onClick) onClick(event);
|
|
35
|
+
|
|
36
|
+
if (!event.defaultPrevented)
|
|
37
|
+
connect(candyMachineId, collectionTitle, collectionDescription, collectionPhoto);
|
|
38
|
+
},
|
|
39
|
+
[onClick]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
const content = useMemo(() => {
|
|
43
|
+
if (connecting) return <p>Connecting ...</p>;
|
|
44
|
+
return <p>Buy with credit card</p>;
|
|
45
|
+
}, [connecting]);
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<button
|
|
49
|
+
className={`client-sdk-button-trigger client-sdk-button-trigger-${theme}`}
|
|
50
|
+
disabled={disabled}
|
|
51
|
+
onClick={handleClick}
|
|
52
|
+
style={{ ...style }}
|
|
53
|
+
tabIndex={tabIndex}
|
|
54
|
+
{...props}
|
|
55
|
+
>
|
|
56
|
+
<img
|
|
57
|
+
className="client-sdk-button-icon"
|
|
58
|
+
src="https://www.crossmint.io/assets/crossmint/logo.png"
|
|
59
|
+
alt="Crossmint logo"
|
|
60
|
+
/>
|
|
61
|
+
{content}
|
|
62
|
+
</button>
|
|
63
|
+
);
|
|
64
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React, { FC, useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
2
|
+
import { createPortal } from "react-dom";
|
|
3
|
+
import { useCrossMintModal } from "./useCrossMintModal";
|
|
4
|
+
|
|
5
|
+
export interface CrossMintModalProps {
|
|
6
|
+
className?: string;
|
|
7
|
+
container?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const CrossMintModal: FC<CrossMintModalProps> = ({ className = "", container = "body" }) => {
|
|
11
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
12
|
+
const { setVisible } = useCrossMintModal();
|
|
13
|
+
|
|
14
|
+
const [fadeIn, setFadeIn] = useState(false);
|
|
15
|
+
const [portal, setPortal] = useState<Element | null>(null);
|
|
16
|
+
|
|
17
|
+
const hideModal = useCallback(() => {
|
|
18
|
+
setFadeIn(false);
|
|
19
|
+
setTimeout(() => setVisible(false), 150);
|
|
20
|
+
}, [setFadeIn, setVisible]);
|
|
21
|
+
|
|
22
|
+
useLayoutEffect(() => {
|
|
23
|
+
// Get original overflow
|
|
24
|
+
const { overflow } = window.getComputedStyle(document.body);
|
|
25
|
+
// Hack to enable fade in animation after mount
|
|
26
|
+
setTimeout(() => setFadeIn(true), 0);
|
|
27
|
+
// Prevent scrolling on mount
|
|
28
|
+
document.body.style.overflow = "hidden";
|
|
29
|
+
|
|
30
|
+
return () => {
|
|
31
|
+
// Re-enable scrolling when component unmounts
|
|
32
|
+
document.body.style.overflow = overflow;
|
|
33
|
+
};
|
|
34
|
+
}, [hideModal]);
|
|
35
|
+
|
|
36
|
+
useLayoutEffect(() => setPortal(document.querySelector(container)), [setPortal, container]);
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
portal &&
|
|
40
|
+
createPortal(
|
|
41
|
+
<div
|
|
42
|
+
aria-modal="true"
|
|
43
|
+
className={`client-sdk-modal ${fadeIn && "client-sdk-modal-fade-in"} ${className}`}
|
|
44
|
+
ref={ref}
|
|
45
|
+
>
|
|
46
|
+
<div className="client-sdk-modal-container">
|
|
47
|
+
<span className="client-sdk-modal-loader" />
|
|
48
|
+
</div>
|
|
49
|
+
<div className="client-sdk-modal-overlay" />
|
|
50
|
+
</div>,
|
|
51
|
+
portal
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React, { FC, ReactNode, useState } from "react";
|
|
2
|
+
import { CrossMintModal, CrossMintModalProps } from "./CrossMintModal";
|
|
3
|
+
import { CrossMintModalContext } from "./useCrossMintModal";
|
|
4
|
+
// import { WalletModal, WalletModalProps } from './WalletModal';
|
|
5
|
+
|
|
6
|
+
export interface CrossMintModalProviderProps extends CrossMintModalProps {
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const CrossMintModalProvider: FC<CrossMintModalProviderProps> = ({ children, ...props }) => {
|
|
11
|
+
const [visible, setVisible] = useState(false);
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<CrossMintModalContext.Provider
|
|
15
|
+
value={{
|
|
16
|
+
visible,
|
|
17
|
+
setVisible,
|
|
18
|
+
}}
|
|
19
|
+
>
|
|
20
|
+
{children}
|
|
21
|
+
{visible && <CrossMintModal {...props} />}
|
|
22
|
+
</CrossMintModalContext.Provider>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React, { FC, ReactNode, useState } from "react";
|
|
2
|
+
import { useCrossMintModal } from ".";
|
|
3
|
+
import { PopupContext } from "./useCrossMintPopup";
|
|
4
|
+
|
|
5
|
+
export interface PopupProviderProps {
|
|
6
|
+
development: boolean;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const PROD_URL = "https://crossmint.io";
|
|
11
|
+
const DEV_URL = "http://localhost:3001";
|
|
12
|
+
|
|
13
|
+
export const CrossMintPopupProvider: FC<PopupProviderProps> = ({ development, children }) => {
|
|
14
|
+
const [connecting, setConnecting] = useState(false);
|
|
15
|
+
const [popup, setPopup] = useState<Window | null>(null);
|
|
16
|
+
|
|
17
|
+
const { setVisible } = useCrossMintModal();
|
|
18
|
+
|
|
19
|
+
const createPopup = (
|
|
20
|
+
candyMachineId: string,
|
|
21
|
+
collectionTitle?: string,
|
|
22
|
+
collectionDescription?: string,
|
|
23
|
+
collectionPhoto?: string
|
|
24
|
+
) => {
|
|
25
|
+
const pop = window.open(
|
|
26
|
+
`${development ? DEV_URL : PROD_URL}/signin?callbackUrl=${encodeURIComponent(
|
|
27
|
+
`${
|
|
28
|
+
development ? DEV_URL : PROD_URL
|
|
29
|
+
}/checkout/mint?candyMachineId=${candyMachineId}&closeOnSuccess=false${
|
|
30
|
+
collectionTitle ? `&collectionTitle=${collectionTitle}` : ""
|
|
31
|
+
}${collectionDescription ? `&collectionDescription=${collectionDescription}` : ""}${
|
|
32
|
+
collectionPhoto ? `&collectionPhoto=${collectionPhoto}` : ""
|
|
33
|
+
}`
|
|
34
|
+
)}`,
|
|
35
|
+
"popUpWindow",
|
|
36
|
+
createPopupString()
|
|
37
|
+
);
|
|
38
|
+
if (pop) {
|
|
39
|
+
setVisible(true);
|
|
40
|
+
setPopup(pop);
|
|
41
|
+
registerListeners(pop);
|
|
42
|
+
} else {
|
|
43
|
+
setConnecting(false);
|
|
44
|
+
console.log("Failed to open popup window");
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const connect = (
|
|
49
|
+
candyMachineId: string,
|
|
50
|
+
collectionTitle?: string,
|
|
51
|
+
collectionDescription?: string,
|
|
52
|
+
collectionPhoto?: string
|
|
53
|
+
) => {
|
|
54
|
+
if (connecting) return;
|
|
55
|
+
|
|
56
|
+
setConnecting(true);
|
|
57
|
+
|
|
58
|
+
createPopup(candyMachineId, collectionTitle, collectionDescription, collectionPhoto);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
function registerListeners(pop: Window) {
|
|
62
|
+
const timer = setInterval(function () {
|
|
63
|
+
if (pop.closed) {
|
|
64
|
+
clearInterval(timer);
|
|
65
|
+
setConnecting(false);
|
|
66
|
+
setVisible(false);
|
|
67
|
+
}
|
|
68
|
+
}, 500);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function createPopupString() {
|
|
72
|
+
return `height=750,width=400,left=${window.innerWidth / 2 - 200},top=${
|
|
73
|
+
window.innerHeight / 2 - 375
|
|
74
|
+
},resizable=yes,scrollbars=yes,toolbar=yes,menubar=true,location=no,directories=no, status=yes`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<PopupContext.Provider
|
|
79
|
+
value={{
|
|
80
|
+
connecting,
|
|
81
|
+
popup,
|
|
82
|
+
connect,
|
|
83
|
+
}}
|
|
84
|
+
>
|
|
85
|
+
{children}
|
|
86
|
+
</PopupContext.Provider>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React, { FC, ReactNode, useState } from "react";
|
|
2
|
+
import { CrossMintModal, CrossMintModalProps } from "./CrossMintModal";
|
|
3
|
+
import { CrossMintPopupProvider } from "./CrossMintPopupProvider";
|
|
4
|
+
import { CrossMintModalContext } from "./useCrossMintModal";
|
|
5
|
+
// import { WalletModal, WalletModalProps } from './WalletModal';
|
|
6
|
+
|
|
7
|
+
export interface CrossMintProviderProps extends CrossMintModalProps {
|
|
8
|
+
development?: boolean;
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const CrossMintProvider: FC<CrossMintProviderProps> = ({ development = false, children, ...props }) => {
|
|
13
|
+
const [visible, setVisible] = useState(false);
|
|
14
|
+
|
|
15
|
+
return (
|
|
16
|
+
<CrossMintModalContext.Provider
|
|
17
|
+
value={{
|
|
18
|
+
visible,
|
|
19
|
+
setVisible,
|
|
20
|
+
}}
|
|
21
|
+
>
|
|
22
|
+
<CrossMintPopupProvider development={development}>
|
|
23
|
+
{children}
|
|
24
|
+
{visible && <CrossMintModal {...props} />}
|
|
25
|
+
</CrossMintPopupProvider>
|
|
26
|
+
</CrossMintModalContext.Provider>
|
|
27
|
+
);
|
|
28
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createContext, useContext } from "react";
|
|
2
|
+
|
|
3
|
+
export interface CrossMintModalContextState {
|
|
4
|
+
visible: boolean;
|
|
5
|
+
setVisible: (open: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const CrossMintModalContext = createContext<CrossMintModalContextState>({} as CrossMintModalContextState);
|
|
9
|
+
|
|
10
|
+
export function useCrossMintModal(): CrossMintModalContextState {
|
|
11
|
+
return useContext(CrossMintModalContext);
|
|
12
|
+
}
|