From 8950655871e73be2d5db1e0c68e0ed8c741b24f3 Mon Sep 17 00:00:00 2001 From: vjrj <vjrj@comunes.org> Date: Wed, 3 May 2023 00:01:44 +0200 Subject: [PATCH] Animate slidable in contacts to show this feature --- lib/ui/ui_helpers.dart | 76 +++++++++++++++++++ .../widgets/third_screen/contacts_page.dart | 4 +- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/ui/ui_helpers.dart b/lib/ui/ui_helpers.dart index 7d42ce48..f280ea4e 100644 --- a/lib/ui/ui_helpers.dart +++ b/lib/ui/ui_helpers.dart @@ -5,9 +5,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:path_provider/path_provider.dart'; import 'package:timeago/timeago.dart' as timeago; +import '../data/models/app_cubit.dart'; import '../data/models/contact.dart'; import '../data/models/node_list_cubit.dart'; import '../data/models/transaction_cubit.dart'; @@ -190,6 +192,80 @@ void fetchTransactions(BuildContext context) { transCubit.fetchTransactions(nodeListCubit); } +class SlidableContactTile extends StatefulWidget { + const SlidableContactTile(this.contact, + {super.key, + required this.index, + required this.context, + this.onTap, + this.onLongPress, + this.trailing}); + + @override + State<SlidableContactTile> createState() => _SlidableContactTile(); + + final Contact contact; + final int index; + final BuildContext context; + final VoidCallback? onTap; + final VoidCallback? onLongPress; + final Widget? trailing; +} + +class _SlidableContactTile extends State<SlidableContactTile> { + @override + void initState() { + super.initState(); + _start(); + } + + // Based in https://github.com/letsar/flutter_slidable/issues/288 + Future<void> _start() async { + if (widget.index == 0 && + !context.read<AppCubit>().wasTutorialShown(tutorialId)) { + await Future<void>.delayed(const Duration(seconds: 1)); + if (!mounted) { + return; + } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(tr('slidable_tutorial')), + action: SnackBarAction( + label: 'OK', + onPressed: () { + ScaffoldMessenger.of(context).hideCurrentSnackBar(); + context.read<AppCubit>().onFinishTutorial(tutorialId); + // context.read<AppCubit>().warningViewed(); + }, + ), + ), + ); + final SlidableController? slidable = Slidable.of(context); + + slidable?.openEndActionPane( + duration: const Duration(milliseconds: 300), + curve: Curves.decelerate, + ); + + Future<void>.delayed(const Duration(seconds: 1), () { + slidable?.close( + duration: const Duration(milliseconds: 300), + curve: Curves.bounceInOut, + ); + }); + } + } + + static String tutorialId = 'slidable_tutorial'; + + @override + Widget build(_) => + contactToListItem(widget.contact, widget.index, widget.context, + onTap: widget.onTap, + onLongPress: widget.onLongPress, + trailing: widget.trailing); +} + ListTile contactToListItem(Contact contact, int index, BuildContext context, {VoidCallback? onTap, VoidCallback? onLongPress, Widget? trailing}) { final String title = contact.title; diff --git a/lib/ui/widgets/third_screen/contacts_page.dart b/lib/ui/widgets/third_screen/contacts_page.dart index 62a8c570..b23c2362 100644 --- a/lib/ui/widgets/third_screen/contacts_page.dart +++ b/lib/ui/widgets/third_screen/contacts_page.dart @@ -130,8 +130,8 @@ class _ContactsPageState extends State<ContactsPage> { ), ], ), - child: contactToListItem(contact, index, context, - onLongPress: () { + child: SlidableContactTile(contact, + index: index, context: context, onLongPress: () { showDialog( context: context, builder: (BuildContext context) { -- GitLab