diff --git a/lib/router.dart b/lib/router.dart index 611e766..c90d89a 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -192,11 +192,6 @@ final _appRoutes = [ child: const RealmScreen(), ), routes: [ - GoRoute( - path: '/:alias', - name: 'realmDetail', - builder: (context, state) => RealmDetailScreen(alias: state.pathParameters['alias']!), - ), GoRoute( path: '/manage', name: 'realmManage', @@ -204,6 +199,11 @@ final _appRoutes = [ editingRealmAlias: state.uri.queryParameters['editing'], ), ), + GoRoute( + path: '/:alias', + name: 'realmDetail', + builder: (context, state) => RealmDetailScreen(alias: state.pathParameters['alias']!), + ), ], ), GoRoute(path: '/news', name: 'news', builder: (context, state) => const NewsScreen(), routes: [ diff --git a/lib/screens/chat/manage.dart b/lib/screens/chat/manage.dart index ea0ddae..f88edd1 100644 --- a/lib/screens/chat/manage.dart +++ b/lib/screens/chat/manage.dart @@ -1,3 +1,4 @@ +import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -17,6 +18,7 @@ import 'package:uuid/uuid.dart'; class ChatManageScreen extends StatefulWidget { final String? editingChannelAlias; + const ChatManageScreen({super.key, this.editingChannelAlias}); @override @@ -33,6 +35,8 @@ class _ChatManageScreenState extends State { List? _realms; SnRealm? _belongToRealm; + SnChannel? _editingChannel; + Future _fetchRealms() async { setState(() => _isBusy = true); try { @@ -41,6 +45,9 @@ class _ChatManageScreenState extends State { _realms = List.from( resp.data?.map((e) => SnRealm.fromJson(e)) ?? [], ); + if (_editingChannel != null) { + _belongToRealm = _realms?.firstWhereOrNull((e) => e.id == _editingChannel!.realmId); + } } catch (err) { if (mounted) context.showErrorDialog(err); } finally { @@ -48,8 +55,6 @@ class _ChatManageScreenState extends State { } } - SnChannel? _editingChannel; - Future _fetchChannel() async { setState(() => _isBusy = true); @@ -124,9 +129,7 @@ class _ChatManageScreenState extends State { Widget build(BuildContext context) { return AppScaffold( appBar: AppBar( - title: widget.editingChannelAlias != null - ? Text('screenChatManage').tr() - : Text('screenChatNew').tr(), + title: widget.editingChannelAlias != null ? Text('screenChatManage').tr() : Text('screenChatNew').tr(), ), body: SingleChildScrollView( child: Column( @@ -138,8 +141,7 @@ class _ChatManageScreenState extends State { leadingPadding: const EdgeInsets.only(left: 10, right: 20), dividerColor: Colors.transparent, content: Text( - 'channelEditingNotice' - .tr(args: ['#${_editingChannel!.alias}']), + 'channelEditingNotice'.tr(args: ['#${_editingChannel!.alias}']), ), actions: [ TextButton( @@ -162,6 +164,7 @@ class _ChatManageScreenState extends State { items: [ ...(_realms?.map( (SnRealm item) => DropdownMenuItem( + enabled: _editingChannel == null || _editingChannel?.realmId == item.id, value: item, child: Row( children: [ @@ -179,15 +182,12 @@ class _ChatManageScreenState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(item.name).textStyle(Theme.of(context) - .textTheme - .bodyMedium!), + Text(item.name).textStyle(Theme.of(context).textTheme.bodyMedium!), Text( item.description, maxLines: 1, overflow: TextOverflow.ellipsis, - ).textStyle( - Theme.of(context).textTheme.bodySmall!), + ).textStyle(Theme.of(context).textTheme.bodySmall!), ], ), ), @@ -197,14 +197,14 @@ class _ChatManageScreenState extends State { ) ?? []), DropdownMenuItem( + enabled: _editingChannel == null, value: null, child: Row( children: [ CircleAvatar( radius: 16, backgroundColor: Colors.transparent, - foregroundColor: - Theme.of(context).colorScheme.onSurface, + foregroundColor: Theme.of(context).colorScheme.onSurface, child: const Icon(Symbols.clear), ), const Gap(12), @@ -213,9 +213,7 @@ class _ChatManageScreenState extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text('fieldChatBelongToRealmUnset') - .tr() - .textStyle( + Text('fieldChatBelongToRealmUnset').tr().textStyle( Theme.of(context).textTheme.bodyMedium!, ), ], @@ -231,10 +229,10 @@ class _ChatManageScreenState extends State { }, buttonStyleData: const ButtonStyleData( padding: EdgeInsets.only(right: 16), - height: 60, + height: 48, ), menuItemStyleData: const MenuItemStyleData( - height: 60, + height: 48, ), ), ), @@ -250,8 +248,7 @@ class _ChatManageScreenState extends State { helperText: 'fieldChatAliasHint'.tr(), helperMaxLines: 2, ), - onTapOutside: (_) => - FocusManager.instance.primaryFocus?.unfocus(), + onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(4), TextField( @@ -260,8 +257,7 @@ class _ChatManageScreenState extends State { border: const UnderlineInputBorder(), labelText: 'fieldChatName'.tr(), ), - onTapOutside: (_) => - FocusManager.instance.primaryFocus?.unfocus(), + onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(4), TextField( @@ -272,8 +268,7 @@ class _ChatManageScreenState extends State { border: const UnderlineInputBorder(), labelText: 'fieldChatDescription'.tr(), ), - onTapOutside: (_) => - FocusManager.instance.primaryFocus?.unfocus(), + onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(12), Row( diff --git a/lib/widgets/account/account_select.dart b/lib/widgets/account/account_select.dart index dc623df..77a237c 100644 --- a/lib/widgets/account/account_select.dart +++ b/lib/widgets/account/account_select.dart @@ -6,6 +6,7 @@ import 'package:provider/provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/user_directory.dart'; +import 'package:surface/providers/userinfo.dart'; import 'package:surface/types/account.dart'; import 'package:surface/widgets/account/account_image.dart'; @@ -49,10 +50,19 @@ class _AccountSelectState extends State { Future _getFriends() async { final sn = context.read(); final resp = await sn.client.get('/cgi/id/users/me/relations?status=1'); + if (!mounted) return; + final ua = context.read(); setState(() { _relativeUsers.addAll( - resp.data?.map((e) => SnRelationship.fromJson(e)) ?? [], + resp.data?.map((e) { + final rel = SnRelationship.fromJson(e); + if (rel.relatedId == ua.user?.id) { + return rel.account!; + } else { + return rel.related!; + } + }).cast(), ); }); } @@ -123,13 +133,9 @@ class _AccountSelectState extends State { ), Expanded( child: ListView.builder( - itemCount: _pendingUsers.isEmpty - ? _relativeUsers.length - : _pendingUsers.length, + itemCount: _pendingUsers.isEmpty ? _relativeUsers.length : _pendingUsers.length, itemBuilder: (context, index) { - var user = _pendingUsers.isEmpty - ? _relativeUsers[index] - : _pendingUsers[index]; + var user = _pendingUsers.isEmpty ? _relativeUsers[index] : _pendingUsers[index]; return ListTile( title: Text(user.nick), subtitle: Text(user.name), @@ -148,8 +154,7 @@ class _AccountSelectState extends State { } setState(() { - final idx = _selectedUsers - .indexWhere((x) => x.id == user.id); + final idx = _selectedUsers.indexWhere((x) => x.id == user.id); if (idx != -1) { _selectedUsers.removeAt(idx); } else {