@moveindustries/wallet-adapter-react 7.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +306 -0
  3. package/dist/WalletProvider.d.ts +12 -0
  4. package/dist/WalletProvider.d.ts.map +1 -0
  5. package/dist/components/AboutMovementConnect.d.ts +29 -0
  6. package/dist/components/AboutMovementConnect.d.ts.map +1 -0
  7. package/dist/components/AboutPetraWeb.d.ts +31 -0
  8. package/dist/components/AboutPetraWeb.d.ts.map +1 -0
  9. package/dist/components/MovementPrivacyPolicy.d.ts +12 -0
  10. package/dist/components/MovementPrivacyPolicy.d.ts.map +1 -0
  11. package/dist/components/WalletItem.d.ts +16 -0
  12. package/dist/components/WalletItem.d.ts.map +1 -0
  13. package/dist/components/utils.d.ts +20 -0
  14. package/dist/components/utils.d.ts.map +1 -0
  15. package/dist/graphics/LinkGraphic.d.ts +3 -0
  16. package/dist/graphics/LinkGraphic.d.ts.map +1 -0
  17. package/dist/graphics/SmallMovementLogo.d.ts +3 -0
  18. package/dist/graphics/SmallMovementLogo.d.ts.map +1 -0
  19. package/dist/graphics/WalletGraphic.d.ts +3 -0
  20. package/dist/graphics/WalletGraphic.d.ts.map +1 -0
  21. package/dist/graphics/Web3Graphic.d.ts +3 -0
  22. package/dist/graphics/Web3Graphic.d.ts.map +1 -0
  23. package/dist/index.d.ts +8 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +632 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/index.mjs +606 -0
  28. package/dist/index.mjs.map +1 -0
  29. package/dist/useWallet.d.ts +31 -0
  30. package/dist/useWallet.d.ts.map +1 -0
  31. package/package.json +60 -0
  32. package/src/WalletProvider.tsx +424 -0
  33. package/src/components/AboutMovementConnect.tsx +60 -0
  34. package/src/components/AboutPetraWeb.tsx +63 -0
  35. package/src/components/MovementPrivacyPolicy.tsx +44 -0
  36. package/src/components/WalletItem.tsx +122 -0
  37. package/src/components/utils.tsx +70 -0
  38. package/src/graphics/LinkGraphic.tsx +26 -0
  39. package/src/graphics/SmallMovementLogo.tsx +25 -0
  40. package/src/graphics/WalletGraphic.tsx +42 -0
  41. package/src/graphics/Web3Graphic.tsx +31 -0
  42. package/src/index.tsx +7 -0
  43. package/src/useWallet.tsx +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.tsx","../src/WalletProvider.tsx","../src/useWallet.tsx","../src/components/utils.tsx","../src/components/AboutMovementConnect.tsx","../src/components/AboutPetraWeb.tsx","../src/components/MovementPrivacyPolicy.tsx","../src/graphics/SmallMovementLogo.tsx","../src/components/WalletItem.tsx"],"sourcesContent":["export * from \"@moveindustries/wallet-adapter-core\";\nexport * from \"./WalletProvider\";\nexport * from \"./components/AboutMovementConnect\";\nexport * from \"./components/AboutPetraWeb\";\nexport * from \"./components/MovementPrivacyPolicy\";\nexport * from \"./components/WalletItem\";\nexport * from \"./useWallet\";\n","import {\n AvailableWallets,\n DappConfig,\n AccountInfo,\n AdapterWallet,\n NetworkInfo,\n InputTransactionData,\n MovementSignAndSubmitTransactionOutput,\n AnyRawTransaction,\n InputGenerateTransactionOptions,\n AccountAuthenticator,\n MovementSignMessageInput,\n MovementSignMessageOutput,\n AdapterNotDetectedWallet,\n WalletCore,\n Network,\n InputSubmitTransactionData,\n PendingTransactionResponse,\n WalletReadyState,\n MovementSignInInput,\n MovementSignInOutput,\n} from \"@moveindustries/wallet-adapter-core\";\nimport { ReactNode, FC, useState, useEffect, useCallback, useRef } from \"react\";\nimport { WalletContext } from \"./useWallet\";\n\nexport interface MovementWalletProviderProps {\n children: ReactNode;\n optInWallets?: ReadonlyArray<AvailableWallets>;\n autoConnect?:\n | boolean\n | ((core: WalletCore, adapter: AdapterWallet) => Promise<boolean>);\n dappConfig?: DappConfig;\n disableTelemetry?: boolean;\n onError?: (error: any) => void;\n}\n\nconst initialState: {\n account: AccountInfo | null;\n network: NetworkInfo | null;\n connected: boolean;\n wallet: AdapterWallet | null;\n} = {\n connected: false,\n account: null,\n network: null,\n wallet: null,\n};\n\nexport const MovementWalletAdapterProvider: FC<MovementWalletProviderProps> = ({\n children,\n optInWallets,\n autoConnect = false,\n dappConfig,\n disableTelemetry = false,\n onError,\n}: MovementWalletProviderProps) => {\n const didAttemptAutoConnectRef = useRef(false);\n\n const [{ account, network, connected, wallet }, setState] =\n useState(initialState);\n\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [walletCore, setWalletCore] = useState<WalletCore>();\n\n const [wallets, setWallets] = useState<ReadonlyArray<AdapterWallet>>([]);\n const [notDetectedWallets, setNotDetectedWallets] = useState<\n ReadonlyArray<AdapterNotDetectedWallet>\n >([]);\n // Initialize WalletCore on first load\n useEffect(() => {\n const walletCore = new WalletCore(\n optInWallets,\n dappConfig,\n disableTelemetry,\n );\n setWalletCore(walletCore);\n }, []);\n\n // Update initial Wallets state once WalletCore has been initialized\n useEffect(() => {\n setWallets(walletCore?.wallets ?? []);\n setNotDetectedWallets(walletCore?.notDetectedWallets ?? []);\n }, [walletCore]);\n\n useEffect(() => {\n // Only attempt to auto connect once per render and only if there are wallets\n if (didAttemptAutoConnectRef.current || !walletCore?.wallets.length) {\n return;\n }\n didAttemptAutoConnectRef.current = true;\n\n // If auto connect is not set or is false, ignore the attempt\n if (!autoConnect) {\n setIsLoading(false);\n return;\n }\n\n // Make sure the user has a previously connected wallet\n const walletName = localStorage.getItem(\"MovementWalletName\");\n if (!walletName) {\n setIsLoading(false);\n return;\n }\n\n // Make sure the wallet is installed\n const selectedWallet = walletCore.wallets.find(\n (e) => e.name === walletName,\n ) as AdapterWallet | undefined;\n if (\n !selectedWallet ||\n selectedWallet.readyState !== WalletReadyState.Installed\n ) {\n setIsLoading(false);\n return;\n }\n\n if (!connected) {\n (async () => {\n try {\n let shouldConnect = true;\n\n // Providing a function to autoConnect allows the dapp to determine\n // whether to attempt to connect to the wallet using the `signIn`\n // or `connect` method. If `signIn` is successful, the user can\n // return `false` and skip the `connect` method.\n if (typeof autoConnect === \"function\") {\n shouldConnect = await autoConnect(walletCore, selectedWallet);\n } else {\n shouldConnect = autoConnect;\n }\n\n if (shouldConnect) await connect(walletName);\n } catch (error) {\n if (onError) onError(error);\n return Promise.reject(error);\n } finally {\n setIsLoading(false);\n }\n })();\n } else {\n setIsLoading(false);\n }\n }, [autoConnect, wallets]);\n\n const connect = async (walletName: string): Promise<void> => {\n try {\n setIsLoading(true);\n await walletCore?.connect(walletName);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const signIn = async (args: {\n walletName: string;\n input: MovementSignInInput;\n }): Promise<MovementSignInOutput> => {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n\n try {\n setIsLoading(true);\n return await walletCore?.signIn(args);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n } finally {\n setIsLoading(false);\n }\n };\n\n const disconnect = async (): Promise<void> => {\n try {\n await walletCore?.disconnect();\n } catch (error) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const signAndSubmitTransaction = async (\n transaction: InputTransactionData,\n ): Promise<MovementSignAndSubmitTransactionOutput> => {\n try {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n return await walletCore.signAndSubmitTransaction(transaction);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const signTransaction = async (args: {\n transactionOrPayload: AnyRawTransaction | InputTransactionData;\n asFeePayer?: boolean;\n options?: InputGenerateTransactionOptions & {\n expirationSecondsFromNow?: number;\n expirationTimestamp?: number;\n };\n }): Promise<{\n authenticator: AccountAuthenticator;\n rawTransaction: Uint8Array;\n }> => {\n const { transactionOrPayload, asFeePayer, options } = args;\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n try {\n return await walletCore.signTransaction({\n transactionOrPayload,\n asFeePayer,\n });\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const submitTransaction = async (\n transaction: InputSubmitTransactionData,\n ): Promise<PendingTransactionResponse> => {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n try {\n return await walletCore?.submitTransaction(transaction);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const signMessage = async (\n message: MovementSignMessageInput,\n ): Promise<MovementSignMessageOutput> => {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n try {\n return await walletCore?.signMessage(message);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const signMessageAndVerify = async (\n message: MovementSignMessageInput,\n ): Promise<boolean> => {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n try {\n return await walletCore?.signMessageAndVerify(message);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n const changeNetwork = async (network: Network) => {\n if (!walletCore) {\n throw new Error(\"WalletCore is not initialized\");\n }\n try {\n return await walletCore?.changeNetwork(network);\n } catch (error: any) {\n if (onError) onError(error);\n return Promise.reject(error);\n }\n };\n\n // Handle the adapter's connect event\n const handleConnect = (): void => {\n setState((state) => {\n return {\n ...state,\n connected: true,\n account: walletCore?.account || null,\n network: walletCore?.network || null,\n wallet: walletCore?.wallet || null,\n };\n });\n };\n\n // Handle the adapter's account change event\n const handleAccountChange = useCallback((): void => {\n if (!connected) return;\n if (!walletCore?.wallet) return;\n setState((state) => {\n return {\n ...state,\n account: walletCore?.account || null,\n };\n });\n }, [connected]);\n\n // Handle the adapter's network event\n const handleNetworkChange = useCallback((): void => {\n if (!connected) return;\n if (!walletCore?.wallet) return;\n setState((state) => {\n return {\n ...state,\n network: walletCore?.network || null,\n };\n });\n }, [connected]);\n\n useEffect(() => {\n if (connected) {\n walletCore?.onAccountChange();\n walletCore?.onNetworkChange();\n }\n }, [connected]);\n\n // Handle the adapter's disconnect event\n const handleDisconnect = (): void => {\n if (!connected) return;\n setState((state) => {\n return {\n ...state,\n connected: false,\n account: walletCore?.account || null,\n network: walletCore?.network || null,\n wallet: null,\n };\n });\n };\n\n const handleStandardWalletsAdded = (standardWallet: AdapterWallet): void => {\n // Manage current wallet state by removing optional duplications\n // as new wallets are coming\n const existingWalletIndex = wallets.findIndex(\n (wallet) => wallet.name == standardWallet.name,\n );\n if (existingWalletIndex !== -1) {\n // If wallet exists, replace it with the new wallet\n setWallets((wallets) => [\n ...wallets.slice(0, existingWalletIndex),\n standardWallet,\n ...wallets.slice(existingWalletIndex + 1),\n ]);\n } else {\n // If wallet doesn't exist, add it to the array\n setWallets((wallets) => [...wallets, standardWallet]);\n }\n };\n\n const handleStandardNotDetectedWalletsAdded = (\n notDetectedWallet: AdapterNotDetectedWallet,\n ): void => {\n // Manage current wallet state by removing optional duplications\n // as new wallets are coming\n const existingWalletIndex = wallets.findIndex(\n (wallet) => wallet.name == notDetectedWallet.name,\n );\n if (existingWalletIndex !== -1) {\n // If wallet exists, replace it with the new wallet\n setNotDetectedWallets((wallets) => [\n ...wallets.slice(0, existingWalletIndex),\n notDetectedWallet,\n ...wallets.slice(existingWalletIndex + 1),\n ]);\n } else {\n // If wallet doesn't exist, add it to the array\n setNotDetectedWallets((wallets) => [...wallets, notDetectedWallet]);\n }\n };\n\n useEffect(() => {\n walletCore?.on(\"connect\", handleConnect);\n walletCore?.on(\"accountChange\", handleAccountChange);\n walletCore?.on(\"networkChange\", handleNetworkChange);\n walletCore?.on(\"disconnect\", handleDisconnect);\n walletCore?.on(\"standardWalletsAdded\", handleStandardWalletsAdded);\n walletCore?.on(\n \"standardNotDetectedWalletAdded\",\n handleStandardNotDetectedWalletsAdded,\n );\n return () => {\n walletCore?.off(\"connect\", handleConnect);\n walletCore?.off(\"accountChange\", handleAccountChange);\n walletCore?.off(\"networkChange\", handleNetworkChange);\n walletCore?.off(\"disconnect\", handleDisconnect);\n walletCore?.off(\"standardWalletsAdded\", handleStandardWalletsAdded);\n walletCore?.off(\n \"standardNotDetectedWalletAdded\",\n handleStandardNotDetectedWalletsAdded,\n );\n };\n }, [wallets, account]);\n\n return (\n <WalletContext.Provider\n value={{\n connect,\n signIn,\n disconnect,\n signAndSubmitTransaction,\n signTransaction,\n signMessage,\n signMessageAndVerify,\n changeNetwork,\n submitTransaction,\n account,\n network,\n connected,\n wallet,\n wallets,\n notDetectedWallets,\n isLoading,\n }}\n >\n {children}\n </WalletContext.Provider>\n );\n};\n","import { useContext, createContext } from \"react\";\nimport {\n AccountAuthenticator,\n AccountInfo,\n AdapterWallet,\n AnyRawTransaction,\n MovementSignAndSubmitTransactionOutput,\n InputTransactionData,\n NetworkInfo,\n MovementSignMessageInput,\n MovementSignMessageOutput,\n AdapterNotDetectedWallet,\n Network,\n MovementChangeNetworkOutput,\n PendingTransactionResponse,\n InputSubmitTransactionData,\n MovementSignInInput,\n MovementSignInOutput,\n} from \"@moveindustries/wallet-adapter-core\";\n\nexport interface WalletContextState {\n connected: boolean;\n isLoading: boolean;\n account: AccountInfo | null;\n network: NetworkInfo | null;\n connect(walletName: string): void;\n signIn(args: {\n walletName: string;\n input: MovementSignInInput;\n }): Promise<MovementSignInOutput | void>;\n signAndSubmitTransaction(\n transaction: InputTransactionData,\n ): Promise<MovementSignAndSubmitTransactionOutput>;\n signTransaction(args: {\n transactionOrPayload: AnyRawTransaction | InputTransactionData;\n asFeePayer?: boolean;\n }): Promise<{\n authenticator: AccountAuthenticator;\n rawTransaction: Uint8Array;\n }>;\n signMessage(message: MovementSignMessageInput): Promise<MovementSignMessageOutput>;\n signMessageAndVerify(message: MovementSignMessageInput): Promise<boolean>;\n disconnect(): void;\n changeNetwork(network: Network): Promise<MovementChangeNetworkOutput>;\n submitTransaction(\n transaction: InputSubmitTransactionData,\n ): Promise<PendingTransactionResponse>;\n wallet: AdapterWallet | null;\n wallets: ReadonlyArray<AdapterWallet>;\n notDetectedWallets: ReadonlyArray<AdapterNotDetectedWallet>;\n}\n\nconst DEFAULT_CONTEXT = {\n connected: false,\n};\n\nexport const WalletContext = createContext<WalletContextState>(\n DEFAULT_CONTEXT as WalletContextState,\n);\n\nexport function useWallet(): WalletContextState {\n const context = useContext(WalletContext);\n if (!context) {\n throw new Error(\"useWallet must be used within a WalletContextState\");\n }\n return context;\n}\n","import { Slot } from \"@radix-ui/react-slot\";\nimport { ReactNode, cloneElement, forwardRef, isValidElement } from \"react\";\n\nexport interface HeadlessComponentProps {\n /** A class name for styling the element. */\n className?: string;\n /**\n * Whether to render as the child element instead of the default element provided.\n * All props will be merged into the child element.\n */\n asChild?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Gets an HTML element type from its tag name\n * @example\n * HTMLElementFromTag<\"img\"> // resolved type: HTMLImageElement\n */\ntype HTMLElementFromTag<T extends keyof JSX.IntrinsicElements> =\n JSX.IntrinsicElements[T] extends React.ClassAttributes<infer Element>\n ? Element\n : HTMLElement;\n\nexport function createHeadlessComponent<\n TElement extends keyof JSX.IntrinsicElements,\n>(\n displayName: string,\n elementType: TElement,\n props?:\n | JSX.IntrinsicElements[TElement]\n | ((displayName: string) => JSX.IntrinsicElements[TElement]),\n) {\n const component = forwardRef<\n HTMLElementFromTag<TElement>,\n HeadlessComponentProps\n >(({ className, asChild, children }, ref) => {\n const Component = asChild ? Slot : elementType;\n\n const { children: defaultChildren, ...resolvedProps } =\n typeof props === \"function\" ? props(displayName) : (props ?? {});\n const resolvedChildren =\n /**\n * Use props' default children if no children are set in the component element's children and when asChild is true.\n */\n asChild && isValidElement(children) && !children.props.children\n ? cloneElement(children, {}, defaultChildren)\n : (children ?? defaultChildren);\n\n return (\n /**\n * Due to the complexity of the types at play, TypeScript reports the\n * following error for our JSX below:\n *\n * `Expression produces a union type that is too complex to represent.`\n *\n * We can safely ignore this error and retain accurate return types for\n * consumers of this function. The only drawback is that type-checking is\n * ignored for the JSX block below.\n */\n // @ts-expect-error\n <Component ref={ref} className={className} {...resolvedProps}>\n {resolvedChildren}\n </Component>\n );\n });\n component.displayName = displayName;\n\n return component;\n}\n","// TODO: Re-enable when Movement supports social sign-in (Movement Connect)\n// This is a stub component that just renders children - social sign-in education screens are disabled\n\nimport {\n ForwardRefExoticComponent,\n ReactNode,\n RefAttributes,\n SVGProps,\n} from \"react\";\nimport { HeadlessComponentProps, createHeadlessComponent } from \"./utils\";\n\n/** @deprecated Use AboutPetraWeb instead. Social sign-in disabled. */\nexport interface AboutMovementConnectEducationScreen {\n Graphic: ForwardRefExoticComponent<\n Omit<SVGProps<SVGSVGElement>, \"ref\"> & RefAttributes<SVGSVGElement>\n >;\n Title: ForwardRefExoticComponent<\n HeadlessComponentProps & RefAttributes<HTMLHeadingElement>\n >;\n Description: ForwardRefExoticComponent<\n HeadlessComponentProps & RefAttributes<HTMLParagraphElement>\n >;\n screenIndex: number;\n totalScreens: number;\n screenIndicators: ForwardRefExoticComponent<HeadlessComponentProps & RefAttributes<HTMLButtonElement>>[];\n back: () => void;\n next: () => void;\n cancel: () => void;\n}\n\n/** @deprecated Use AboutPetraWebProps instead. Social sign-in disabled. */\nexport interface AboutMovementConnectProps {\n renderEducationScreen: (screen: AboutMovementConnectEducationScreen) => ReactNode;\n children?: ReactNode;\n}\n\n/**\n * @deprecated Social sign-in disabled - this component just renders children without any education screens\n */\nconst Root = ({ children }: AboutMovementConnectProps) => {\n return <>{children}</>;\n};\nRoot.displayName = \"AboutMovementConnect\";\n\nconst Trigger = createHeadlessComponent(\n \"AboutMovementConnect.Trigger\",\n \"button\",\n () => ({\n // No-op since social sign-in is disabled\n onClick: () => {},\n style: { display: \"none\" },\n }),\n);\n\n/**\n * @deprecated Social sign-in disabled - this component just renders children\n */\nexport const AboutMovementConnect = Object.assign(Root, {\n Trigger,\n});\n","// TODO: Re-enable when Movement supports social sign-in (Petra Web)\n// This is a stub component that just renders children - social sign-in education screens are disabled\n\nimport {\n ForwardRefExoticComponent,\n ReactNode,\n RefAttributes,\n SVGProps,\n} from \"react\";\nimport { HeadlessComponentProps, createHeadlessComponent } from \"./utils\";\n\n/** @deprecated Social sign-in disabled */\nexport const EXPLORE_ECOSYSTEM_URL = \"https://movementlabs.xyz/ecosystem\";\n\n/** @deprecated Social sign-in disabled */\nexport interface AboutPetraWebEducationScreen {\n Graphic: ForwardRefExoticComponent<\n Omit<SVGProps<SVGSVGElement>, \"ref\"> & RefAttributes<SVGSVGElement>\n >;\n Title: ForwardRefExoticComponent<\n HeadlessComponentProps & RefAttributes<HTMLHeadingElement>\n >;\n Description: ForwardRefExoticComponent<\n HeadlessComponentProps & RefAttributes<HTMLParagraphElement>\n >;\n screenIndex: number;\n totalScreens: number;\n screenIndicators: ForwardRefExoticComponent<HeadlessComponentProps & RefAttributes<HTMLButtonElement>>[];\n back: () => void;\n next: () => void;\n cancel: () => void;\n}\n\n/** @deprecated Social sign-in disabled */\nexport interface AboutPetraWebProps {\n renderEducationScreen: (screen: AboutPetraWebEducationScreen) => ReactNode;\n children?: ReactNode;\n}\n\n/**\n * @deprecated Social sign-in disabled - this component just renders children without any education screens\n */\nconst Root = ({ children }: AboutPetraWebProps) => {\n return <>{children}</>;\n};\nRoot.displayName = \"AboutPetraWeb\";\n\nconst Trigger = createHeadlessComponent(\n \"AboutPetraWeb.Trigger\",\n \"button\",\n () => ({\n // No-op since social sign-in is disabled\n onClick: () => {},\n style: { display: \"none\" },\n }),\n);\n\n/**\n * @deprecated Social sign-in disabled - this component just renders children\n */\nexport const AboutPetraWeb = Object.assign(Root, {\n Trigger,\n});\n","import { forwardRef } from \"react\";\nimport { SmallMovementLogo } from \"../graphics/SmallMovementLogo\";\nimport { HeadlessComponentProps, createHeadlessComponent } from \"./utils\";\n\nexport const MOVEMENT_PRIVACY_POLICY_URL = \"https://movementlabs.xyz/privacy\";\n\nconst Root = createHeadlessComponent(\"MovementPrivacyPolicy.Root\", \"div\");\n\nconst Disclaimer = createHeadlessComponent(\n \"MovementPrivacyPolicy.Disclaimer\",\n \"span\",\n { children: \"By continuing, you agree to Movement Labs'\" },\n);\n\nconst Link = createHeadlessComponent(\"MovementPrivacyPolicy.Disclaimer\", \"a\", {\n href: MOVEMENT_PRIVACY_POLICY_URL,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n children: \"Privacy Policy\",\n});\n\nconst PoweredBy = forwardRef<\n HTMLDivElement,\n Pick<HeadlessComponentProps, \"className\">\n>(({ className }, ref) => {\n return (\n <div ref={ref} className={className}>\n <span>Powered by</span>\n <SmallMovementLogo />\n <span>Movement Labs</span>\n </div>\n );\n});\nPoweredBy.displayName = \"MovementPrivacyPolicy.PoweredBy\";\n\n/**\n * A headless component for rendering the Movement Labs privacy policy disclaimer\n * that should be placed under the Petra Web login options.\n */\nexport const MovementPrivacyPolicy = Object.assign(Root, {\n Disclaimer,\n Link,\n PoweredBy,\n});\n","import { SVGProps, forwardRef } from \"react\";\n\nexport const SmallMovementLogo = forwardRef<\n SVGSVGElement,\n SVGProps<SVGSVGElement>\n>((props, ref) => {\n return (\n <svg\n ref={ref}\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6 12C9.31371 12 12 9.31371 12 6C12 2.68629 9.31371 0 6 0C2.68629 0 0 2.68629 0 6C0 9.31371 2.68629 12 6 12ZM7.17547 3.67976C7.13401 3.72309 7.07649 3.74757 7.01648 3.74757H3.00775C3.69185 2.83824 4.77995 2.25 6.00569 2.25C7.23142 2.25 8.31953 2.83824 9.00362 3.74757H8.28524C8.20824 3.74757 8.13498 3.71468 8.08401 3.65701L7.81608 3.35416C7.77618 3.30896 7.71882 3.28308 7.6585 3.28308H7.6454C7.58805 3.28308 7.53318 3.30646 7.49343 3.34792L7.17547 3.67976ZM8.05656 4.75897H7.39569C7.31869 4.75897 7.24543 4.72593 7.19447 4.66842L6.92638 4.36557C6.88647 4.32036 6.82896 4.29465 6.7688 4.29465C6.70863 4.29465 6.65112 4.32052 6.61121 4.36557L6.38131 4.6254C6.30603 4.71034 6.19801 4.75913 6.08454 4.75913H2.46703C2.36401 5.05278 2.29683 5.36296 2.27002 5.68467H5.68505C5.74506 5.68467 5.80258 5.66019 5.84404 5.61686L6.16201 5.28502C6.20175 5.24356 6.25662 5.22018 6.31398 5.22018H6.32707C6.38739 5.22018 6.44475 5.24606 6.48465 5.29126L6.75258 5.59411C6.80355 5.65178 6.87681 5.68467 6.95381 5.68467H9.74133C9.71452 5.3628 9.64734 5.05263 9.54431 4.75913H8.05641L8.05656 4.75897ZM4.33651 7.63095C4.39652 7.63095 4.45404 7.60648 4.4955 7.56315L4.81347 7.23131C4.85321 7.18985 4.90808 7.16647 4.96544 7.16647H4.97853C5.03885 7.16647 5.09621 7.19234 5.13611 7.23739L5.40404 7.54024C5.45501 7.59791 5.52827 7.6308 5.60527 7.6308H9.38285C9.52438 7.33839 9.62803 7.02463 9.68975 6.69591H6.06383C5.98683 6.69591 5.91357 6.66287 5.8626 6.60535L5.59467 6.3025C5.55477 6.2573 5.49725 6.23158 5.43709 6.23158C5.37692 6.23158 5.31941 6.25746 5.27951 6.3025L5.0496 6.56233C4.97432 6.64728 4.86631 6.69606 4.75268 6.69606H2.32147C2.3832 7.02479 2.487 7.33855 2.62837 7.63095H4.33651ZM5.57359 8.55745H4.59116C4.51417 8.55745 4.44091 8.52441 4.38994 8.46689L4.12201 8.16404C4.0821 8.11884 4.02459 8.09312 3.96442 8.09312C3.90426 8.09312 3.84675 8.119 3.80684 8.16404L3.57694 8.42387C3.50166 8.50882 3.39364 8.55761 3.28001 8.55761H3.26474C3.94915 9.29096 4.92378 9.74998 6.00596 9.74998C7.08815 9.74998 8.06262 9.29096 8.74719 8.55761H5.57359V8.55745Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n});\nSmallMovementLogo.displayName = \"SmallMovementLogo\";\n","import {\n AdapterNotDetectedWallet,\n AdapterWallet,\n WalletReadyState,\n isRedirectable,\n} from \"@moveindustries/wallet-adapter-core\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { createContext, forwardRef, useCallback, useContext } from \"react\";\nimport { useWallet } from \"../useWallet\";\nimport { HeadlessComponentProps, createHeadlessComponent } from \"./utils\";\n\nexport interface WalletItemProps extends HeadlessComponentProps {\n /** The wallet option to be displayed. */\n wallet: AdapterWallet | AdapterNotDetectedWallet;\n /** A callback to be invoked when the wallet is connected. */\n onConnect?: () => void;\n}\n\nfunction useWalletItemContext(displayName: string) {\n const context = useContext(WalletItemContext);\n\n if (!context) {\n throw new Error(`\\`${displayName}\\` must be used within \\`WalletItem\\``);\n }\n\n return context;\n}\n\nconst WalletItemContext = createContext<{\n wallet: AdapterWallet | AdapterNotDetectedWallet;\n connectWallet: () => void;\n} | null>(null);\n\nconst Root = forwardRef<HTMLDivElement, WalletItemProps>(\n ({ wallet, onConnect, className, asChild, children }, ref) => {\n const { connect } = useWallet();\n\n const connectWallet = useCallback(() => {\n connect(wallet.name);\n onConnect?.();\n }, [connect, wallet.name, onConnect]);\n\n const isWalletReady = wallet.readyState === WalletReadyState.Installed;\n\n const mobileSupport =\n \"deeplinkProvider\" in wallet && wallet.deeplinkProvider;\n\n if (!isWalletReady && isRedirectable() && !mobileSupport) return null;\n\n const Component = asChild ? Slot : \"div\";\n\n return (\n <WalletItemContext.Provider value={{ wallet, connectWallet }}>\n <Component ref={ref} className={className}>\n {children}\n </Component>\n </WalletItemContext.Provider>\n );\n },\n);\nRoot.displayName = \"WalletItem\";\n\nconst Icon = createHeadlessComponent(\n \"WalletItem.Icon\",\n \"img\",\n (displayName) => {\n const context = useWalletItemContext(displayName);\n\n return {\n src: context.wallet.icon,\n alt: `${context.wallet.name} icon`,\n };\n },\n);\n\nconst Name = createHeadlessComponent(\n \"WalletItem.Name\",\n \"div\",\n (displayName) => {\n const context = useWalletItemContext(displayName);\n\n return {\n children: context.wallet.name,\n };\n },\n);\n\nconst ConnectButton = createHeadlessComponent(\n \"WalletItem.ConnectButton\",\n \"button\",\n (displayName) => {\n const context = useWalletItemContext(displayName);\n\n return {\n onClick: context.connectWallet,\n children: \"Connect\",\n };\n },\n);\n\nconst InstallLink = createHeadlessComponent(\n \"WalletItem.InstallLink\",\n \"a\",\n (displayName) => {\n const context = useWalletItemContext(displayName);\n\n return {\n href: context.wallet.url,\n target: \"_blank\",\n rel: \"noopener noreferrer\",\n children: \"Install\",\n };\n },\n);\n\n/** A headless component for rendering a wallet option's name, icon, and either connect button or install link. */\nexport const WalletItem = Object.assign(Root, {\n Icon,\n Name,\n ConnectButton,\n InstallLink,\n});\n"],"mappings":"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","names":["walletCore","network","wallet","wallets","jsx","jsx","Fragment","jsx","Root","Trigger","forwardRef","forwardRef","jsx","forwardRef","jsx","Root","forwardRef","WalletReadyState","Slot","createContext","forwardRef","useCallback","useContext","jsx","useContext","createContext","Root","forwardRef","useCallback","WalletReadyState","Slot"]}
@@ -0,0 +1,31 @@
1
+ import { AccountAuthenticator, AccountInfo, AdapterWallet, AnyRawTransaction, MovementSignAndSubmitTransactionOutput, InputTransactionData, NetworkInfo, MovementSignMessageInput, MovementSignMessageOutput, AdapterNotDetectedWallet, Network, MovementChangeNetworkOutput, PendingTransactionResponse, InputSubmitTransactionData, MovementSignInInput, MovementSignInOutput } from "@moveindustries/wallet-adapter-core";
2
+ export interface WalletContextState {
3
+ connected: boolean;
4
+ isLoading: boolean;
5
+ account: AccountInfo | null;
6
+ network: NetworkInfo | null;
7
+ connect(walletName: string): void;
8
+ signIn(args: {
9
+ walletName: string;
10
+ input: MovementSignInInput;
11
+ }): Promise<MovementSignInOutput | void>;
12
+ signAndSubmitTransaction(transaction: InputTransactionData): Promise<MovementSignAndSubmitTransactionOutput>;
13
+ signTransaction(args: {
14
+ transactionOrPayload: AnyRawTransaction | InputTransactionData;
15
+ asFeePayer?: boolean;
16
+ }): Promise<{
17
+ authenticator: AccountAuthenticator;
18
+ rawTransaction: Uint8Array;
19
+ }>;
20
+ signMessage(message: MovementSignMessageInput): Promise<MovementSignMessageOutput>;
21
+ signMessageAndVerify(message: MovementSignMessageInput): Promise<boolean>;
22
+ disconnect(): void;
23
+ changeNetwork(network: Network): Promise<MovementChangeNetworkOutput>;
24
+ submitTransaction(transaction: InputSubmitTransactionData): Promise<PendingTransactionResponse>;
25
+ wallet: AdapterWallet | null;
26
+ wallets: ReadonlyArray<AdapterWallet>;
27
+ notDetectedWallets: ReadonlyArray<AdapterNotDetectedWallet>;
28
+ }
29
+ export declare const WalletContext: import("react").Context<WalletContextState>;
30
+ export declare function useWallet(): WalletContextState;
31
+ //# sourceMappingURL=useWallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWallet.d.ts","sourceRoot":"","sources":["../src/useWallet.tsx"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,sCAAsC,EACtC,oBAAoB,EACpB,WAAW,EACX,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,OAAO,EACP,2BAA2B,EAC3B,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qCAAqC,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,MAAM,CAAC,IAAI,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,mBAAmB,CAAC;KAC5B,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACzC,wBAAwB,CACtB,WAAW,EAAE,oBAAoB,GAChC,OAAO,CAAC,sCAAsC,CAAC,CAAC;IACnD,eAAe,CAAC,IAAI,EAAE;QACpB,oBAAoB,EAAE,iBAAiB,GAAG,oBAAoB,CAAC;QAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,GAAG,OAAO,CAAC;QACV,aAAa,EAAE,oBAAoB,CAAC;QACpC,cAAc,EAAE,UAAU,CAAC;KAC5B,CAAC,CAAC;IACH,WAAW,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACnF,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,UAAU,IAAI,IAAI,CAAC;IACnB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACtE,iBAAiB,CACf,WAAW,EAAE,0BAA0B,GACtC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACvC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IACtC,kBAAkB,EAAE,aAAa,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAMD,eAAO,MAAM,aAAa,6CAEzB,CAAC;AAEF,wBAAgB,SAAS,IAAI,kBAAkB,CAM9C"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@moveindustries/wallet-adapter-react",
3
+ "version": "7.2.2",
4
+ "description": "Movement Wallet Adapter React Provider",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "license": "Apache-2.0",
9
+ "exports": {
10
+ "types": "./dist/index.d.ts",
11
+ "require": "./dist/index.js",
12
+ "import": "./dist/index.mjs"
13
+ },
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/MoveIndustries/movement-wallet-adapter.git"
17
+ },
18
+ "homepage": "https://github.com/MoveIndustries/movement-wallet-adapter",
19
+ "bugs": {
20
+ "url": "https://github.com/MoveIndustries/movement-wallet-adapter/issues"
21
+ },
22
+ "author": "movementlabs.xyz",
23
+ "keywords": [
24
+ "Movement",
25
+ "Movement Labs",
26
+ "Wallet",
27
+ "Wallet Adapter",
28
+ "Wallet Adapter Provider",
29
+ "React"
30
+ ],
31
+ "devDependencies": {
32
+ "@types/react": "^18.3.3",
33
+ "@types/react-dom": "^18.3.0",
34
+ "eslint": "^8.57.1",
35
+ "tsup": "^8.4.0",
36
+ "typescript": "^5.8.3",
37
+ "@moveindustries/wallet-adapter-tsconfig": "0.0.2"
38
+ },
39
+ "dependencies": {
40
+ "@radix-ui/react-slot": "^1.0.2",
41
+ "@moveindustries/wallet-adapter-core": "7.8.0"
42
+ },
43
+ "peerDependencies": {
44
+ "react": "^18.0.0 || ^19.0.0"
45
+ },
46
+ "files": [
47
+ "dist",
48
+ "src",
49
+ "!src/**.test.ts",
50
+ "!src/**/__tests__"
51
+ ],
52
+ "scripts": {
53
+ "build:bundle": "tsup src/index.tsx --format esm,cjs --sourcemap",
54
+ "build:declarations": "tsc --emitDeclarationOnly --declaration --declarationMap",
55
+ "build": "pnpm build:bundle && pnpm build:declarations",
56
+ "dev": "tsup src/index.tsx --format esm,cjs --watch",
57
+ "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
58
+ "lint": "TIMING=1 eslint \"src/**/*.ts*\""
59
+ }
60
+ }
@@ -0,0 +1,424 @@
1
+ import {
2
+ AvailableWallets,
3
+ DappConfig,
4
+ AccountInfo,
5
+ AdapterWallet,
6
+ NetworkInfo,
7
+ InputTransactionData,
8
+ MovementSignAndSubmitTransactionOutput,
9
+ AnyRawTransaction,
10
+ InputGenerateTransactionOptions,
11
+ AccountAuthenticator,
12
+ MovementSignMessageInput,
13
+ MovementSignMessageOutput,
14
+ AdapterNotDetectedWallet,
15
+ WalletCore,
16
+ Network,
17
+ InputSubmitTransactionData,
18
+ PendingTransactionResponse,
19
+ WalletReadyState,
20
+ MovementSignInInput,
21
+ MovementSignInOutput,
22
+ } from "@moveindustries/wallet-adapter-core";
23
+ import { ReactNode, FC, useState, useEffect, useCallback, useRef } from "react";
24
+ import { WalletContext } from "./useWallet";
25
+
26
+ export interface MovementWalletProviderProps {
27
+ children: ReactNode;
28
+ optInWallets?: ReadonlyArray<AvailableWallets>;
29
+ autoConnect?:
30
+ | boolean
31
+ | ((core: WalletCore, adapter: AdapterWallet) => Promise<boolean>);
32
+ dappConfig?: DappConfig;
33
+ disableTelemetry?: boolean;
34
+ onError?: (error: any) => void;
35
+ }
36
+
37
+ const initialState: {
38
+ account: AccountInfo | null;
39
+ network: NetworkInfo | null;
40
+ connected: boolean;
41
+ wallet: AdapterWallet | null;
42
+ } = {
43
+ connected: false,
44
+ account: null,
45
+ network: null,
46
+ wallet: null,
47
+ };
48
+
49
+ export const MovementWalletAdapterProvider: FC<MovementWalletProviderProps> = ({
50
+ children,
51
+ optInWallets,
52
+ autoConnect = false,
53
+ dappConfig,
54
+ disableTelemetry = false,
55
+ onError,
56
+ }: MovementWalletProviderProps) => {
57
+ const didAttemptAutoConnectRef = useRef(false);
58
+
59
+ const [{ account, network, connected, wallet }, setState] =
60
+ useState(initialState);
61
+
62
+ const [isLoading, setIsLoading] = useState<boolean>(true);
63
+ const [walletCore, setWalletCore] = useState<WalletCore>();
64
+
65
+ const [wallets, setWallets] = useState<ReadonlyArray<AdapterWallet>>([]);
66
+ const [notDetectedWallets, setNotDetectedWallets] = useState<
67
+ ReadonlyArray<AdapterNotDetectedWallet>
68
+ >([]);
69
+ // Initialize WalletCore on first load
70
+ useEffect(() => {
71
+ const walletCore = new WalletCore(
72
+ optInWallets,
73
+ dappConfig,
74
+ disableTelemetry,
75
+ );
76
+ setWalletCore(walletCore);
77
+ }, []);
78
+
79
+ // Update initial Wallets state once WalletCore has been initialized
80
+ useEffect(() => {
81
+ setWallets(walletCore?.wallets ?? []);
82
+ setNotDetectedWallets(walletCore?.notDetectedWallets ?? []);
83
+ }, [walletCore]);
84
+
85
+ useEffect(() => {
86
+ // Only attempt to auto connect once per render and only if there are wallets
87
+ if (didAttemptAutoConnectRef.current || !walletCore?.wallets.length) {
88
+ return;
89
+ }
90
+ didAttemptAutoConnectRef.current = true;
91
+
92
+ // If auto connect is not set or is false, ignore the attempt
93
+ if (!autoConnect) {
94
+ setIsLoading(false);
95
+ return;
96
+ }
97
+
98
+ // Make sure the user has a previously connected wallet
99
+ const walletName = localStorage.getItem("MovementWalletName");
100
+ if (!walletName) {
101
+ setIsLoading(false);
102
+ return;
103
+ }
104
+
105
+ // Make sure the wallet is installed
106
+ const selectedWallet = walletCore.wallets.find(
107
+ (e) => e.name === walletName,
108
+ ) as AdapterWallet | undefined;
109
+ if (
110
+ !selectedWallet ||
111
+ selectedWallet.readyState !== WalletReadyState.Installed
112
+ ) {
113
+ setIsLoading(false);
114
+ return;
115
+ }
116
+
117
+ if (!connected) {
118
+ (async () => {
119
+ try {
120
+ let shouldConnect = true;
121
+
122
+ // Providing a function to autoConnect allows the dapp to determine
123
+ // whether to attempt to connect to the wallet using the `signIn`
124
+ // or `connect` method. If `signIn` is successful, the user can
125
+ // return `false` and skip the `connect` method.
126
+ if (typeof autoConnect === "function") {
127
+ shouldConnect = await autoConnect(walletCore, selectedWallet);
128
+ } else {
129
+ shouldConnect = autoConnect;
130
+ }
131
+
132
+ if (shouldConnect) await connect(walletName);
133
+ } catch (error) {
134
+ if (onError) onError(error);
135
+ return Promise.reject(error);
136
+ } finally {
137
+ setIsLoading(false);
138
+ }
139
+ })();
140
+ } else {
141
+ setIsLoading(false);
142
+ }
143
+ }, [autoConnect, wallets]);
144
+
145
+ const connect = async (walletName: string): Promise<void> => {
146
+ try {
147
+ setIsLoading(true);
148
+ await walletCore?.connect(walletName);
149
+ } catch (error: any) {
150
+ if (onError) onError(error);
151
+ return Promise.reject(error);
152
+ } finally {
153
+ setIsLoading(false);
154
+ }
155
+ };
156
+
157
+ const signIn = async (args: {
158
+ walletName: string;
159
+ input: MovementSignInInput;
160
+ }): Promise<MovementSignInOutput> => {
161
+ if (!walletCore) {
162
+ throw new Error("WalletCore is not initialized");
163
+ }
164
+
165
+ try {
166
+ setIsLoading(true);
167
+ return await walletCore?.signIn(args);
168
+ } catch (error: any) {
169
+ if (onError) onError(error);
170
+ return Promise.reject(error);
171
+ } finally {
172
+ setIsLoading(false);
173
+ }
174
+ };
175
+
176
+ const disconnect = async (): Promise<void> => {
177
+ try {
178
+ await walletCore?.disconnect();
179
+ } catch (error) {
180
+ if (onError) onError(error);
181
+ return Promise.reject(error);
182
+ }
183
+ };
184
+
185
+ const signAndSubmitTransaction = async (
186
+ transaction: InputTransactionData,
187
+ ): Promise<MovementSignAndSubmitTransactionOutput> => {
188
+ try {
189
+ if (!walletCore) {
190
+ throw new Error("WalletCore is not initialized");
191
+ }
192
+ return await walletCore.signAndSubmitTransaction(transaction);
193
+ } catch (error: any) {
194
+ if (onError) onError(error);
195
+ return Promise.reject(error);
196
+ }
197
+ };
198
+
199
+ const signTransaction = async (args: {
200
+ transactionOrPayload: AnyRawTransaction | InputTransactionData;
201
+ asFeePayer?: boolean;
202
+ options?: InputGenerateTransactionOptions & {
203
+ expirationSecondsFromNow?: number;
204
+ expirationTimestamp?: number;
205
+ };
206
+ }): Promise<{
207
+ authenticator: AccountAuthenticator;
208
+ rawTransaction: Uint8Array;
209
+ }> => {
210
+ const { transactionOrPayload, asFeePayer, options } = args;
211
+ if (!walletCore) {
212
+ throw new Error("WalletCore is not initialized");
213
+ }
214
+ try {
215
+ return await walletCore.signTransaction({
216
+ transactionOrPayload,
217
+ asFeePayer,
218
+ });
219
+ } catch (error: any) {
220
+ if (onError) onError(error);
221
+ return Promise.reject(error);
222
+ }
223
+ };
224
+
225
+ const submitTransaction = async (
226
+ transaction: InputSubmitTransactionData,
227
+ ): Promise<PendingTransactionResponse> => {
228
+ if (!walletCore) {
229
+ throw new Error("WalletCore is not initialized");
230
+ }
231
+ try {
232
+ return await walletCore?.submitTransaction(transaction);
233
+ } catch (error: any) {
234
+ if (onError) onError(error);
235
+ return Promise.reject(error);
236
+ }
237
+ };
238
+
239
+ const signMessage = async (
240
+ message: MovementSignMessageInput,
241
+ ): Promise<MovementSignMessageOutput> => {
242
+ if (!walletCore) {
243
+ throw new Error("WalletCore is not initialized");
244
+ }
245
+ try {
246
+ return await walletCore?.signMessage(message);
247
+ } catch (error: any) {
248
+ if (onError) onError(error);
249
+ return Promise.reject(error);
250
+ }
251
+ };
252
+
253
+ const signMessageAndVerify = async (
254
+ message: MovementSignMessageInput,
255
+ ): Promise<boolean> => {
256
+ if (!walletCore) {
257
+ throw new Error("WalletCore is not initialized");
258
+ }
259
+ try {
260
+ return await walletCore?.signMessageAndVerify(message);
261
+ } catch (error: any) {
262
+ if (onError) onError(error);
263
+ return Promise.reject(error);
264
+ }
265
+ };
266
+
267
+ const changeNetwork = async (network: Network) => {
268
+ if (!walletCore) {
269
+ throw new Error("WalletCore is not initialized");
270
+ }
271
+ try {
272
+ return await walletCore?.changeNetwork(network);
273
+ } catch (error: any) {
274
+ if (onError) onError(error);
275
+ return Promise.reject(error);
276
+ }
277
+ };
278
+
279
+ // Handle the adapter's connect event
280
+ const handleConnect = (): void => {
281
+ setState((state) => {
282
+ return {
283
+ ...state,
284
+ connected: true,
285
+ account: walletCore?.account || null,
286
+ network: walletCore?.network || null,
287
+ wallet: walletCore?.wallet || null,
288
+ };
289
+ });
290
+ };
291
+
292
+ // Handle the adapter's account change event
293
+ const handleAccountChange = useCallback((): void => {
294
+ if (!connected) return;
295
+ if (!walletCore?.wallet) return;
296
+ setState((state) => {
297
+ return {
298
+ ...state,
299
+ account: walletCore?.account || null,
300
+ };
301
+ });
302
+ }, [connected]);
303
+
304
+ // Handle the adapter's network event
305
+ const handleNetworkChange = useCallback((): void => {
306
+ if (!connected) return;
307
+ if (!walletCore?.wallet) return;
308
+ setState((state) => {
309
+ return {
310
+ ...state,
311
+ network: walletCore?.network || null,
312
+ };
313
+ });
314
+ }, [connected]);
315
+
316
+ useEffect(() => {
317
+ if (connected) {
318
+ walletCore?.onAccountChange();
319
+ walletCore?.onNetworkChange();
320
+ }
321
+ }, [connected]);
322
+
323
+ // Handle the adapter's disconnect event
324
+ const handleDisconnect = (): void => {
325
+ if (!connected) return;
326
+ setState((state) => {
327
+ return {
328
+ ...state,
329
+ connected: false,
330
+ account: walletCore?.account || null,
331
+ network: walletCore?.network || null,
332
+ wallet: null,
333
+ };
334
+ });
335
+ };
336
+
337
+ const handleStandardWalletsAdded = (standardWallet: AdapterWallet): void => {
338
+ // Manage current wallet state by removing optional duplications
339
+ // as new wallets are coming
340
+ const existingWalletIndex = wallets.findIndex(
341
+ (wallet) => wallet.name == standardWallet.name,
342
+ );
343
+ if (existingWalletIndex !== -1) {
344
+ // If wallet exists, replace it with the new wallet
345
+ setWallets((wallets) => [
346
+ ...wallets.slice(0, existingWalletIndex),
347
+ standardWallet,
348
+ ...wallets.slice(existingWalletIndex + 1),
349
+ ]);
350
+ } else {
351
+ // If wallet doesn't exist, add it to the array
352
+ setWallets((wallets) => [...wallets, standardWallet]);
353
+ }
354
+ };
355
+
356
+ const handleStandardNotDetectedWalletsAdded = (
357
+ notDetectedWallet: AdapterNotDetectedWallet,
358
+ ): void => {
359
+ // Manage current wallet state by removing optional duplications
360
+ // as new wallets are coming
361
+ const existingWalletIndex = wallets.findIndex(
362
+ (wallet) => wallet.name == notDetectedWallet.name,
363
+ );
364
+ if (existingWalletIndex !== -1) {
365
+ // If wallet exists, replace it with the new wallet
366
+ setNotDetectedWallets((wallets) => [
367
+ ...wallets.slice(0, existingWalletIndex),
368
+ notDetectedWallet,
369
+ ...wallets.slice(existingWalletIndex + 1),
370
+ ]);
371
+ } else {
372
+ // If wallet doesn't exist, add it to the array
373
+ setNotDetectedWallets((wallets) => [...wallets, notDetectedWallet]);
374
+ }
375
+ };
376
+
377
+ useEffect(() => {
378
+ walletCore?.on("connect", handleConnect);
379
+ walletCore?.on("accountChange", handleAccountChange);
380
+ walletCore?.on("networkChange", handleNetworkChange);
381
+ walletCore?.on("disconnect", handleDisconnect);
382
+ walletCore?.on("standardWalletsAdded", handleStandardWalletsAdded);
383
+ walletCore?.on(
384
+ "standardNotDetectedWalletAdded",
385
+ handleStandardNotDetectedWalletsAdded,
386
+ );
387
+ return () => {
388
+ walletCore?.off("connect", handleConnect);
389
+ walletCore?.off("accountChange", handleAccountChange);
390
+ walletCore?.off("networkChange", handleNetworkChange);
391
+ walletCore?.off("disconnect", handleDisconnect);
392
+ walletCore?.off("standardWalletsAdded", handleStandardWalletsAdded);
393
+ walletCore?.off(
394
+ "standardNotDetectedWalletAdded",
395
+ handleStandardNotDetectedWalletsAdded,
396
+ );
397
+ };
398
+ }, [wallets, account]);
399
+
400
+ return (
401
+ <WalletContext.Provider
402
+ value={{
403
+ connect,
404
+ signIn,
405
+ disconnect,
406
+ signAndSubmitTransaction,
407
+ signTransaction,
408
+ signMessage,
409
+ signMessageAndVerify,
410
+ changeNetwork,
411
+ submitTransaction,
412
+ account,
413
+ network,
414
+ connected,
415
+ wallet,
416
+ wallets,
417
+ notDetectedWallets,
418
+ isLoading,
419
+ }}
420
+ >
421
+ {children}
422
+ </WalletContext.Provider>
423
+ );
424
+ };
@@ -0,0 +1,60 @@
1
+ // TODO: Re-enable when Movement supports social sign-in (Movement Connect)
2
+ // This is a stub component that just renders children - social sign-in education screens are disabled
3
+
4
+ import {
5
+ ForwardRefExoticComponent,
6
+ ReactNode,
7
+ RefAttributes,
8
+ SVGProps,
9
+ } from "react";
10
+ import { HeadlessComponentProps, createHeadlessComponent } from "./utils";
11
+
12
+ /** @deprecated Use AboutPetraWeb instead. Social sign-in disabled. */
13
+ export interface AboutMovementConnectEducationScreen {
14
+ Graphic: ForwardRefExoticComponent<
15
+ Omit<SVGProps<SVGSVGElement>, "ref"> & RefAttributes<SVGSVGElement>
16
+ >;
17
+ Title: ForwardRefExoticComponent<
18
+ HeadlessComponentProps & RefAttributes<HTMLHeadingElement>
19
+ >;
20
+ Description: ForwardRefExoticComponent<
21
+ HeadlessComponentProps & RefAttributes<HTMLParagraphElement>
22
+ >;
23
+ screenIndex: number;
24
+ totalScreens: number;
25
+ screenIndicators: ForwardRefExoticComponent<HeadlessComponentProps & RefAttributes<HTMLButtonElement>>[];
26
+ back: () => void;
27
+ next: () => void;
28
+ cancel: () => void;
29
+ }
30
+
31
+ /** @deprecated Use AboutPetraWebProps instead. Social sign-in disabled. */
32
+ export interface AboutMovementConnectProps {
33
+ renderEducationScreen: (screen: AboutMovementConnectEducationScreen) => ReactNode;
34
+ children?: ReactNode;
35
+ }
36
+
37
+ /**
38
+ * @deprecated Social sign-in disabled - this component just renders children without any education screens
39
+ */
40
+ const Root = ({ children }: AboutMovementConnectProps) => {
41
+ return <>{children}</>;
42
+ };
43
+ Root.displayName = "AboutMovementConnect";
44
+
45
+ const Trigger = createHeadlessComponent(
46
+ "AboutMovementConnect.Trigger",
47
+ "button",
48
+ () => ({
49
+ // No-op since social sign-in is disabled
50
+ onClick: () => {},
51
+ style: { display: "none" },
52
+ }),
53
+ );
54
+
55
+ /**
56
+ * @deprecated Social sign-in disabled - this component just renders children
57
+ */
58
+ export const AboutMovementConnect = Object.assign(Root, {
59
+ Trigger,
60
+ });