From 59c34ada404dd51f1e34aba99bf83b99e3671050 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 21 Dec 2025 15:47:19 +0800 Subject: [PATCH] :bug: Add realm entry to the account page, close #205 --- lib/screens/account.dart | 13 +++- lib/screens/realm/realms.dart | 137 ++++++++++++++++------------------ 2 files changed, 76 insertions(+), 74 deletions(-) diff --git a/lib/screens/account.dart b/lib/screens/account.dart index 27fb1b61..d026cd8b 100644 --- a/lib/screens/account.dart +++ b/lib/screens/account.dart @@ -386,6 +386,17 @@ class AccountScreen extends HookConsumerWidget { context.goNamed('files'); }, ), + if (!isWideScreen(context)) + ListTile( + minTileHeight: 48, + leading: const Icon(Symbols.group), + trailing: const Icon(Symbols.chevron_right), + contentPadding: EdgeInsets.symmetric(horizontal: 24), + title: Text('realms').tr(), + onTap: () { + context.goNamed('realmList'); + }, + ), ListTile( minTileHeight: 48, leading: const Icon(Symbols.wallet), @@ -408,7 +419,7 @@ class AccountScreen extends HookConsumerWidget { ), ListTile( minTileHeight: 48, - leading: const Icon(Symbols.emoji_emotions), + leading: const Icon(Symbols.sticker_rounded), trailing: const Icon(Symbols.chevron_right), contentPadding: EdgeInsets.symmetric(horizontal: 24), title: Text('stickers').tr(), diff --git a/lib/screens/realm/realms.dart b/lib/screens/realm/realms.dart index 0d85aefd..dedfbbb2 100644 --- a/lib/screens/realm/realms.dart +++ b/lib/screens/realm/realms.dart @@ -63,6 +63,7 @@ class RealmListScreen extends HookConsumerWidget { return AppScaffold( isNoBackground: false, appBar: AppBar( + leading: const PageBackButton(backTo: '/account'), title: const Text('realms').tr(), actions: [ IconButton( @@ -99,33 +100,31 @@ class RealmListScreen extends HookConsumerWidget { ), body: ExtendedRefreshIndicator( child: realms.when( - data: - (value) => Column( - children: [ - Expanded( - child: ListView.separated( - padding: EdgeInsets.only( - top: 8, - bottom: MediaQuery.of(context).padding.bottom + 8, - ), - itemCount: value.length, - itemBuilder: (context, item) { - return ConstrainedBox( - constraints: const BoxConstraints(maxWidth: 540), - child: RealmListTile(realm: value[item]), - ).padding(horizontal: 8).center(); - }, - separatorBuilder: (_, _) => const Gap(8), - ), + data: (value) => Column( + children: [ + Expanded( + child: ListView.separated( + padding: EdgeInsets.only( + top: 8, + bottom: MediaQuery.of(context).padding.bottom + 8, ), - ], + itemCount: value.length, + itemBuilder: (context, item) { + return ConstrainedBox( + constraints: const BoxConstraints(maxWidth: 540), + child: RealmListTile(realm: value[item]), + ).padding(horizontal: 8).center(); + }, + separatorBuilder: (_, _) => const Gap(8), + ), ), + ], + ), loading: () => const Center(child: CircularProgressIndicator()), - error: - (e, _) => ResponseErrorWidget( - error: e, - onRetry: () => ref.invalidate(realmsJoinedProvider), - ), + error: (e, _) => ResponseErrorWidget( + error: e, + onRetry: () => ref.invalidate(realmsJoinedProvider), + ), ), onRefresh: () => ref.refresh(realmsJoinedProvider.future), ), @@ -183,57 +182,49 @@ class _RealmInviteSheet extends HookConsumerWidget { ), ], child: invites.when( - data: - (items) => - items.isEmpty - ? Center( - child: - Text( - 'invitesEmpty', - textAlign: TextAlign.center, - ).tr(), - ) - : ListView.builder( - shrinkWrap: true, - itemCount: items.length, - itemBuilder: (context, index) { - final invite = items[index]; - return ListTile( - leading: ProfilePictureWidget( - fileId: invite.realm!.picture?.id, - fallbackIcon: Symbols.group, - ), - title: Text(invite.realm!.name), - subtitle: - Text( - invite.role >= 100 - ? 'permissionOwner' - : invite.role >= 50 - ? 'permissionModerator' - : 'permissionMember', - ).tr(), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - IconButton( - icon: const Icon(Symbols.check), - onPressed: () => acceptInvite(invite), - ), - IconButton( - icon: const Icon(Symbols.close), - onPressed: () => declineInvite(invite), - ), - ], - ), - ); - }, + data: (items) => items.isEmpty + ? Center( + child: Text('invitesEmpty', textAlign: TextAlign.center).tr(), + ) + : ListView.builder( + shrinkWrap: true, + itemCount: items.length, + itemBuilder: (context, index) { + final invite = items[index]; + return ListTile( + leading: ProfilePictureWidget( + fileId: invite.realm!.picture?.id, + fallbackIcon: Symbols.group, ), + title: Text(invite.realm!.name), + subtitle: Text( + invite.role >= 100 + ? 'permissionOwner' + : invite.role >= 50 + ? 'permissionModerator' + : 'permissionMember', + ).tr(), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(Symbols.check), + onPressed: () => acceptInvite(invite), + ), + IconButton( + icon: const Icon(Symbols.close), + onPressed: () => declineInvite(invite), + ), + ], + ), + ); + }, + ), loading: () => const Center(child: CircularProgressIndicator()), - error: - (error, _) => ResponseErrorWidget( - error: error, - onRetry: () => ref.invalidate(realmInvitesProvider), - ), + error: (error, _) => ResponseErrorWidget( + error: error, + onRetry: () => ref.invalidate(realmInvitesProvider), + ), ), ); }