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