/ src / lib / components / connect-button / connect-button.svelte
connect-button.svelte
  1  <script lang="ts">
  2    import Button from '$lib/components/button/button.svelte';
  3    import WalletIcon from '$lib/components/icons/Wallet.svelte';
  4    import wallet from '$lib/stores/wallet/wallet.store';
  5    import Flyout from '../flyout/flyout.svelte';
  6    import IdentityBadge from '../identity-badge/identity-badge.svelte';
  7    import AccountMenu from '../account-menu/account-menu.svelte';
  8    import SafeLogo from '../icons/safe-logo.svelte';
  9    import cupertinoPaneStore from '$lib/stores/cupertino-pane/cupertino-pane.store';
 10    import network from '$lib/stores/wallet/network';
 11  
 12    let safeAppMode = $derived(Boolean($wallet.safe));
 13  
 14    const walletInitializedStore = wallet.initialized;
 15    const waitingForOnboardStore = wallet.waitingForOnboard;
 16  </script>
 17  
 18  {#if !network.readOnlyMode}
 19    <div class="wrapper">
 20      {#if $wallet.connected}
 21        <div class="desktop-only">
 22          <Flyout>
 23            {#snippet trigger()}
 24              <div class="trigger">
 25                {#if safeAppMode}<div class="safe-logo">
 26                    <SafeLogo />
 27                  </div>{/if}
 28                <IdentityBadge
 29                  disableTooltip
 30                  hideAvatarOnMobile
 31                  disableLink
 32                  size="medium"
 33                  address={$wallet.address}
 34                />
 35              </div>
 36            {/snippet}
 37            {#snippet content()}
 38              <div>
 39                <AccountMenu />
 40              </div>
 41            {/snippet}
 42          </Flyout>
 43        </div>
 44        <div
 45          class="mobile-only"
 46          role="button"
 47          tabindex="0"
 48          onclick={() => cupertinoPaneStore.openSheet(AccountMenu, undefined)}
 49          onkeydown={() => cupertinoPaneStore.openSheet(AccountMenu, undefined)}
 50        >
 51          <IdentityBadge
 52            hideAvatarOnMobile
 53            disableLink
 54            size="medium"
 55            address={$wallet.address}
 56            disableTooltip
 57          />
 58        </div>
 59      {:else}
 60        <Button
 61          disabled={$waitingForOnboardStore}
 62          loading={!$walletInitializedStore}
 63          icon={WalletIcon}
 64          onclick={() => wallet.connect()}>Connect</Button
 65        >
 66      {/if}
 67    </div>
 68  {/if}
 69  
 70  <style>
 71    .wrapper {
 72      display: flex;
 73      align-items: center;
 74      justify-content: center;
 75      gap: 0.5rem;
 76    }
 77  
 78    .trigger {
 79      display: flex;
 80    }
 81  
 82    .trigger > .safe-logo {
 83      border-radius: 1rem;
 84      height: 2rem;
 85      width: 2rem;
 86      background-color: var(--color-primary);
 87      margin-right: -12px;
 88      z-index: 1;
 89    }
 90  
 91    .mobile-only {
 92      display: none;
 93    }
 94  
 95    @media (max-width: 768px) {
 96      .desktop-only {
 97        display: none;
 98      }
 99  
100      .mobile-only {
101        display: initial;
102      }
103    }
104  </style>