@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.
Files changed (62) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +30 -0
  3. package/lib/cjs/CrossMintButton.d.ts +14 -0
  4. package/lib/cjs/CrossMintButton.js +55 -0
  5. package/lib/cjs/CrossMintButton.js.map +1 -0
  6. package/lib/cjs/CrossMintModal.d.ts +6 -0
  7. package/lib/cjs/CrossMintModal.js +55 -0
  8. package/lib/cjs/CrossMintModal.js.map +1 -0
  9. package/lib/cjs/CrossMintModalProvider.d.ts +6 -0
  10. package/lib/cjs/CrossMintModalProvider.js +48 -0
  11. package/lib/cjs/CrossMintModalProvider.js.map +1 -0
  12. package/lib/cjs/CrossMintPopupProvider.d.ts +6 -0
  13. package/lib/cjs/CrossMintPopupProvider.js +69 -0
  14. package/lib/cjs/CrossMintPopupProvider.js.map +1 -0
  15. package/lib/cjs/CrossMintProvider.d.ts +7 -0
  16. package/lib/cjs/CrossMintProvider.js +50 -0
  17. package/lib/cjs/CrossMintProvider.js.map +1 -0
  18. package/lib/cjs/index.d.ts +5 -0
  19. package/lib/cjs/index.js +18 -0
  20. package/lib/cjs/index.js.map +1 -0
  21. package/lib/cjs/package.json +3 -0
  22. package/lib/cjs/useCrossMintModal.d.ts +7 -0
  23. package/lib/cjs/useCrossMintModal.js +10 -0
  24. package/lib/cjs/useCrossMintModal.js.map +1 -0
  25. package/lib/cjs/useCrossMintPopup.d.ts +8 -0
  26. package/lib/cjs/useCrossMintPopup.js +10 -0
  27. package/lib/cjs/useCrossMintPopup.js.map +1 -0
  28. package/lib/esm/CrossMintButton.d.ts +14 -0
  29. package/lib/esm/CrossMintButton.js +20 -0
  30. package/lib/esm/CrossMintButton.js.map +1 -0
  31. package/lib/esm/CrossMintModal.d.ts +6 -0
  32. package/lib/esm/CrossMintModal.js +32 -0
  33. package/lib/esm/CrossMintModal.js.map +1 -0
  34. package/lib/esm/CrossMintModalProvider.d.ts +6 -0
  35. package/lib/esm/CrossMintModalProvider.js +13 -0
  36. package/lib/esm/CrossMintModalProvider.js.map +1 -0
  37. package/lib/esm/CrossMintPopupProvider.d.ts +6 -0
  38. package/lib/esm/CrossMintPopupProvider.js +46 -0
  39. package/lib/esm/CrossMintPopupProvider.js.map +1 -0
  40. package/lib/esm/CrossMintProvider.d.ts +7 -0
  41. package/lib/esm/CrossMintProvider.js +15 -0
  42. package/lib/esm/CrossMintProvider.js.map +1 -0
  43. package/lib/esm/index.d.ts +5 -0
  44. package/lib/esm/index.js +6 -0
  45. package/lib/esm/index.js.map +1 -0
  46. package/lib/esm/package.json +3 -0
  47. package/lib/esm/useCrossMintModal.d.ts +7 -0
  48. package/lib/esm/useCrossMintModal.js +6 -0
  49. package/lib/esm/useCrossMintModal.js.map +1 -0
  50. package/lib/esm/useCrossMintPopup.d.ts +8 -0
  51. package/lib/esm/useCrossMintPopup.js +6 -0
  52. package/lib/esm/useCrossMintPopup.js.map +1 -0
  53. package/package.json +44 -0
  54. package/src/CrossMintButton.tsx +64 -0
  55. package/src/CrossMintModal.tsx +54 -0
  56. package/src/CrossMintModalProvider.tsx +24 -0
  57. package/src/CrossMintPopupProvider.tsx +88 -0
  58. package/src/CrossMintProvider.tsx +28 -0
  59. package/src/index.ts +5 -0
  60. package/src/useCrossMintModal.tsx +12 -0
  61. package/src/useCrossMintPopup.tsx +19 -0
  62. 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,6 @@
1
+ import { FC } from "react";
2
+ export interface CrossMintModalProps {
3
+ className?: string;
4
+ container?: string;
5
+ }
6
+ export declare const CrossMintModal: FC<CrossMintModalProps>;
@@ -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,6 @@
1
+ import { FC, ReactNode } from "react";
2
+ export interface PopupProviderProps {
3
+ development: boolean;
4
+ children: ReactNode;
5
+ }
6
+ export declare const CrossMintPopupProvider: FC<PopupProviderProps>;
@@ -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"}
@@ -0,0 +1,5 @@
1
+ export * from "./CrossMintButton";
2
+ export * from "./CrossMintModal";
3
+ export * from "./useCrossMintModal";
4
+ export * from "./useCrossMintPopup";
5
+ export * from "./CrossMintProvider";
@@ -0,0 +1,6 @@
1
+ export * from "./CrossMintButton";
2
+ export * from "./CrossMintModal";
3
+ export * from "./useCrossMintModal";
4
+ export * from "./useCrossMintPopup";
5
+ export * from "./CrossMintProvider";
6
+ //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -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,6 @@
1
+ import { createContext, useContext } from "react";
2
+ export const CrossMintModalContext = createContext({});
3
+ export function useCrossMintModal() {
4
+ return useContext(CrossMintModalContext);
5
+ }
6
+ //# sourceMappingURL=useCrossMintModal.js.map
@@ -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,6 @@
1
+ import { createContext, useContext } from "react";
2
+ export const PopupContext = createContext({});
3
+ export function useCrossMintPopup() {
4
+ return useContext(PopupContext);
5
+ }
6
+ //# sourceMappingURL=useCrossMintPopup.js.map
@@ -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,5 @@
1
+ export * from "./CrossMintButton";
2
+ export * from "./CrossMintModal";
3
+ export * from "./useCrossMintModal";
4
+ export * from "./useCrossMintPopup";
5
+ export * from "./CrossMintProvider";
@@ -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
+ }