From 47917ecbc695e9a6d26591fa6adcf5b614c37035 Mon Sep 17 00:00:00 2001 From: chimnayajith Date: Thu, 30 Jan 2025 16:31:56 +0530 Subject: [PATCH] home: Display current organization's name and icon atop menu Fixes #1037 --- assets/l10n/app_en.arb | 4 ++ lib/generated/l10n/zulip_localizations.dart | 6 ++ .../l10n/zulip_localizations_ar.dart | 3 + .../l10n/zulip_localizations_en.dart | 3 + .../l10n/zulip_localizations_ja.dart | 3 + .../l10n/zulip_localizations_nb.dart | 3 + .../l10n/zulip_localizations_pl.dart | 3 + .../l10n/zulip_localizations_ru.dart | 3 + .../l10n/zulip_localizations_sk.dart | 3 + lib/widgets/home.dart | 64 +++++++++++++++++++ test/widgets/home_test.dart | 18 ++++++ 11 files changed, 113 insertions(+) diff --git a/assets/l10n/app_en.arb b/assets/l10n/app_en.arb index ee7e96c35f8..8e1538185a3 100644 --- a/assets/l10n/app_en.arb +++ b/assets/l10n/app_en.arb @@ -23,6 +23,10 @@ "@switchAccountButton": { "description": "Label for main-menu button leading to the choose-account page." }, + "organizationsButtonLabel": "Organizations", + "@organizationsButtonLabel": { + "description": "Button text to view and switch between different organizations." + }, "tryAnotherAccountMessage": "Your account at {url} is taking a while to load.", "@tryAnotherAccountMessage": { "description": "Message that appears on the loading screen after waiting for some time.", diff --git a/lib/generated/l10n/zulip_localizations.dart b/lib/generated/l10n/zulip_localizations.dart index b6fbb707698..979e3e586a6 100644 --- a/lib/generated/l10n/zulip_localizations.dart +++ b/lib/generated/l10n/zulip_localizations.dart @@ -141,6 +141,12 @@ abstract class ZulipLocalizations { /// **'Switch account'** String get switchAccountButton; + /// Button text to view and switch between different organizations. + /// + /// In en, this message translates to: + /// **'Organizations'** + String get organizationsButtonLabel; + /// Message that appears on the loading screen after waiting for some time. /// /// In en, this message translates to: diff --git a/lib/generated/l10n/zulip_localizations_ar.dart b/lib/generated/l10n/zulip_localizations_ar.dart index 025b4b14441..01bfacb57a9 100644 --- a/lib/generated/l10n/zulip_localizations_ar.dart +++ b/lib/generated/l10n/zulip_localizations_ar.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations { @override String get switchAccountButton => 'Switch account'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Your account at $url is taking a while to load.'; diff --git a/lib/generated/l10n/zulip_localizations_en.dart b/lib/generated/l10n/zulip_localizations_en.dart index 9467d334288..37b867b59de 100644 --- a/lib/generated/l10n/zulip_localizations_en.dart +++ b/lib/generated/l10n/zulip_localizations_en.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations { @override String get switchAccountButton => 'Switch account'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Your account at $url is taking a while to load.'; diff --git a/lib/generated/l10n/zulip_localizations_ja.dart b/lib/generated/l10n/zulip_localizations_ja.dart index f363ee00433..37ca37e5406 100644 --- a/lib/generated/l10n/zulip_localizations_ja.dart +++ b/lib/generated/l10n/zulip_localizations_ja.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations { @override String get switchAccountButton => 'Switch account'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Your account at $url is taking a while to load.'; diff --git a/lib/generated/l10n/zulip_localizations_nb.dart b/lib/generated/l10n/zulip_localizations_nb.dart index 35b3e86fe5f..8d734b95c24 100644 --- a/lib/generated/l10n/zulip_localizations_nb.dart +++ b/lib/generated/l10n/zulip_localizations_nb.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations { @override String get switchAccountButton => 'Switch account'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Your account at $url is taking a while to load.'; diff --git a/lib/generated/l10n/zulip_localizations_pl.dart b/lib/generated/l10n/zulip_localizations_pl.dart index 0594722d31b..fe0702c4f74 100644 --- a/lib/generated/l10n/zulip_localizations_pl.dart +++ b/lib/generated/l10n/zulip_localizations_pl.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations { @override String get switchAccountButton => 'Przełącz konto'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Twoje konto na $url wymaga jeszcze chwili na załadowanie.'; diff --git a/lib/generated/l10n/zulip_localizations_ru.dart b/lib/generated/l10n/zulip_localizations_ru.dart index 879559fed4d..a0b01d655db 100644 --- a/lib/generated/l10n/zulip_localizations_ru.dart +++ b/lib/generated/l10n/zulip_localizations_ru.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations { @override String get switchAccountButton => 'Сменить учетную запись'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Ваша учетная запись на $url загружается медленно.'; diff --git a/lib/generated/l10n/zulip_localizations_sk.dart b/lib/generated/l10n/zulip_localizations_sk.dart index af87dfd949e..637851152ad 100644 --- a/lib/generated/l10n/zulip_localizations_sk.dart +++ b/lib/generated/l10n/zulip_localizations_sk.dart @@ -26,6 +26,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations { @override String get switchAccountButton => 'Zmeniť účet'; + @override + String get organizationsButtonLabel => 'Organizations'; + @override String tryAnotherAccountMessage(Object url) { return 'Načítavanie vášho konta na adrese $url chvílu trvá.'; diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index ad70b57c32b..850e2912cad 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -310,6 +310,7 @@ void _showMainMenu(BuildContext context, { crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisSize: MainAxisSize.min, children: [ + _OrganizationHeader(), Flexible(child: InsetShadowBox( top: 8, bottom: 8, color: designVariables.bgBotBar, @@ -326,6 +327,69 @@ void _showMainMenu(BuildContext context, { }); } +class _OrganizationHeader extends StatelessWidget { + @override + Widget build(BuildContext context) { + final store = PerAccountStoreWidget.of(context); + final designVariables = DesignVariables.of(context); + final zulipLocalizations = ZulipLocalizations.of(context); + + String organizationName = store.realmName; + Uri? organizationIcon = store.tryResolveUrl(store.realmIcon); + final buttonStyle = TextButton.styleFrom( + splashFactory: NoSplash.splashFactory, + overlayColor: Colors.transparent + ); + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Row( + children: [ + Image.network( + organizationIcon.toString(), + width: 28, + height: 28, + fit: BoxFit.contain, + ), + const SizedBox(width: 8), + Expanded( + child: Text( + organizationName, + style: const TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20, + ), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + ], + ), + ), + TextButton( + onPressed: () { + Navigator.of(context).push(MaterialWidgetRoute(page: const ChooseAccountPage())); + }, + style: buttonStyle, + child: Text( + zulipLocalizations.organizationsButtonLabel, + style: TextStyle( + fontSize: 19, + fontWeight: FontWeight.w500, + color: designVariables.icon, + ), + ), + ), + ], + ), + ); + } +} + abstract class _MenuButton extends StatelessWidget { const _MenuButton(); diff --git a/test/widgets/home_test.dart b/test/widgets/home_test.dart index 5bb789727f6..b369242c211 100644 --- a/test/widgets/home_test.dart +++ b/test/widgets/home_test.dart @@ -248,6 +248,24 @@ void main () { check(find.byType(BottomSheet)).findsNothing(); }); + testWidgets('organization header shows realm info and navigation works', (tester) async { + await prepare(tester); + final store = await testBinding.globalStore.perAccount(eg.selfAccount.id); + await tapOpenMenu(tester); + + check(find.text(store.realmName)).findsOne(); + check(find.byType(Image)).findsOne(); + + final organizationsButton = find.text('Organizations'); + check(organizationsButton).findsOne(); + + await tester.tap(organizationsButton); + await tester.pump(Duration.zero); + await tester.pump(const Duration(milliseconds: 250)); // wait for animation + + check(find.byType(ChooseAccountPage)).findsOne(); + }); + testWidgets('_MyProfileButton', (tester) async { await prepare(tester); await tapOpenMenu(tester);