Repository: superhero-com/superhero-wallet
Pull request #3550: feat/multisig select account dashboard
Author: login: alex-k8
Created: 2025-04-24T08:06:56Z | Merged: 2025-04-30T11:33:22Z

closes #3545 
fixes: chrome extension store not finding icons

Linked issue #3545: Missing select account UI on Multisig dashboard.
**Missing select active account UI on Multisig dashboard.** 
To reproduce:
- open wallet;
- create more than one multisig accounts if you don't have any (Add new account flow);
- go to Multisig dashboard and observe that the UI supposed to switch between active accounts (triggering select account modal) is missing;
- switch between views: Dashboard/Multisig dashboard to see "jumping" of total amount row, most probably due to missing UI.

SCREEN REC:
https://github.com/user-attachments/assets/3374bec7-bce4-456f-9a28-2bf5addbef2b

**Acceptance criteria:**
- 
- show UI to select active multisig vault if there are more than 1;
- solve the problem with "jumping" a few pixels while switching between Dashboard and Multisig dashboard view. 

Diff:
diff --git a/src/composables/multisigAccounts.ts b/src/composables/multisigAccounts.ts
index 4aff4fbec..07d047336 100644
--- a/src/composables/multisigAccounts.ts
+++ b/src/composables/multisigAccounts.ts
@@ -10,11 +10,14 @@ import type {
   IMultisigAccountResponse,
   AccountAddress,
   Dictionary,
+  IFormSelectOption,
+  IAccount,
 } from '@/types';
-import { STORAGE_KEYS } from '@/constants';
+import { PROTOCOLS, STORAGE_KEYS } from '@/constants';
 import {
   fetchJson,
   handleUnknownError,
+  prepareAccountSelectOptions,
   toShiftedBigNumber,
 } from '@/utils';
 
@@ -99,6 +102,10 @@ export function useMultisigAccounts({
     ),
   );
 
+  const multisigAccountsSelectOptions = computed(
+    (): IFormSelectOption[] => prepareAccountSelectOptions(allMultisigAccounts.value),
+  );
+
   function setActiveMultisigAccountId(gaAccountId: AccountAddress) {
     if (gaAccountId && allMultisigAccounts.value.some((acc) => acc.gaAccountId === gaAccountId)) {
       activeMultisigAccountId.value = gaAccountId;
@@ -119,6 +126,7 @@ export function useMultisigAccounts({
       (account) => account.gaAccountId === gaAccountId
         ? {
           ...account,
+          balance: BigNumber(account.balance),
           txHash,
           hasPendingTransaction: true,
           proposedBy,
@@ -247,6 +255,23 @@ export function useMultisigAccounts({
     return allMultisigAccounts.value.find((acc) => acc.contractId === contractId);
   }
 
+  function getMultisigIAccountByAccountId(accountId: AccountAddress)
+    : Partial<IAccount> | undefined {
+    const account = getMultisigAccountByAccountId(accountId);
+    if (!account) return undefined;
+
+    const idx = multisigAccounts.value.findIndex(
+      (acc) => acc.gaAccountId === accountId,
+    );
+
+    return {
+      address: account.gaAccountId,
+      globalIdx: idx,
+      idx,
+      protocol: PROTOCOLS.aeternity,
+    };
+  }
+
   /**
    * Refresh the list of the multisig accounts.
    */
@@ -349,11 +374,14 @@ export function useMultisigAccounts({
     isActiveMultisigAccountPending,
     isMultisigBackendUnavailable,
     multisigAccounts: allMultisigAccounts,
+    multisigAccountsSelectOptions,
     pendingMultisigAccounts,
     addPendingMultisigAccount,
     addTransactionToPendingMultisigAccount,
     fetchAdditionalInfo,
     getMultisigAccountByContractId,
+    getMultisigAccountByAccountId,
+    getMultisigIAccountByAccountId,
     setActiveMultisigAccountId,
     stopFetchingAdditionalInfo,
     updateMultisigAccounts,
diff --git a/src/manifest.json b/src/manifest.json
index 098026256..5552a31b6 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -24,8 +24,8 @@
     "https://*/*"
   ],
   "icons": {
-    "48": "./icons/icon_48.png",
-    "128": "./icons/icon_128.png"
+    "48": "icons/icon_48.png",
+    "128": "icons/icon_128.png"
   },
   "action": {
     "default_title": "Superhero Wallet",
diff --git a/src/popup/components/AccountSelectOptionsItem.vue b/src/popup/components/AccountSelectOptionsItem.vue
index ada6dfbe5..e8c51cf2f 100644
--- a/src/popup/components/AccountSelectOptionsItem.vue
+++ b/src/popup/components/AccountSelectOptionsItem.vue
@@ -15,6 +15,7 @@
         avatar-size="rg"
         is-list-name
         :show-protocol-icon="!hideProtocolIcon"
+        :is-multisig="isMultisig"
       >
         <template #after-address>
           <slot name="after-address" />
@@ -44,7 +45,7 @@ import {
   PropType,
 } from 'vue';
 import type { IAccount, IFormSelectOption } from '@/types';
-import { useAccounts, useBalances } from '@/composables';
+import { useAccounts, useBalances, useMultisigAccounts } from '@/composables';
 import { getAddressColor } from '@/utils';
 import { ProtocolAdapterFactory } from '@/lib/ProtocolAdapterFactory';
 
@@ -81,19 +82,34 @@ export default defineComponent({
   setup(props) {
     const { getAccountBalance } = useBalances();
     const { getAccountByAddress } = useAccounts();
+    const { getMultisigAccountByAccountId, getMultisigIAccountByAccountId } = useMultisigAccounts();
+
+    const multisigAccount = computed(() => (
+      getMultisigAccountByAccountId(props.option.value as string)
+    ));
+
+    const multisigIAccount = computed(() => (
+      getMultisigIAccountByAccountId(props.option.value as string)
+    ));
 
     const account = computed(() => (
-      props.customAccount ?? getAccountByAddress(props.option.value as string)
+      props.customAccount
+      ?? multisigIAccount.value
+      ?? getAccountByAddress(props.option.value as string)
     ));
 
+    const isMultisig = computed(() => !!multisigAccount.value);
+
     const bgColorStyle = computed(() => ({ '--bg-color': getAddressColor(account.value.address) }));
 
     const balance = computed(() => {
       switch (true) {
         case !!props.outsideBalance:
           return props.outsideBalance;
-        case !!account.value:
+        case !!account.value && !isMultisig.value:
           return getAccountBalance(account.value.address.toString()).toNumber();
+        case !!account.value && isMultisig.value:
+          return multisigAccount.value?.balance.toNumber();
         default:
           return 0;
       }
@@ -105,6 +121,7 @@ export default defineComponent({
 
     return {
       account,
+      isMultisig,
       balance,
       bgColorStyle,
       tokenSymbol,
diff --git a/src/popup/components/DashboardBase.vue b/src/popup/components/DashboardBase.vue
index 5b042c04a..de70c76ad 100644
--- a/src/popup/components/DashboardBase.vue
+++ b/src/popup/components/DashboardBase.vue
@@ -2,7 +2,8 @@
   <div class="dashboard-base">
     <div class="dashboard-header">
       <div
-        v-if="accounts.length > 1"
+        v-if="showHeader"
+        :style="{ visibility: accounts.length > 1 ? 'visible' : 'hidden' }"
         class="dashboard-header-info"
       >
         <TotalWalletAmount
@@ -67,7 +68,7 @@
 </template>
 
 <script lang="ts">
-import { PropType, defineComponent } from 'vue';
+import { PropType, computed, defineComponent } from 'vue';
 import type { IAccount, IFormSelectOption, IMultisigAccount } from '@/types';
 import { ROUTE_SEED_PHRASE_SETTINGS } from '@/popup/router/routeNames';
 import { useUi } from '@/composables';
@@ -94,15 +95,19 @@ export default defineComponent({
     activeIdx: { type: Number, default: 0 },
     balancesTotal: { type: String, default: null },
     isMultisig: Boolean,
+    forceHeader: Boolean,
   },
   emits: {
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
     'select-account': (address: string) => true,
   },
-  setup() {
+  setup(props) {
     const { isSeedBackedUp } = useUi();
 
+    const showHeader = computed(() => props.accounts.length > 1 || props.forceHeader);
+
     return {
+      showHeader,
       isSeedBackedUp,
       WarningTriangleIcon,
       ROUTE_SEED_PHRASE_SETTINGS,
@@ -123,6 +128,7 @@ export default defineComponent({
     padding: 5px 20px 8px 24px;
     display: flex;
     align-items: center;
+    min-height: 35px;
 
     .account-select-btn {
       padding: 0;
diff --git a/src/popup/components/TotalWalletAmount.vue b/src/popup/components/TotalWalletAmount.vue
index d61954fa6..8b742fb52 100644
--- a/src/popup/components/TotalWalletAmount.vue
+++ b/src/popup/components/TotalWalletAmount.vue
@@ -5,7 +5,7 @@
     />
     <span
       class="label"
-      v-text="isMultisig ? $t('common.totalMultisig') : $t('common.total')"
+      v-text="$t('common.total')"
     />
   </div>
 </template>
diff --git a/src/popup/locales/en.json b/src/popup/locales/en.json
index 2a38e3b6d..a27d320ac 100644
--- a/src/popup/locales/en.json
+++ b/src/popup/locales/en.json
@@ -55,7 +55,6 @@
     "browser": "Browser",
     "title": "Superhero Wallet",
     "total": "Total",
-    "totalMultisig": "Total in multisig vaults",
     "tx": "Tx",
     "unknown": "Unknown",
     "unrecognized": "Unrecognized",
diff --git a/src/popup/pages/Dashboard.vue b/src/popup/pages/Dashboard.vue
index 8d90a7fbe..e5a75e502 100644
--- a/src/popup/pages/Dashboard.vue
+++ b/src/popup/pages/Dashboard.vue
@@ -8,6 +8,7 @@
         :active-account-address="activeAccount.address"
         :active-idx="activeAccountGlobalIdx"
         :balances-total="totalBalance"
+        :force-header="multisigAccounts.length > 1"
         @select-account="(address) => setActiveAccountByAddress(address)"
       >
         <template #swiper>
@@ -108,6 +109,7 @@ import {
   useBalances,
   useDeepLinkApi,
   useFungibleTokens,
+  useMultisigAccounts,
 } from '@/composables';
 import { buildAeFaucetUrl, buildSimplexLink } from '@/protocols/aeternity/helpers';
 
@@ -156,6 +158,7 @@ export default defineComponent({
       setActiveAccountByGlobalIdx,
       setActiveAccountByAddress,
     } = useAccounts();
+    const { multisigAccounts } = useMultisigAccounts();
 
     const { accountsTotalBalance } = useBalances();
     const { accountsTotalTokenBalance } = useFungibleTokens();
@@ -201,6 +204,7 @@ export default defineComponent({
       GlobeIcon,
       ActionIcon,
 
+      multisigAccounts,
       accounts,
       accountsAddressList,
       accountsSelectOptions,
diff --git a/src/popup/pages/DashboardMultisig.vue b/src/popup/pages/DashboardMultisig.vue
index cd0a99eb4..5c2a26b13 100644
--- a/src/popup/pages/DashboardMultisig.vue
+++ b/src/popup/pages/DashboardMultisig.vue
@@ -4,10 +4,14 @@
       <DashboardBase
         v-if="isValidActiveIdx"
         class="dashboard-multisig"
+        :accounts="multisigAccounts"
+        :accounts-select-options="multisigAccountsSelectOptions"
+        :active-account-address="activeMultisigAccount?.gaAccountId"
         :active-idx="multisigAccountIdx"
         :balances-total="multisigBalancesTotal"
-        :accounts="multisigAccounts"
+        :force-header="accounts.length > 1"
         is-multisig
+        @select-account="(address) => setActiveMultisigAccountId(address)"
       >
         <template #swiper>
           <AccountSwiper
@@ -58,18 +62,24 @@ import { computed, defineComponent } from 'vue';
 import BigNumber from 'bignumber.js';
 
 import type { IMultisigAccount } from '@/types';
-import { MODAL_TRANSFER_SEND } from '@/constants';
-import { useModals, useMultisigAccounts, usePendingMultisigTransaction } from '@/composables';
+import { MODAL_TRANSFER_SEND, PROTOCOLS } from '@/constants';
+import {
+  useAccounts,
+  useCurrencies,
+  useModals,
+  useMultisigAccounts,
+  usePendingMultisigTransaction,
+} from '@/composables';
 import { ROUTE_MULTISIG_DETAILS } from '@/popup/router/routeNames';
 
 import AccountCardMultisig from '@/popup/components/AccountCardMultisig.vue';
 import AccountSwiper from '@/popup/components/AccountSwiper.vue';
-import PendingMultisigTransactionCard from '../components/PendingMultisigTransactionCard.vue';
-import DashboardBase from '../components/DashboardBase.vue';
-import OpenTransferReceiveModalBtn from '../components/OpenTransferReceiveModalBtn.vue';
-import OpenTransferSendModalBtn from '../components/OpenTransferSendModalBtn.vue';
+import PendingMultisigTransactionCard from '@/popup/components/PendingMultisigTransactionCard.vue';
+import DashboardBase from '@/popup/components/DashboardBase.vue';
+import OpenTransferReceiveModalBtn from '@/popup/components/OpenTransferReceiveModalBtn.vue';
+import OpenTransferSendModalBtn from '@/popup/components/OpenTransferSendModalBtn.vue';
 
-import ArrowSendIcon from '../../icons/arrow-send.svg?vue-component';
+import ArrowSendIcon from '@/icons/arrow-send.svg?vue-component';
 
 export default defineComponent({
   name: 'DashboardMultisig',
@@ -86,13 +96,17 @@ export default defineComponent({
   setup() {
     const { openModal } = useModals();
     const {
+      activeMultisigAccount,
       multisigAccounts,
+      multisigAccountsSelectOptions,
       activeMultisigAccountId,
       pendingMultisigAccounts,
       isActiveMultisigAccountPending,
       setActiveMultisigAccountId,
     } = useMultisigAccounts();
+    const { accounts } = useAccounts();
     const { pendingMultisigTransaction } = usePendingMultisigTransaction();
+    const { getCurrentCurrencyRate } = useCurrencies();
 
     const addressList = computed(() => multisigAccounts.value.map((acc) => acc.gaAccountId));
 
@@ -108,6 +122,7 @@ export default defineComponent({
       () => multisigAccounts.value
         .map((acc) => acc.balance)
         .reduce((total, balance) => total.plus(balance), new BigNumber(0))
+        .multipliedBy(getCurrentCurrencyRate(PROTOCOLS.aeternity))
         .toFixed(),
     );
 
@@ -131,18 +146,22 @@ export default defineComponent({
     }
 
     return {
+      activeMultisigAccount,
       isActiveMultisigAccountPending,
       pendingMultisigTransaction,
       isValidActiveIdx,
       ROUTE_MULTISIG_DETAILS,
       ArrowSendIcon,
       addressList,
+      accounts,
       multisigAccountIdx,
       multisigAccounts,
+      multisigAccountsSelectOptions,
       multisigBalancesTotal,
       openTransferSendModal,
       selectAccount,
       isPendingAccount,
+      setActiveMultisigAccountId,
     };
   },
 });
diff --git a/src/utils/common.ts b/src/utils/common.ts
index ef58bc217..1df2ea5f5 100644
--- a/src/utils/common.ts
+++ b/src/utils/common.ts
@@ -26,6 +26,7 @@ import type {
   IDashboardTransaction,
   IFormSelectOption,
   IHdWalletAccount,
+  IMultisigAccount,
   IPageableResponse,
   IRequestInitBodyParsed,
   ITokenResolved,
@@ -342,10 +343,11 @@ export function postJson(url: string, options?: IRequestInitBodyParsed) {
 /**
  * Accounts data formatted as the form select options
  */
-export function prepareAccountSelectOptions(accountList: IAccount[]): IFormSelectOption[] {
+export function prepareAccountSelectOptions(accountList: IAccount[] | IMultisigAccount[])
+  : IFormSelectOption[] {
   return accountList.map((acc): IFormSelectOption => ({
-    text: getDefaultAccountLabel(acc),
-    value: acc.address,
+    text: (acc as IMultisigAccount).gaAccountId ?? getDefaultAccountLabel(acc as IAccount),
+    value: (acc as IMultisigAccount).gaAccountId ?? (acc as IAccount).address,
   }));
 }
 


Reviews:
user: login: CedrikNikita
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T07:56:54Z
user: login: alex-k8
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T08:00:46Z
user: login: CedrikNikita
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:15:39Z
user: login: CedrikNikita
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:18:16Z
user: login: CedrikNikita
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:19:14Z
user: login: alex-k8
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:32:22Z
user: login: alex-k8
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:36:44Z
user: login: alex-k8
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-28T11:36:47Z
user: login: CedrikNikita
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-30T11:17:34Z

Review comments:
diff_hunk: @@ -55,7 +55,7 @@
     "browser": "Browser",
     "title": "Superhero Wallet",
     "total": "Total",
-    "totalMultisig": "Total in multisig vaults",
+    "totalMultisig": "Total",
path: src/popup/locales/en.json
user: login: CedrikNikita
body: Why do we need two "Total" locales?
created_at: 2025-04-28T07:56:54Z
author_association: COLLABORATOR
diff_hunk: @@ -55,7 +55,7 @@
     "browser": "Browser",
     "title": "Superhero Wallet",
     "total": "Total",
-    "totalMultisig": "Total in multisig vaults",
+    "totalMultisig": "Total",
path: src/popup/locales/en.json
user: login: alex-k8
body: The `in multisig vaults` was removed to make space for the account selector dropdown. I removed the unnecessary translation now.
created_at: 2025-04-28T08:00:46Z
author_association: COLLABORATOR
diff_hunk: @@ -4,10 +4,14 @@
       <DashboardBase
         v-if="isValidActiveIdx"
         class="dashboard-multisig"
+        :accounts="multisigAccounts"
+        :accounts-select-options="multisigAccountsSelectOptions"
+        :active-account-address="activeMultisigAccount?.gaAccountId"
         :active-idx="multisigAccountIdx"
         :balances-total="multisigBalancesTotal"
-        :accounts="multisigAccounts"
+        :force-header="accounts.length > 1"
path: src/popup/pages/DashboardMultisig.vue
user: login: CedrikNikita
body: Why is this based on none multisig accounts?
created_at: 2025-04-28T11:15:39Z
author_association: COLLABORATOR
diff_hunk: @@ -342,10 +343,14 @@ export function postJson(url: string, options?: IRequestInitBodyParsed) {
 /**
  * Accounts data formatted as the form select options
  */
-export function prepareAccountSelectOptions(accountList: IAccount[]): IFormSelectOption[] {
+export function prepareAccountSelectOptions(accountList: IAccount[] | IMultisigAccount[])
+  : IFormSelectOption[] {
+  const isIAccountArray = () => !!(accountList as IAccount[])[0]?.address;
+
   return accountList.map((acc): IFormSelectOption => ({
-    text: getDefaultAccountLabel(acc),
-    value: acc.address,
+    text: isIAccountArray() ? getDefaultAccountLabel(acc as IAccount)
+      : (acc as IMultisigAccount).gaAccountId,
path: src/utils/common.ts
user: login: CedrikNikita
body: ```suggestion
    text: (acc as IMultisigAccount).gaAccountId ?? getDefaultAccountLabel(acc as IAccount)
```

We can do something like that.
created_at: 2025-04-28T11:18:15Z
author_association: COLLABORATOR
diff_hunk: @@ -342,10 +343,14 @@ export function postJson(url: string, options?: IRequestInitBodyParsed) {
 /**
  * Accounts data formatted as the form select options
  */
-export function prepareAccountSelectOptions(accountList: IAccount[]): IFormSelectOption[] {
+export function prepareAccountSelectOptions(accountList: IAccount[] | IMultisigAccount[])
+  : IFormSelectOption[] {
+  const isIAccountArray = () => !!(accountList as IAccount[])[0]?.address;
+
   return accountList.map((acc): IFormSelectOption => ({
-    text: getDefaultAccountLabel(acc),
-    value: acc.address,
+    text: isIAccountArray() ? getDefaultAccountLabel(acc as IAccount)
+      : (acc as IMultisigAccount).gaAccountId,
+    value: isIAccountArray() ? (acc as IAccount).address : (acc as IMultisigAccount).gaAccountId,
path: src/utils/common.ts
user: login: CedrikNikita
body: ```suggestion
    value: (acc as IMultisigAccount).gaAccountId ?? (acc as IAccount).address
```
created_at: 2025-04-28T11:19:13Z
author_association: COLLABORATOR
diff_hunk: @@ -4,10 +4,14 @@
       <DashboardBase
         v-if="isValidActiveIdx"
         class="dashboard-multisig"
+        :accounts="multisigAccounts"
+        :accounts-select-options="multisigAccountsSelectOptions"
+        :active-account-address="activeMultisigAccount?.gaAccountId"
         :active-idx="multisigAccountIdx"
         :balances-total="multisigBalancesTotal"
-        :accounts="multisigAccounts"
+        :force-header="accounts.length > 1"
path: src/popup/pages/DashboardMultisig.vue
user: login: alex-k8
body: In the Multisig Dashboard, if there is only one multisig vault but multiple "normal" accounts in the Dashboard, to prevent "jumping" when switching between Dashboard and Multisig Dashboard, this prop is used.
created_at: 2025-04-28T11:32:22Z
author_association: COLLABORATOR
diff_hunk: @@ -342,10 +343,14 @@ export function postJson(url: string, options?: IRequestInitBodyParsed) {
 /**
  * Accounts data formatted as the form select options
  */
-export function prepareAccountSelectOptions(accountList: IAccount[]): IFormSelectOption[] {
+export function prepareAccountSelectOptions(accountList: IAccount[] | IMultisigAccount[])
+  : IFormSelectOption[] {
+  const isIAccountArray = () => !!(accountList as IAccount[])[0]?.address;
+
   return accountList.map((acc): IFormSelectOption => ({
-    text: getDefaultAccountLabel(acc),
-    value: acc.address,
+    text: isIAccountArray() ? getDefaultAccountLabel(acc as IAccount)
+      : (acc as IMultisigAccount).gaAccountId,
path: src/utils/common.ts
user: login: alex-k8
body: Updated
created_at: 2025-04-28T11:36:44Z
author_association: COLLABORATOR
diff_hunk: @@ -342,10 +343,14 @@ export function postJson(url: string, options?: IRequestInitBodyParsed) {
 /**
  * Accounts data formatted as the form select options
  */
-export function prepareAccountSelectOptions(accountList: IAccount[]): IFormSelectOption[] {
+export function prepareAccountSelectOptions(accountList: IAccount[] | IMultisigAccount[])
+  : IFormSelectOption[] {
+  const isIAccountArray = () => !!(accountList as IAccount[])[0]?.address;
+
   return accountList.map((acc): IFormSelectOption => ({
-    text: getDefaultAccountLabel(acc),
-    value: acc.address,
+    text: isIAccountArray() ? getDefaultAccountLabel(acc as IAccount)
+      : (acc as IMultisigAccount).gaAccountId,
+    value: isIAccountArray() ? (acc as IAccount).address : (acc as IMultisigAccount).gaAccountId,
path: src/utils/common.ts
user: login: alex-k8
body: Updated
created_at: 2025-04-28T11:36:47Z
author_association: COLLABORATOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-24T08:17:17Z
body: Deployed to [feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz), [artifacts](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz/artifacts)
author_association: NONE
user: login: dvdbak
created_at: 2025-04-24T11:51:59Z
body: LGTM
author_association: NONE
user: login: dvdbak
created_at: 2025-04-24T11:52:37Z
body: NOTE: 
If there are 2 normal accounts and 1 multisig, the "header" on the multisig dashboard should take space, but be invisible. This is to prevent jumping. And vice versa
If there are more than 1 account (either dashboard or multisig dashboard), then the USD total is visible
If there are more than 5 accounts, then the account selector is visible
if there are only 1 of each (normal + multisig), then the header is completely gone, no space is used, the accounts go higher
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-28T07:34:59Z
body: Deployed to [feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz), [artifacts](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz/artifacts)
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-28T08:08:08Z
body: Deployed to [feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz), [artifacts](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz/artifacts)
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-28T08:08:57Z
body: Deployed to [feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz), [artifacts](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz/artifacts)
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-28T11:44:45Z
body: Deployed to [feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz), [artifacts](https://feat-multisig-select-account-dashboard.wallet.z52da5wt.xyz/artifacts)
author_association: NONE