Skip to content

Commit aee1421

Browse files
committed
msglist [nfc]: Introduce MarkAsReadAnimation widget
MarkAsReadAnimation is expected to get more complex in the upcoming commits, so it's better to have it in a separate widget.
1 parent 1bf217c commit aee1421

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

lib/widgets/message_list.dart

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -507,10 +507,9 @@ class _MarkAsReadWidgetState extends State<MarkAsReadWidget> {
507507

508508
return IgnorePointer(
509509
ignoring: areMessagesRead,
510-
child: AnimatedOpacity(
511-
opacity: areMessagesRead ? 0 : loading ? 0.5 : 1,
512-
duration: Duration(milliseconds: areMessagesRead ? 2000 : 300),
513-
curve: Curves.easeOut,
510+
child: MarkAsReadAnimation(
511+
loading: loading,
512+
hidden: areMessagesRead,
514513
child: SizedBox(width: double.infinity,
515514
// Design referenced from:
516515
// https://www.figma.com/file/1JTNtYo9memgW7vV6d0ygq/Zulip-Mobile?type=design&node-id=132-9684&mode=design&t=jJwHzloKJ0TMOG4M-0
@@ -544,6 +543,28 @@ class _MarkAsReadWidgetState extends State<MarkAsReadWidget> {
544543
}
545544
}
546545

546+
class MarkAsReadAnimation extends StatelessWidget {
547+
final bool loading;
548+
final bool hidden;
549+
final Widget child;
550+
551+
const MarkAsReadAnimation({
552+
super.key,
553+
required this.loading,
554+
required this.hidden,
555+
required this.child
556+
});
557+
558+
@override
559+
Widget build(BuildContext context) {
560+
return AnimatedOpacity(
561+
opacity: hidden ? 0 : loading ? 0.5 : 1,
562+
duration: Duration(milliseconds: hidden ? 2000 : 300),
563+
curve: Curves.easeOut,
564+
child: child);
565+
}
566+
}
567+
547568
class RecipientHeader extends StatelessWidget {
548569
const RecipientHeader({super.key, required this.message, required this.narrow});
549570

test/widgets/message_list_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,11 @@ void main() {
901901
check(opacity.opacity).equals(expected ? 0.5 : 1.0);
902902
}
903903

904+
void checkHasOpacityValue(WidgetTester tester, Widget child, double expectedOpacity) {
905+
check(find.byWidget(child).evaluate()).length.equals(1);
906+
check(tester.widget<AnimatedOpacity>(find.byType(AnimatedOpacity)).opacity).equals(expectedOpacity);
907+
}
908+
904909
testWidgets('loading is changed correctly', (WidgetTester tester) async {
905910
final narrow = TopicNarrow.ofMessage(message);
906911
await setupMessageListPage(tester,
@@ -945,6 +950,42 @@ void main() {
945950
await tester.pump(const Duration(milliseconds: 2000));
946951
checkAppearsLoading(tester, false);
947952
});
953+
954+
testWidgets('in idle state', (WidgetTester tester) async {
955+
final child = Container();
956+
957+
await tester.pumpWidget(MaterialApp(
958+
home: MarkAsReadAnimation(hidden: false, loading: false, child: child)));
959+
960+
checkHasOpacityValue(tester, child, 1);
961+
});
962+
963+
testWidgets('in loading state', (WidgetTester tester) async {
964+
final child = Container();
965+
966+
await tester.pumpWidget(MaterialApp(
967+
home: MarkAsReadAnimation(hidden: false, loading: true, child: child)));
968+
969+
checkHasOpacityValue(tester, child, 0.5);
970+
});
971+
972+
testWidgets('in hidden state', (WidgetTester tester) async {
973+
final child = Container();
974+
975+
await tester.pumpWidget(MaterialApp(
976+
home: MarkAsReadAnimation(hidden: true, loading: false, child: child)));
977+
978+
checkHasOpacityValue(tester, child, 0);
979+
});
980+
981+
testWidgets('in hidden state but loading is true', (WidgetTester tester) async {
982+
final child = Container();
983+
984+
await tester.pumpWidget(MaterialApp(
985+
home: MarkAsReadAnimation(hidden: true, loading: true, child: child)));
986+
987+
checkHasOpacityValue(tester, child, 0);
988+
});
948989
});
949990

950991
testWidgets('smoke test on modern server', (WidgetTester tester) async {

0 commit comments

Comments
 (0)