feat: implement account switcher component and state management

- Add AccountSwitcher component for managing user accounts with UI for switching, adding, and logging out.
- Create account state manager to handle snapshots of account-specific states for efficient switching.
- Introduce utility functions for account management, including ID generation and avatar color assignment.
- Implement Zustand store for account management, supporting addition, removal, and state retrieval of accounts.
This commit is contained in:
Linus Rath
2026-03-19 10:08:57 +01:00
parent 234129397d
commit d493bb17dc
26 changed files with 1398 additions and 119 deletions
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Schließen",
"or": "oder",
"sign_in_sso": "Mit SSO anmelden",
"add_account_title": "Konto hinzufügen",
"add_account_subtitle": "Mit einem anderen Konto anmelden",
"cancel": "Abbrechen",
"website": "Webseite",
"imprint": "Impressum",
"privacy_policy": "Datenschutz",
@@ -58,6 +61,11 @@
"storage_free": "Frei",
"storage_total": "Gesamt",
"sign_out": "Abmelden",
"sign_out_of": "Von {account} abmelden",
"sign_out_all": "Von allen Konten abmelden",
"add_account": "Konto hinzufügen",
"set_as_default": "Als Standard festlegen",
"switch_account": "Konto wechseln",
"contacts": "Kontakte",
"calendar": "Kalender",
"settings": "Einstellungen",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Dismiss",
"or": "or",
"sign_in_sso": "Sign in with SSO",
"add_account_title": "Add Account",
"add_account_subtitle": "Sign in with another account",
"cancel": "Cancel",
"website": "Website",
"imprint": "Imprint",
"privacy_policy": "Privacy Policy",
@@ -58,6 +61,11 @@
"storage_free": "Free",
"storage_total": "Total",
"sign_out": "Sign out",
"sign_out_of": "Sign out of {account}",
"sign_out_all": "Sign out of all accounts",
"add_account": "Add account",
"set_as_default": "Set as default",
"switch_account": "Switch account",
"contacts": "Contacts",
"calendar": "Calendar",
"settings": "Settings",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Cerrar",
"or": "o",
"sign_in_sso": "Iniciar sesión con SSO",
"add_account_title": "Agregar cuenta",
"add_account_subtitle": "Iniciar sesión con otra cuenta",
"cancel": "Cancelar",
"website": "Sitio web",
"imprint": "Aviso legal",
"privacy_policy": "Política de privacidad",
@@ -58,6 +61,11 @@
"storage_free": "Libre",
"storage_total": "Total",
"sign_out": "Cerrar sesión",
"sign_out_of": "Cerrar sesión de {account}",
"sign_out_all": "Cerrar sesión de todas las cuentas",
"add_account": "Agregar cuenta",
"set_as_default": "Establecer como predeterminada",
"switch_account": "Cambiar cuenta",
"contacts": "Contactos",
"calendar": "Calendario",
"settings": "Configuración",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Fermer",
"or": "ou",
"sign_in_sso": "Se connecter avec SSO",
"add_account_title": "Ajouter un compte",
"add_account_subtitle": "Se connecter avec un autre compte",
"cancel": "Annuler",
"website": "Site web",
"imprint": "Mentions légales",
"privacy_policy": "Politique de confidentialité",
@@ -58,6 +61,11 @@
"storage_free": "Libre",
"storage_total": "Total",
"sign_out": "Se déconnecter",
"sign_out_of": "Se déconnecter de {account}",
"sign_out_all": "Se déconnecter de tous les comptes",
"add_account": "Ajouter un compte",
"set_as_default": "Définir par défaut",
"switch_account": "Changer de compte",
"contacts": "Contacts",
"calendar": "Calendrier",
"settings": "Paramètres",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Chiudi",
"or": "o",
"sign_in_sso": "Accedi con SSO",
"add_account_title": "Aggiungi account",
"add_account_subtitle": "Accedi con un altro account",
"cancel": "Annulla",
"website": "Sito web",
"imprint": "Note legali",
"privacy_policy": "Informativa sulla privacy",
@@ -58,6 +61,11 @@
"storage_free": "Libero",
"storage_total": "Totale",
"sign_out": "Esci",
"sign_out_of": "Disconnetti da {account}",
"sign_out_all": "Disconnetti da tutti gli account",
"add_account": "Aggiungi account",
"set_as_default": "Imposta come predefinito",
"switch_account": "Cambia account",
"contacts": "Contatti",
"calendar": "Calendario",
"settings": "Impostazioni",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "閉じる",
"or": "または",
"sign_in_sso": "SSOでサインイン",
"add_account_title": "アカウントを追加",
"add_account_subtitle": "別のアカウントでサインイン",
"cancel": "キャンセル",
"website": "ウェブサイト",
"imprint": "サイト運営者情報",
"privacy_policy": "プライバシーポリシー",
@@ -58,6 +61,11 @@
"storage_free": "空き",
"storage_total": "合計",
"sign_out": "サインアウト",
"sign_out_of": "{account} からサインアウト",
"sign_out_all": "すべてのアカウントからサインアウト",
"add_account": "アカウントを追加",
"set_as_default": "デフォルトに設定",
"switch_account": "アカウントを切り替え",
"contacts": "連絡先",
"calendar": "カレンダー",
"settings": "設定",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Sluiten",
"or": "of",
"sign_in_sso": "Inloggen met SSO",
"add_account_title": "Account toevoegen",
"add_account_subtitle": "Inloggen met een ander account",
"cancel": "Annuleren",
"website": "Website",
"imprint": "Colofon",
"privacy_policy": "Privacybeleid",
@@ -58,6 +61,11 @@
"storage_free": "Vrij",
"storage_total": "Totaal",
"sign_out": "Afmelden",
"sign_out_of": "Uitloggen van {account}",
"sign_out_all": "Uitloggen van alle accounts",
"add_account": "Account toevoegen",
"set_as_default": "Als standaard instellen",
"switch_account": "Account wisselen",
"contacts": "Contacten",
"calendar": "Agenda",
"settings": "Instellingen",
+8
View File
@@ -34,6 +34,9 @@
"dismiss": "Fechar",
"or": "ou",
"sign_in_sso": "Entrar com SSO",
"add_account_title": "Adicionar conta",
"add_account_subtitle": "Entrar com outra conta",
"cancel": "Cancelar",
"website": "Site",
"imprint": "Informações legais",
"privacy_policy": "Política de privacidade",
@@ -58,6 +61,11 @@
"storage_free": "Livre",
"storage_total": "Total",
"sign_out": "Sair",
"sign_out_of": "Sair de {account}",
"sign_out_all": "Sair de todas as contas",
"add_account": "Adicionar conta",
"set_as_default": "Definir como padrão",
"switch_account": "Trocar conta",
"contacts": "Contatos",
"calendar": "Calendário",
"settings": "Configurações",