Skip to main content

API

Initialization​

To setup the client you need to configure it with your projectId which you can obtain from WalletConnect Cloud.

Furthremore you may need to configure the domain and isLimited parameters:

  • domain defaults to window.location.host and must be set to the domain setup in Cloud Setup. For example app.example.com. Do not add the scheme (https://).
  • allApps determines if your app has access to all of the user's subscriptions, or only the ones that the app is hosted on. By setting it to true, it enables setting domain to a value other than window.location.host. Setting allApps: true can be useful during development to allow your localhost-deployed app to access the subscriptions for the domain you setup. Note that most apps do not need to set this in production environments, as they only need access to their own subscriptions. When enabled, the user has to sign a SIWE message granting your app more permissions, and this requires additional consideration from the user. Read here for more details.
initWeb3inboxClient({ projectId, domain, allApps, logLevel })

References​

  • projectId: Your WalletConnect project ID
  • domain (Optional): Your app's domain. Defaults to window.location.host.
  • allApps (Optional): Set to true to request access to all of the user's notification subscriptions for all apps, instead of only domain. Defaults to false.
  • logLevel (Optional): Increase verbosity of console logging. Defaults to error. Can be set to error, info, or debug.

Managing Account​

Setting account for web3inbox​

const {
data: account,
isRegistered,
identityKey,
setAccount,
error,
isLoading
} = useW3iAccount('eip155:1:0x9A...')

References​

  • data: CAIP-10 account currently active in Web3Inbox
  • setAccount: Change actively managed account in Web3Inbox. Does not need to be used as you can set the account directly in the params.
  • isRegistered: A boolean of whether or not the account currently set is registered
  • identityKey: Currently set account's identity key
  • error: A string, representing possible error of setting an account.
  • isLoading: A boolean, representing if an account is being set

Registering an account​

import { useSignMessage } from '@wagmi'
const { signMessageAsync } = useSignMessage()

const { isRegistered } = useW3iAccount('eip155:1:0x9A...')

const { prepareRegistration } = usePrepareRegistration()
const { register, isLoading: isRegistering } = useRegister()

const handleRegistration = async () => {
try {
const { message, registerParams } = await prepareRegistration()
const signature = await signMessageAsync({ message: message })
await register({ registerParams, signature })
} catch (registerIdentityError: any) {
console.error(registerIdentityError)
}
}

References​

  • isRegistered: A boolean of whether or not the account currently set is registered
  • prepareRegistration: Prepare registration params
  • register: Register using a signature and register params
  • isLoading: A boolean, representing if an account is being registered

Some suggested methods of signing the message:

Managing Subscription​

Subscribe, Unsubscribe, Get Subscription, Check if Subscribed.

note

When using differentAccount, the passed account needs to be previously registered. This use case is for Dapps that have multile active accounts or wallets with multiple active accounts. differentAccount can be used for all the below hooks and functions that accept account

const { subscribe, isLoading: isSubscribing } = useSubscribe()
const { unsubscribe, isLoading: isUnsubscribing } = useUnsubscribe()

// get subscription of current user to current dapp
const { data: subscription, getSubscription } = useSubscription()

// getSubscription can be used to get information about different dapps programatically
const subscriptionToSameDappFromDifferentAccount = getSubscription(differentAccount)
const subscriptionToDifferentDappFromSameAccount = getSubscription(undefined, differentDappDomain)
const subscriptionToDifferentDappFromDifferentAccount = getSubscription(
differentAccount,
differentDappDomain
)

// subscribe to current dapp from current user
subscribe()
// subscribe to current dapp from different user
subscribe(differentAccount)
// subscribe to different dapp from current user
subscribe(undefined, differentDappDomain)
// subscribe to different dapp from different user
subscribe(differentAccount, differentDappDomain)

// unsubscribe from current dapp
unsubscribe()

// get all subscriptions for current account
const subscriptions = useAllSubscriptions()

const isSubscribed = Boolean(subscription)

References​

  • account (Optional): CAIP-10 account
  • domain (Optional): dapp domain
  • subscribe: Function to subscribe to current dApp () => void
  • unsubscribe: Function to unsubscribe to current dApp () => void
  • isSubscribed: Reactive state, checking if subscribed to dApp Boolean
  • isSubscribing: If subscribe() is in-progress and has not finished yet
  • isUnsubscribing: If unsubscribe() is in-progress and has not finished yet
  • subscription: Reactive state, returning current subscription information, of type:
{
topic: string
account: string
relay: relayertypes.protocoloptions
metadata: Metadata
scope: ScopeMap
expiry: number
symkey: string
unreadCount: number
}
  • subscriptions: Reactive state, returning array of current subscriptions

Managing Notifications​

Get notifications

// watch notifications of current account's subscription to current dapp
const notificationsPerPage = 5
const isInfiniteScroll = true
const unreadFirst = true

const {
data: notifications,
nextPage,
markNotificationsAsRead,
markAllNotificationsAsRead
} = useNotifications(
notificationsPerPage,
isInfiniteScroll,
account,
domain,
unreadFirst,
onRead // optional function to run whenever messages are read
)

// marking a single notification as read
await notifications[0].markAsRead();

// mark specific notifications as read for default account and under default domain
await markNotificationsAsRead(notifications.slice(2).map(n => n.id));

// mark specific notifications as read for specified account under default domain
await markNotificationsAsRead(notifications.slice(2).map(n => n.id), differentAccount);

// mark specific notifications as read for default account under specified domain
await markNotificationsAsRead(notifications.slice(2).map(n => n.id), undefined, differentDomain);

// mark specific notifications as read for specified account under specified domain
await markNotificationsAsRead(notifications.slice(2).map(n => n.id), differentAccount, differentDomain);

// mark all notifications as read for default account under default domain
await markAllNotificationsAsRead();

// mark all notifications as read for specified account under default domain
await markAllNotificationsAsRead(differentAccount);

// mark all notifications as read for default account under specified domain
await markAllNotificationsAsRead(undefined, differentDomain);

// mark all notifications as read for specified account under specified domain
await markAllNotificationsAsRead(differentAccount, differentDomain);


References​

  • useNotifications()
    • notificationsPerPage: Number representing how many notifications to get per fetch
    • isInfiniteScroll: Whether or not to keep already fetched notifications when getting next page
    • params: (optional) Additional parameters
    • unreadFirst: (optional, default true, since 1.3.0) Whether or not unread messages should be sorted at the top, regardless of timestamp
  • nextPage: A function to be called to fetch the next page of notifications
  • notifications: Array of notifications, of type
  • notification.read: Mark the notification as read
  • markNotificationsAsRead: Takes an array of notification IDs and marks them as read. Max 1000 IDs
  • markAllNotificationsAsRead: Mark all notifications as read.
{
title: string
sentAt: number
body: string
id: string
isRead: boolean
url: string | null
type: string
markAsRead: () => Promise<void>
}

Notification Types​

Manage and fetch notification types.

const { data: types, update } = useNotificationTypes()

References​

  • update: (enabledScopeNames: string[]) -> void
  • types: Map of scopes (Notification types)
type ScopeMap = Record<
string,
{
name: string
description: string
enabled: boolean
}
>

Registering for Device Push Notifications​

If you wish to receive live push notifications to your React Native or Web app, you must integrate with Firebase Messaging. More information about how to integrate with Firebase can be found here.

Your integration will obtain a token from Firebase and you will need to pass this token to the Web3Inbox SDK using the registerWithPushServer() function.

import { getToken } from 'firebase/messaging'

const { data: client } = useWeb3InboxClient()

// initialize Firebase's messaging object via Firebase's `getMessaging` function

const firebaseToken = getToken(firebaseMessaging, {
vapidKey: 'YOUR_FIREBASE_VAPID_KEY'
})

client.registerWithPushServer(firebaseToken)

References​

  • registerWithPushServer: (token: string, platform: 'fcm' | 'apns' = 'fcm') => void

Either APNs or FCM can be used to receive push notifications to the device. The token you provide may be a token from either platform, provided the platform argument matches.

const { data: client } = useWeb3InboxClient()

client.on('notify_message', ({ message }) => {
console.log(notification.title)
})

References​

  • message: Notification of type:
interface NotifyNotification {
title: string
sentAt: number
body: string
id: string
url: string | null
type: string
}

Discover apps to subscribe to​

Apps wanting to provide users a list of apps that users may want to subscribe to can use this function. This list is manually curated by us, and apps can submit a request to be added to this list in our Cloud app by following this guide.

const { data: apps, isLoading, discover, currentPageNumber, nextPage } = useDiscoverApps({
isInfiniteScroll?: boolean,
appsPerPage?: number,
isVerified: true, // Filter by featured projects, defaulted to true
isFeatured: true // Filter by verified projects, defaulted to true
})

return (
<div>
<button onClick={discover}> Refresh list </button>
{apps.map(app => (
<div onClick={app.subscribe} key={app.id}>
<img src={app.icon} />
<span> {app.name} </span>
<span> {app.description} </span>
<span> {app.url} </span>
</div>
)}
</div>
)

References​

  • refresh: () => NotifyApp[], refresh apps manually and also return updated apps.
  • apps: NotifyApp[]
  • isInfiniteScroll: Whether or not to keep already fetched apps when getting next page
  • appsPerPage: Number representing how many apps to get per fetch
interface NotifyApp {
id: string // The ID of the app on the discover list
name: string
description: string
url: string
appDomain: string
icon: string
isVerified: boolean // Is this app verified for its domain
isFeatured: boolean // Is this app flagged as featured
isComingSoon: boolean // Is this app coming soon or already available
subscribe: () => Promise<void>
}