npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@talismn/connect-components

v1.1.9

Published

The Wallet Connection UI is core to all Dapps in existence.

Downloads

1,147

Readme

@talismn/connect-components

The Wallet Connection UI is core to all Dapps in existence.

Every Dapp developer will have to implement logic and edge cases of connecting to different wallets which may take days to implement.

The WalletSelect component in @talismn/connect-components will be a massive time saver for Dapp developers without an existing wallet selection ui.

If you have an existing modal, the WalletSelectButton in @talismn/connect-components may be better suited to your needs.

If you require a bespoke ui modal, you can use the @talismn/connect-wallets to build out your own modal.

More components will be developed along the way.

Setup:

pnpm add @talismn/connect-components @talismn/connect-wallets @talismn/connect-ui

Usage

[Important] Replace related functions from @polkadot/extension-dapp

If there are multiple PolkadotJS based browser extensions installed, the web3Enable function will trigger multiple popups as well.

This is not ideal for dapps that have one wallet active at one time.

So we need to remove calls to web3Enable.

However, calls to web3* functions from @polkadot/extension-dapp will not work anymore once web3Enable is removed.

Only web3FromSource has a drop-in replacement for now. Please see below for an example.

If you have calls to web3FromAddress, do note that web3FromSource will suffice as all the addresses will be from the same "source" anyway.

WalletSelect

This component is the wallet selection modal.

import { WalletSelect } from '@talismn/connect-components';

return <WalletSelect
  // [Required] The dapp name
  dappName="My First Dapp"

  // Use if the dapp is controlling the modal toggle.
  open={true}

  // The component that opens the WalletSelect Modal
  triggerComponent={
    <button
      // `onClick` is optional here
      onClick={(wallets) => {
        // Do stuff with the supported wallets
      }}
    >
      Connect to wallet
    </button>
  }

  // Override the default header
  header={}

  // Override the default footer
  footer={}

  // If `showAccountsList={true}`, then account selection modal will show up after selecting the a wallet. Default is `false`.
  showAccountsList={false}

  // Callback when the WalletSelect Modal is opened
  onWalletConnectOpen={(wallets) => { ... }}

  // Callback when the WalletSelect Modal is closed
  onWalletConnectClose={() => { ... }}

  // Callback when a wallet is selected on the WalletSelect Modal
  onWalletSelected={(wallet) => { ... }}

  // Callback when the subscribed accounts for a selected wallet are updated
  onUpdatedAccounts={(accounts) => { ... }}

  // Callback when an account is selected on the WalletSelect Account Modal. Only relevant when `showAccountsList=true`
  onAccountSelected={(account) => { ... }}

  // Callback when an error occurs. Also clears the error on Modal actions:
  // `onWalletConnectOpen`, `onWalletSelected`, `onAccountSelected` and `onWalletConnectClose`,
  onError={(error) => { ... }}
/>;

web3FromSource

This function is a drop-in replacement for the @polkadot/extension-dapp version which triggers multiple popups.

This uses the localStorage value for @talisman-connect/selected-wallet-name which is updated by WalletSelect or WalletSelectButton and retrieves the extension object.

import { web3FromSource } from '@talismn/connect-components'

// This is the object that cointains the `signer` amongs all others.
const injector = web3FromSource()

WalletSelectButton (WIP)

This component is the actual wallet selector. You can use this is if you have an existing modal. However, we do recommend using WalletSelect in general.

import { WalletSelectButton } from '@talismn/connect-components'
import { TalismanWallet } from '@talismn/connect-wallets'

const talismanWallet = new TalismanWallet()

return (
  <WalletSelectButton
    wallet={talismanWallet}
    onClick={(accounts) => {
      // accounts === undefined is an Error state
    }}
  >
    <img
      width={32}
      height={32}
      src={talismanWallet.logo.src}
      alt={talismanWallet.logo.alt}
    />
    {talismanWallet.title}
  </WalletSelectButton>
)

Events and persistence

@talisman-connect/selected-wallet-name (LocalStorage)

Description: Updated on WalletSelect.onWalletSelected ONLY if there are no errors for the selected wallet.

Removing this item will be equivalent to a "disconnection" behaviour for Dapps.

@talisman-connect/wallet-selected (CustomEvent)

Description: Dispatched on WalletSelect.onWalletSelected ONLY if there are no errors for the selected wallet.

Params: { detail: Wallet }

To listen to this event:

document.addEventListener('@talisman-connect/wallet-selected', function() {
  // ...
})

Overriding styles (Example)

NOTE: By default WalletSelect modal is appended as the last child of document.body.

So if your base styles (i.e font-family, color, etc.) are done from html and/or body for example, then WalletSelect will inherit the correct styles.

:root {
  /* ... other styles ... */

  /* Light theme */
  --talisman-connect-control-background: #f2f2f2;
  --talisman-connect-control-foreground: inherit;
  --talisman-connect-active-background: #e5e5e5;
  --talisman-connect-active-foreground: inherit;
  --talisman-connect-modal-background: #fafafa;
  --talisman-connect-modal-foreground: inherit;
  --talisman-connect-button-background: var(
    --talisman-connect-control-background
  );
  --talisman-connect-button-foreground: inherit;

  --talisman-connect-modal-gutter: 2rem;
  --talisman-connect-font-family: sans-serif;
  --talisman-connect-border-radius: 1rem;

  --talisman-connect-modal-width: 90%;
  --talisman-connect-modal-max-width: 470px;
  --talisman-connect-modal-max-height: 470px;

  --talisman-connect-button-gutter: 1rem;
  --talisman-connect-button-border-radius: 0.75rem;
}

.dark-mode {
  --talisman-connect-control-background: #383838;
  --talisman-connect-control-foreground: inherit;
  --talisman-connect-active-background: #5a5a5a;
  --talisman-connect-active-foreground: inherit;
  --talisman-connect-modal-background: #222;
  --talisman-connect-modal-foreground: #fafafa;
  --talisman-connect-button-background: var(
    --talisman-connect-control-background
  );
  --talisman-connect-button-foreground: #fafafa;
}

@media (min-width: 768px) {
  :root {
    --talisman-connect-modal-min-width: 470px;
    --talisman-connect-modal-max-width: 470px;
  }
}

Adding new wallets into the WalletSelect Modal

Refer to @talismn/connect-wallets for more details.

Dependencies:

Troubleshooting

If in case there is an error parsing import.meta, please add the following to webpack config:

webpackConfig.module.rules.push({
  test: /\.js$/,
  loader: require.resolve('@open-wc/webpack-import-meta-loader'),
})

For "unejected" Create React App projects, please see craco.config.js below:

// craco.config.js
// Solution comes from https://polkadot.js.org/docs/usage/FAQ/#on-webpack-4-i-have-a-parse-error-on-importmetaurl
const ImportMetaLoaderPlugin = {
  plugin: {
    overrideWebpackConfig: ({ webpackConfig }) => {
      if (!webpackConfig.module) webpackConfig.module = { rules: [] }
      if (!webpackConfig.module.rules) webpackConfig.module.rules = []
      webpackConfig.module.rules.push({
        test: /\.js$/,
        loader: require.resolve('@open-wc/webpack-import-meta-loader'),
      })

      return webpackConfig
    },
  },
}

module.exports = {
  plugins: [ImportMetaLoaderPlugin],
}