Compare commits

...

3 Commits

Author SHA1 Message Date
a75083d916 ♻️ Improve the attachment item gesture 2025-04-01 23:48:45 +08:00
919ff5e464 💄 Optimized unread indicator 2025-04-01 22:40:43 +08:00
00863b94e8 🐛 Fix remain bugs 2025-04-01 22:36:06 +08:00
7 changed files with 78 additions and 79 deletions

View File

@ -255,8 +255,9 @@ class PostWriteController extends ChangeNotifier {
List.from(post.categories.map((ele) => ele.alias), growable: true); List.from(post.categories.map((ele) => ele.alias), growable: true);
attachments.addAll( attachments.addAll(
post.body['attachments'] post.body['attachments']
?.where((ele) => SnAttachment.fromJson(ele)) ?.map((ele) => SnAttachment.fromJson(ele))
?.map(PostWriteMedia) ?? ?.map((ele) => PostWriteMedia(ele))
?.cast<PostWriteMedia>() ??
[], [],
); );
poll = post.poll; poll = post.poll;

View File

@ -171,7 +171,18 @@ class _ChatScreenState extends State<ChatScreen> {
} }
void _onTapChannel(SnChannel channel) { void _onTapChannel(SnChannel channel) {
setState(() => _unreadCounts?[channel.id] = 0); setState(() {
_unreadCounts?[channel.id] = 0;
if (channel.realmId != null) {
_unreadCountsGrouped?[channel.realmId!] =
(_unreadCountsGrouped?[channel.realmId!] ?? 0) -
(_unreadCounts?[channel.id] ?? 0);
}
if (channel.type == 1) {
_unreadCountsGrouped?[0] =
(_unreadCountsGrouped?[0] ?? 0) - (_unreadCounts?[channel.id] ?? 0);
}
});
if (ResponsiveScaffold.getIsExpand(context)) { if (ResponsiveScaffold.getIsExpand(context)) {
GoRouter.of(context).pushReplacementNamed( GoRouter.of(context).pushReplacementNamed(
'chatRoom', 'chatRoom',
@ -180,9 +191,8 @@ class _ChatScreenState extends State<ChatScreen> {
'alias': channel.alias, 'alias': channel.alias,
}, },
).then((value) { ).then((value) {
if (mounted) { if (mounted && value == true) {
setState(() => _unreadCounts?[channel.id] = 0); _refreshChannels();
_refreshChannels(noRemote: true);
} }
}); });
} else { } else {
@ -193,9 +203,8 @@ class _ChatScreenState extends State<ChatScreen> {
'alias': channel.alias, 'alias': channel.alias,
}, },
).then((value) { ).then((value) {
if (mounted) { if (mounted && value == true) {
setState(() => _unreadCounts?[channel.id] = 0); _refreshChannels();
_refreshChannels(noRemote: true);
} }
}); });
} }

View File

@ -11,7 +11,6 @@ import 'package:styled_widget/styled_widget.dart';
import 'package:surface/providers/notification.dart'; import 'package:surface/providers/notification.dart';
import 'package:surface/providers/sn_network.dart'; import 'package:surface/providers/sn_network.dart';
import 'package:surface/types/notification.dart'; import 'package:surface/types/notification.dart';
import 'package:surface/widgets/app_bar_leading.dart';
import 'package:surface/widgets/dialog.dart'; import 'package:surface/widgets/dialog.dart';
import 'package:surface/widgets/loading_indicator.dart'; import 'package:surface/widgets/loading_indicator.dart';
import 'package:surface/widgets/markdown_content.dart'; import 'package:surface/widgets/markdown_content.dart';
@ -156,7 +155,7 @@ class _NotificationScreenState extends State<NotificationScreen> {
return AppScaffold( return AppScaffold(
appBar: AppBar( appBar: AppBar(
leading: AutoAppBarLeading(), leading: PageBackButton(),
title: Text('screenNotification').tr(), title: Text('screenNotification').tr(),
actions: [ actions: [
IconButton( IconButton(

View File

@ -60,7 +60,7 @@ class AccountPopoverCard extends StatelessWidget {
IconButton( IconButton(
onPressed: () { onPressed: () {
Navigator.pop(context); Navigator.pop(context);
GoRouter.of(context).pushNamed( GoRouter.of(context).pushReplacementNamed(
'accountProfilePage', 'accountProfilePage',
pathParameters: {'name': data.name}, pathParameters: {'name': data.name},
); );

View File

@ -25,6 +25,7 @@ class AttachmentItem extends StatelessWidget {
final String? heroTag; final String? heroTag;
final BoxFit fit; final BoxFit fit;
final FilterQuality? filterQuality; final FilterQuality? filterQuality;
final Function? onZoom;
const AttachmentItem({ const AttachmentItem({
super.key, super.key,
@ -32,6 +33,7 @@ class AttachmentItem extends StatelessWidget {
required this.data, required this.data,
required this.heroTag, required this.heroTag,
this.filterQuality, this.filterQuality,
this.onZoom,
}); });
Widget _buildContent(BuildContext context) { Widget _buildContent(BuildContext context) {
@ -94,7 +96,14 @@ class AttachmentItem extends StatelessWidget {
}); });
} }
return _buildContent(context); return GestureDetector(
child: _buildContent(context),
onTap: () {
if (data?.mimetype.startsWith('image') ?? false) {
onZoom?.call();
}
},
);
} }
} }

View File

@ -74,40 +74,35 @@ class _AttachmentListState extends State<AttachmentList> {
return Container( return Container(
padding: widget.padding ?? EdgeInsets.zero, padding: widget.padding ?? EdgeInsets.zero,
constraints: constraints, constraints: constraints,
child: GestureDetector( child: AspectRatio(
child: AspectRatio( aspectRatio: singleAspectRatio,
aspectRatio: singleAspectRatio, child: Container(
child: Container( decoration: BoxDecoration(
decoration: BoxDecoration( color: backgroundColor,
color: backgroundColor, border: Border.fromBorderSide(borderSide),
border: Border.fromBorderSide(borderSide), borderRadius: AttachmentList.kDefaultRadius,
borderRadius: AttachmentList.kDefaultRadius, ),
), child: ClipRRect(
child: ClipRRect( borderRadius: AttachmentList.kDefaultRadius,
borderRadius: AttachmentList.kDefaultRadius, child: AttachmentItem(
child: AttachmentItem( data: widget.data[0],
data: widget.data[0], heroTag: heroTags[0],
heroTag: heroTags[0], fit: widget.fit,
fit: widget.fit, filterQuality: widget.filterQuality,
filterQuality: widget.filterQuality, onZoom: () {
), context.pushTransparentRoute(
AttachmentZoomView(
data: widget.data.where((ele) => ele != null).cast(),
initialIndex: 0,
heroTags: heroTags,
),
backgroundColor: Colors.black.withOpacity(0.7),
rootNavigator: true,
);
},
), ),
), ),
), ),
onTap: () {
if (widget.data.firstOrNull?.mediaType != SnMediaType.image) {
return;
}
context.pushTransparentRoute(
AttachmentZoomView(
data: widget.data.where((ele) => ele != null).cast(),
initialIndex: 0,
heroTags: heroTags,
),
backgroundColor: Colors.black.withOpacity(0.7),
rootNavigator: true,
);
},
), ),
); );
} }
@ -133,33 +128,27 @@ class _AttachmentListState extends State<AttachmentList> {
mainAxisSpacing: 4, mainAxisSpacing: 4,
children: widget.data children: widget.data
.mapIndexed( .mapIndexed(
(idx, ele) => GestureDetector( (idx, ele) => Container(
child: Container( constraints: constraints,
constraints: constraints, child: AttachmentItem(
child: AttachmentItem( data: ele,
data: ele, heroTag: heroTags[idx],
heroTag: heroTags[idx], fit: BoxFit.cover,
fit: BoxFit.cover, filterQuality: widget.filterQuality,
filterQuality: widget.filterQuality, onZoom: () {
), context.pushTransparentRoute(
AttachmentZoomView(
data: widget.data
.where((ele) => ele != null)
.cast(),
initialIndex: idx,
heroTags: heroTags,
),
backgroundColor: Colors.black.withOpacity(0.7),
rootNavigator: true,
);
},
), ),
onTap: () {
if (widget.data[idx]!.mediaType !=
SnMediaType.image) {
return;
}
context.pushTransparentRoute(
AttachmentZoomView(
data: widget.data
.where((ele) => ele != null)
.cast(),
initialIndex: idx,
heroTags: heroTags,
),
backgroundColor: Colors.black.withOpacity(0.7),
rootNavigator: true,
);
},
), ),
) )
.toList(), .toList(),

View File

@ -100,6 +100,7 @@ class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
contentPadding: EdgeInsets.symmetric(horizontal: 24), contentPadding: EdgeInsets.symmetric(horizontal: 24),
leading: AccountImage( leading: AccountImage(
content: ua.user?.avatar, content: ua.user?.avatar,
backgroundColor: Colors.transparent,
fallbackWidget: fallbackWidget:
ua.isAuthorized ? null : const Icon(Symbols.login), ua.isAuthorized ? null : const Icon(Symbols.login),
), ),
@ -122,15 +123,6 @@ class _AppNavigationDrawerState extends State<AppNavigationDrawer> {
Scaffold.of(context).closeDrawer(); Scaffold.of(context).closeDrawer();
}, },
), ),
IconButton(
icon: const Icon(Symbols.settings, fill: 1),
padding: EdgeInsets.zero,
visualDensity: VisualDensity.compact,
onPressed: () {
GoRouter.of(context).pushNamed('settings');
Scaffold.of(context).closeDrawer();
},
),
], ],
), ),
onTap: () { onTap: () {