From 12e54426bd42da720994dc8d61150492047215d4 Mon Sep 17 00:00:00 2001 From: Omar Hatem Date: Mon, 24 Oct 2022 21:15:17 +0200 Subject: [PATCH] Fix edit/delete option slidable (#561) * Fix Edit Slidable in receive address cell Fix Edit/Delete slidable in contact list * Update Delete node slidable --- .../screens/contact/contact_list_page.dart | 81 ++++++++++--------- lib/src/screens/nodes/nodes_list_page.dart | 80 +++++++++--------- .../screens/receive/widgets/address_cell.dart | 36 +++++---- 3 files changed, 109 insertions(+), 88 deletions(-) diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart index 501d3038c..7912472d8 100644 --- a/lib/src/screens/contact/contact_list_page.dart +++ b/lib/src/screens/contact/contact_list_page.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/entities/contact_base.dart'; +import 'package:cake_wallet/entities/contact_record.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:flutter/material.dart'; @@ -34,12 +35,12 @@ class ContactListPage extends BasePage { height: 32.0, decoration: BoxDecoration( shape: BoxShape.circle, - color: Theme.of(context).accentTextTheme!.caption!.color!), + color: Theme.of(context).accentTextTheme.caption!.color!), child: Stack( alignment: Alignment.center, children: [ Icon(Icons.add, - color: Theme.of(context).primaryTextTheme!.headline6!.color!, + color: Theme.of(context).primaryTextTheme.headline6!.color!, size: 22.0), ButtonTheme( minWidth: 32.0, @@ -66,9 +67,9 @@ class ContactListPage extends BasePage { return CollapsibleSectionList( context: context, sectionCount: 2, - themeColor: Theme.of(context).primaryTextTheme!.headline6!.color!, + themeColor: Theme.of(context).primaryTextTheme.headline6!.color!, dividerThemeColor: - Theme.of(context).primaryTextTheme!.caption!.decorationColor!, + Theme.of(context).primaryTextTheme.caption!.decorationColor!, sectionTitleBuilder: (_, int sectionIndex) { var title = 'Contacts'; @@ -91,37 +92,13 @@ class ContactListPage extends BasePage { final contact = contactListViewModel.contacts[index]; final content = generateRaw(context, contact); - // FIX-ME: Slidable - return content; - // return !isEditable - // ? content - // : Slidable( - // key: Key('${contact.key}'), - // actionPane: SlidableDrawerActionPane(), - // child: content, - // secondaryActions: [ - // IconSlideAction( - // caption: S.of(context).edit, - // color: Colors.blue, - // icon: Icons.edit, - // onTap: () async => await Navigator.of(context) - // .pushNamed(Routes.addressBookAddContact, - // arguments: contact), - // ), - // IconSlideAction( - // caption: S.of(context).delete, - // color: Colors.red, - // icon: CupertinoIcons.delete, - // onTap: () async { - // final isDelete = - // await showAlertDialog(context) ?? false; - - // if (isDelete) { - // await contactListViewModel.delete(contact); - // } - // }, - // ), - // ]); + return !isEditable + ? content + : Slidable( + key: Key('${contact.key}'), + endActionPane: _actionPane(context, contact), + child: content, + ); }, ); }, @@ -141,7 +118,7 @@ class ContactListPage extends BasePage { final isCopied = await showNameAndAddressDialog( context, contact.name, contact.address); - if (isCopied != null && isCopied) { + if (isCopied) { await Clipboard.setData(ClipboardData(text: contact.address)); await showBar(context, S.of(context).copied_to_clipboard); } @@ -165,7 +142,7 @@ class ContactListPage extends BasePage { style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, - color: Theme.of(context).primaryTextTheme!.headline6!.color!), + color: Theme.of(context).primaryTextTheme.headline6!.color!), ), ) ) @@ -266,4 +243,34 @@ class ContactListPage extends BasePage { actionLeftButton: () => Navigator.of(context).pop(false)); }) ?? false; } + + ActionPane _actionPane(BuildContext context, ContactRecord contact) => ActionPane( + motion: const ScrollMotion(), + extentRatio: 0.4, + children: [ + SlidableAction( + onPressed: (_) async => await Navigator.of(context) + .pushNamed(Routes.addressBookAddContact, + arguments: contact), + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + icon: Icons.edit, + label: S.of(context).edit, + ), + SlidableAction( + onPressed: (_) async { + final isDelete = + await showAlertDialog(context); + + if (isDelete) { + await contactListViewModel.delete(contact); + } + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + icon: CupertinoIcons.delete, + label: S.of(context).delete, + ), + ], + ); } diff --git a/lib/src/screens/nodes/nodes_list_page.dart b/lib/src/screens/nodes/nodes_list_page.dart index 0eb79bada..556a0fd06 100644 --- a/lib/src/screens/nodes/nodes_list_page.dart +++ b/lib/src/screens/nodes/nodes_list_page.dart @@ -1,4 +1,5 @@ import 'package:cake_wallet/utils/show_pop_up.dart'; +import 'package:cw_core/node.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; @@ -26,7 +27,7 @@ class NodeListPage extends BasePage { height: 32, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(16)), - color: Theme.of(context).accentTextTheme!.caption!.color!), + color: Theme.of(context).accentTextTheme.caption!.color!), child: ButtonTheme( minWidth: double.minPositive, child: TextButton( @@ -85,7 +86,7 @@ class NodeListPage extends BasePage { final node = nodeListViewModel.nodes[index]; final isSelected = - node.keyIndex == nodeListViewModel.currentNode?.keyIndex; + node.keyIndex == nodeListViewModel.currentNode.keyIndex; final nodeListRow = NodeListRow( title: node.uriRaw, isSelected: isSelected, @@ -114,45 +115,52 @@ class NodeListPage extends BasePage { }); }); }); - // FIX-ME: Slidable - // final dismissibleRow = Slidable( - // key: Key('${node.keyIndex}'), - // actionPane: SlidableDrawerActionPane(), - // child: nodeListRow, - // secondaryActions: [ - // IconSlideAction( - // caption: S.of(context).delete, - // color: Colors.red, - // icon: CupertinoIcons.delete, - // onTap: () async { - // final confirmed = await showPopUp( - // context: context, - // builder: (BuildContext context) { - // return AlertWithTwoActions( - // alertTitle: S.of(context).remove_node, - // alertContent: - // S.of(context).remove_node_message, - // rightButtonText: S.of(context).remove, - // leftButtonText: S.of(context).cancel, - // actionRightButton: () => - // Navigator.pop(context, true), - // actionLeftButton: () => - // Navigator.pop(context, false)); - // }) ?? - // false; - // if (confirmed) { - // await nodeListViewModel.delete(node); - // } - // }, - // ), - // ]); + final dismissibleRow = Slidable( + key: Key('${node.keyIndex}'), + startActionPane: _actionPane(context, node), + endActionPane: _actionPane(context, node), + child: nodeListRow, + ); - return nodeListRow; - // return isSelected ? nodeListRow : dismissibleRow; + return isSelected ? nodeListRow : dismissibleRow; }); }, ), ); } + + ActionPane _actionPane(BuildContext context, Node node) => ActionPane( + motion: const ScrollMotion(), + extentRatio: 0.3, + children: [ + SlidableAction( + onPressed: (context) async { + final confirmed = await showPopUp( + context: context, + builder: (BuildContext context) { + return AlertWithTwoActions( + alertTitle: S.of(context).remove_node, + alertContent: + S.of(context).remove_node_message, + rightButtonText: S.of(context).remove, + leftButtonText: S.of(context).cancel, + actionRightButton: () => + Navigator.pop(context, true), + actionLeftButton: () => + Navigator.pop(context, false)); + }) ?? + false; + + if (confirmed) { + await nodeListViewModel.delete(node); + } + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + icon: CupertinoIcons.delete, + label: S.of(context).delete, + ), + ], + ); } diff --git a/lib/src/screens/receive/widgets/address_cell.dart b/lib/src/screens/receive/widgets/address_cell.dart index c5e12a496..137db108b 100644 --- a/lib/src/screens/receive/widgets/address_cell.dart +++ b/lib/src/screens/receive/widgets/address_cell.dart @@ -57,6 +57,7 @@ class AddressCell extends StatelessWidget { final Widget cell = InkWell( onTap: () => onTap?.call(address), child: Container( + width: double.infinity, color: backgroundColor, padding: EdgeInsets.only(left: 24, right: 24, top: 28, bottom: 28), child: Text( @@ -69,20 +70,25 @@ class AddressCell extends StatelessWidget { ), ), )); - // FIX-ME: Slidable - return cell; - // return Container( - // color: backgroundColor, - // child: Slidable( - // key: Key(address), - // actionPane: SlidableDrawerActionPane(), - // child: cell, - // secondaryActions: [ - // IconSlideAction( - // caption: S.of(context).edit, - // color: Colors.blue, - // icon: Icons.edit, - // onTap: () => onEdit?.call()) - // ])); + return Slidable( + key: Key(address), + startActionPane: _actionPane(context), + endActionPane: _actionPane(context), + child: cell, + ); } + + ActionPane _actionPane(BuildContext context) => ActionPane( + motion: const ScrollMotion(), + extentRatio: 0.3, + children: [ + SlidableAction( + onPressed: (_) => onEdit?.call(), + backgroundColor: Colors.blue, + foregroundColor: Colors.white, + icon: Icons.edit, + label: S.of(context).edit, + ), + ], + ); }