@yoroi/dapp-connector
TypeScript icon, indicating that this package has built-in type declarations

1.0.1 • Public • Published

Yoroi Dapp Connector Module

The Yoroi Dapp Connector package is a utility for interacting with dApps on the Cardano Blockchain.

Installation

Install the package using npm or yarn :

npm install @yoroi/dapp-connector --save
npm install @yoroi/types --save-dev
yarn add @yoroi/dapp-connector --save
yarn add @yoroi/types --save-dev

Usage

Integrating a wallet with a WebView

import {useAsyncStorage} from '@yoroi/common'
import {connectionStorageMaker, DappConnector, dappConnectorMaker} from '@yoroi/dapp-connector'

const createDappConnector = (appStorage: App.Storage) => {
  const storage = connectionStorageMaker(appStorage.join('dapp-connections/'))
  return dappConnectorMaker(storage)
}

const useDappConnector = () => {
  const appStorage = useAsyncStorage()
  return useMemo(() => createDappConnector(appStorage), [appStorage])
}

export const useConnectWalletToWebView = (
  wallet: YoroiWallet,
  webViewRef: RefObject<WebView | null>,
  sessionId: string,
) => {
  const dappConnector = useDappConnector()

  const sendMessageToWebView = (event: string) => (id: string, result: unknown, error?: Error) => {
    if (error) {
      console.log('DappConnector', 'sending error to webview', error, 'as a response to', event)
    } else {
      console.log('DappConnector', 'sending result to webview', result, 'as a response to', event)
    }

    webViewRef.current?.injectJavaScript(getInjectableMessage({id, result, error: error?.message || null}))
  }

  const handleWebViewEvent = async (e: WebViewMessageEvent) => {
    const {data} = e.nativeEvent
    const webViewUrl = e.nativeEvent.url

    const handlerWallet = {
      id: wallet.id,
      networkId: wallet.networkId,
      confirmConnection: async (origin: string) => {
        return new Promise<boolean>((resolve) => {
          Alert.alert('Confirm connection', `Do you want to connect to ${origin}?`, [
            {text: 'Cancel', style: 'cancel', onPress: () => resolve(false)},
            {text: 'OK', onPress: () => resolve(true)},
          ])
        })
      },
    }

    try {
      await dappConnector.handleEvent(data, webViewUrl, handlerWallet, sendMessageToWebView(data))
    } catch (e) {
      console.log('DappConnector', 'handleWebViewEvent::error', e)
    }
  }

  useEffect(() => {
    webViewRef.current?.injectJavaScript(getInitScript(sessionId, dappConnector))
  }, [wallet, webViewRef, sessionId, dappConnector])

  return {handleEvent: handleWebViewEvent, initScript: getInitScript(sessionId, dappConnector)}
}

const getInjectableMessage = (message: unknown) => {
  return `(() => window.dispatchEvent(new MessageEvent('message', {data: ${JSON.stringify(message)}})))()`
}

const WALLET_NAME = 'wallet-name'
const API_VERSION = '1.0.0'
const ICON_URL = 'data:image/svg+xml;base64,...'

const getInitScript = (sessionId: string, dappConnector: DappConnector) => {
  return dappConnector.getWalletConnectorScript({
    iconUrl: ICON_URL,
    apiVersion: API_VERSION,
    walletName: WALLET_NAME,
    sessionId,
  })
}

Package Sidebar

Install

npm i @yoroi/dapp-connector

Weekly Downloads

0

Version

1.0.1

License

Apache-2.0

Unpacked Size

537 kB

Total Files

221

Last publish

Collaborators

  • cryptotitan
  • vsubhuman
  • drkost
  • stackchain