UNPKG

@frak-labs/core-sdk

Version:

Core SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.

94 lines (83 loc) 2.91 kB
import { Deferred } from "@frak-labs/frame-connector"; import type { FrakClient } from "../types/client"; import type { WalletStatusReturnType } from "../types/rpc/walletStatus"; import { ensureIdentity } from "./ensureIdentity"; /** * Function used to watch the current frak wallet status * @param client - The current Frak Client * @param callback - The callback that will receive any wallet status change * @returns A promise resolving with the initial wallet status * * @description This function will return the current wallet status, and will listen to any change in the wallet status. * * @example * await watchWalletStatus(frakConfig, (status: WalletStatusReturnType) => { * if (status.key === "connected") { * console.log("Wallet connected:", status.wallet); * } else { * console.log("Wallet not connected"); * } * }); */ export function watchWalletStatus( client: FrakClient, callback?: (status: WalletStatusReturnType) => void ): Promise<WalletStatusReturnType> { // If no callback is provided, just do a request with deferred result if (!callback) { return client .request({ method: "frak_listenToWalletStatus" }) .then((result) => { // Handle side effects of this request walletStatusSideEffect(client, result); // Return the result return result; }); } // Otherwise, listen to the wallet status and return the first one received const firstResult = new Deferred<WalletStatusReturnType>(); let hasResolved = false; // Start the listening request, and return the first result client.listenerRequest( { method: "frak_listenToWalletStatus", }, (status) => { // Handle side effects of this request walletStatusSideEffect(client, status); // Transmit the status to the callback callback(status); // If the promise hasn't resolved yet, resolve it if (!hasResolved) { firstResult.resolve(status); hasResolved = true; } } ); return firstResult.promise; } /** * Helper to save a potential interaction token * @param interactionToken */ function walletStatusSideEffect( client: FrakClient, status: WalletStatusReturnType ) { if (typeof window === "undefined") { return; } // Update the global properties client.openPanel?.setGlobalProperties({ wallet: status.wallet ?? null, }); if (status.interactionToken) { window.sessionStorage.setItem( "frak-wallet-interaction-token", status.interactionToken ); ensureIdentity(status.interactionToken); } else { window.sessionStorage.removeItem("frak-wallet-interaction-token"); } }