The WalletAdapter

This is the type that describes the initialized WalletAdapter.

Usage

{{#tabs }} {{#tab name="Dioxus" }}

How WalletAdapter is defined

#![allow(unused)]
fn main() {
use use dioxus::prelude::*;
use wallet_adapter::WalletAdapter;

pub(crate) static WALLET_ADAPTER: GlobalSignal<WalletAdapter> =
    Signal::global(|| WalletAdapter::init().unwrap());
}

{{#endtab }}

{{#tab name="Sycamore" }}

#![allow(unused)]
fn main() {
use sycamore::prelude::*;

// It is defined as a global context in the app root component
#[component]
fn App() -> View {
	let adapter = WalletAdapter::init_custom(window(), document()).unwrap();

	provide_context(create_signal(adapter));
    //..
}
}

{{#endtab }}

{{#tab name="Yew" }}

For Yew (version 0.21), since updating state is best done using message passing,

#![allow(unused)]
fn main() {
use yew::prelude::*;

// as defined in the `utils/app_state.rs` module, all elements are contained 
// in the `GlobalAppInfo` struct.
// All fields are wrapped in a `RefCell` for interior mutability
#[derive(Debug, PartialEq, Clone)]
pub(crate) struct GlobalAppInfo {
    // The `WalletAdapter`
    pub(crate) adapter: RefCell<WalletAdapter>,
    // .. Other useful fields will be discussed in the next sections
}

// It is defined as a global context in the app root component
#[function_component(App)]
pub fn app() -> Html {
   let adapter = WalletAdapter::init().unwrap();    
	let init_state = GlobalAppInfo::new(adapter);
    // We wrap it in a `use_reducer` hook for mutable state management
	let global_state = use_reducer(|| init_state);

    html! {
       <ContextProvider<GlobalAppState> context={global_state.clone()}>
        // All components inside this element will have access to `global_state` variable
		</ContextProvider<GlobalAppState>>
    }
}
}

{{#endtab }} {{#endtabs }}

How to access the WalletAdapter from other components

{{#tabs }}

{{#tab name="Dioxus" }}

#![allow(unused)]
fn main() {
use crate::WALLET_ADAPTER;
use dioxus::prelude::*;

// Example of the ConnectModal component that when clicks lists the wallets
// an when a wallet is clicked, the `solana:connect` feature is called to 
// establish a connection with the clicked on browser wallet.


#[component]
pub fn ConnectWalletModalModal(
    //.. other arguments
) -> Element {
    // You can call all the methods of the `WalletAdapter` type by
    // using `WALLET_ADAPTER.read()` to gain read access to it.
rsx!{
        
	// Get the `WalletAdapter` using ` WALLET_ADAPTER.read()`
    for wallet in WALLET_ADAPTER.read().wallets().clone() {
        li {
            onclick:move|_|{
                let wallet = wallet.clone();
                spawn(async move {
                    //..

                    // Call the connect function
                    if let Err(error) = WALLET_ADAPTER
                    	.write()
                    	.connect(wallet)
                    	.await 
                    {
                        // ..
                    }
					//..
                });
            },
            "CONNECT {wallet.name()}"
            }
        }
    }
}
}

{{#endtab }}

{{#tab name="Sycamore" }}

#![allow(unused)]
fn main() {
use sycamore::prelude::*;


#[component]
pub fn MyComponent() -> View {
    let adapter = use_context::<Signal<WalletAdapter>>();
    
    let wallet_list = adapter
        .get_clone() // Access it by calling `get_clone()` method
        .wallets()
        .into_iter()
        .map(|wallet| {
            let wallet_name = wallet.name().to_string();
            view! {
                    li (
                    on:click=move|_|{
                        let wallet = wallet.clone();

                        spawn_local_scoped(async move {
                            let mut adapter_inner = adapter.get_clone().clone();
                            if let Err(error) = adapter_inner.connect(wallet.clone()).await{
                                //..
                            }
                            adapter.set(adapter_inner); // Set method modifies the state
                        });
                    }
                ){{wallet_name}}
}
}

{{#endtab }}

{{#tab name="Yew" }}

Yew 0.21 automatically dereferences values it wrapped meaning that getting the WalletAdapter is as easy as global_state.adapter .

#![allow(unused)]
fn main() {
use wallet_adapter::Cluster;
use yew::{platform::spawn_local, prelude::*};
use crate::GlobalAppState;

#[function_component]
pub fn Accounts() -> Html {
    let global_state =
        use_context::<GlobalAppState>().expect("no global ctx `GlobalAppState` found");
    
    <ul>
       {global_state.adapter.borrow().wallets()
            .into_iter()
            .map(|wallet: Wallet| {
                let wallet_name = wallet.name();
                let wallet = wallet.clone();
                let trigger_inner = trigger_inner.clone();

                html! {
                    <li
                    onclick={
                        let global_state = global_state.clone();

                        Callback::from(move|_|{
                            let wallet = wallet.clone();
                            let global_state = global_state.clone();
                            let trigger_inner = trigger_inner.clone();

                            spawn_local(async move {
                                // Yew uses `dispatch` to send messages to perform various actions
                                global_state_inner
                                    .dispatch(
                                        GlobalAction::Connect { 
                                            wallet, 
                                            trigger:trigger_inner.clone(),
                                            global_state: global_state.clone(), 
                                    });
                            });

                        })
                    }
                    {
                        {wallet_name}
                    }
                }
            }).collect::<Vec<Html>>()
    </ul>
	}
}
}

{{#endtab }}

{{#endtabs }}