From ef07c4df30bf6dfb251b072fe944aeb77e0de8c9 Mon Sep 17 00:00:00 2001 From: Doug Richar Date: Wed, 19 Jun 2024 03:37:23 -0400 Subject: [PATCH] feat(core): switching networks (#187) * feat(react): set algodClient to a useState variable This also refactors the `useWallet` hook so it directly accesses `WalletContext` (in place of the `useWalletManager` hook). Both modules are now in a single file - src/index.tsx * feat(vue): reactive algodClient * feat(solid): reactive algodClient * fix(solid): algodClient type * fix(vue): ensure algodClient is a defined computed value * fix(solid): fixes activeNetwork reactivity * feat: add network switcher to example apps * fix: "Set Active" button visibility in SolidJS example * feat: disconnect all wallets when switching networks * test: add/update tests for new setActiveNetwork logic * test: fix failing tests * refactor(solid): combine into one file --- examples/nextjs/src/app/Connect.module.css | 30 +++ examples/nextjs/src/app/Connect.tsx | 40 +++- examples/nuxt/components/Connect.vue | 78 +++++++- examples/react-ts/src/App.css | 30 +++ examples/react-ts/src/Connect.tsx | 40 +++- examples/solid-ts/src/App.css | 30 +++ examples/solid-ts/src/Connect.tsx | 51 ++++- examples/vanilla-ts/src/ActiveNetwork.ts | 57 ++++++ examples/vanilla-ts/src/main.ts | 4 + examples/vanilla-ts/src/style.css | 30 +++ examples/vue-ts/src/components/Connect.vue | 73 +++++++- .../use-wallet-react/src/WalletProvider.tsx | 42 ----- .../src/__tests__/WalletProvider.test.tsx | 52 ------ .../{useWallet.test.tsx => index.test.tsx} | 142 ++++++++++++-- packages/use-wallet-react/src/index.ts | 3 - .../src/{useWallet.ts => index.tsx} | 90 +++++++-- packages/use-wallet-react/tsup.config.ts | 2 +- .../use-wallet-solid/src/WalletProvider.tsx | 31 --- .../src/__tests__/WalletProvider.test.tsx | 53 ------ .../{useWallet.test.tsx => index.test.tsx} | 139 ++++++++++++-- packages/use-wallet-solid/src/index.tsx | 152 ++++++++++++++- packages/use-wallet-solid/src/useWallet.ts | 109 ----------- .../src/__tests__/useWallet.test.ts | 98 +++++++--- .../src/__tests__/walletManagerPlugin.test.ts | 109 ++++++++++- packages/use-wallet-vue/src/useWallet.ts | 49 ++++- .../use-wallet-vue/src/walletManagerPlugin.ts | 11 ++ .../use-wallet/src/__tests__/manager.test.ts | 176 ++++++++++++++++-- packages/use-wallet/src/manager.ts | 18 +- 28 files changed, 1323 insertions(+), 416 deletions(-) create mode 100644 examples/vanilla-ts/src/ActiveNetwork.ts delete mode 100644 packages/use-wallet-react/src/WalletProvider.tsx delete mode 100644 packages/use-wallet-react/src/__tests__/WalletProvider.test.tsx rename packages/use-wallet-react/src/__tests__/{useWallet.test.tsx => index.test.tsx} (72%) delete mode 100644 packages/use-wallet-react/src/index.ts rename packages/use-wallet-react/src/{useWallet.ts => index.tsx} (54%) delete mode 100644 packages/use-wallet-solid/src/WalletProvider.tsx delete mode 100644 packages/use-wallet-solid/src/__tests__/WalletProvider.test.tsx rename packages/use-wallet-solid/src/__tests__/{useWallet.test.tsx => index.test.tsx} (80%) delete mode 100644 packages/use-wallet-solid/src/useWallet.ts diff --git a/examples/nextjs/src/app/Connect.module.css b/examples/nextjs/src/app/Connect.module.css index 45a13db9..418469c1 100644 --- a/examples/nextjs/src/app/Connect.module.css +++ b/examples/nextjs/src/app/Connect.module.css @@ -1,3 +1,33 @@ +.networkGroup { + display: flex; + flex-direction: column; + align-items: center; + gap: 1em; + margin: 2em; + padding: 2em; + background-color: light-dark(rgba(0, 0, 0, 0.025), rgba(255, 255, 255, 0.025)); + border-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)); + border-style: solid; + border-width: 1px; + border-radius: 8px; +} + +.networkGroup h4 { + margin: 0; +} + +.networkGroup .activeNetwork { + text-transform: capitalize; +} + +.networkButtons { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + gap: 0.5em; +} + .walletGroup { display: flex; flex-direction: column; diff --git a/examples/nextjs/src/app/Connect.tsx b/examples/nextjs/src/app/Connect.tsx index 00df9a1b..0419480f 100644 --- a/examples/nextjs/src/app/Connect.tsx +++ b/examples/nextjs/src/app/Connect.tsx @@ -1,12 +1,19 @@ 'use client' -import { WalletId, useWallet, type Wallet } from '@txnlab/use-wallet-react' +import { NetworkId, WalletId, useWallet, type Wallet } from '@txnlab/use-wallet-react' import algosdk from 'algosdk' import * as React from 'react' import styles from './Connect.module.css' export function Connect() { - const { algodClient, activeAddress, transactionSigner, wallets } = useWallet() + const { + algodClient, + activeAddress, + activeNetwork, + setActiveNetwork, + transactionSigner, + wallets + } = useWallet() const [isSending, setIsSending] = React.useState(false) const [magicEmail, setMagicEmail] = React.useState('') @@ -73,6 +80,35 @@ export function Connect() { return (
+
+

+ Current Network: {activeNetwork} +

+
+ + + +
+
+ {wallets.map((wallet) => (

diff --git a/examples/nuxt/components/Connect.vue b/examples/nuxt/components/Connect.vue index bd9535f9..daac3a9a 100644 --- a/examples/nuxt/components/Connect.vue +++ b/examples/nuxt/components/Connect.vue @@ -1,9 +1,15 @@