diff --git a/lib/redux/company/company_selectors.dart b/lib/redux/company/company_selectors.dart index 859fa6ddc..e84529268 100644 --- a/lib/redux/company/company_selectors.dart +++ b/lib/redux/company/company_selectors.dart @@ -1,6 +1,11 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/company/company_state.dart'; +import 'package:memoize/memoize.dart'; + +var memoizedFilteredSelector = memo2((String filter, + CompanyState state) => + filteredSelector(filter, state)); List filteredSelector(String filter, CompanyState state) { final List list = [] diff --git a/lib/ui/app/lists/activity_list_tile.dart b/lib/ui/app/lists/activity_list_tile.dart index bacc1209a..6455f6d1c 100644 --- a/lib/ui/app/lists/activity_list_tile.dart +++ b/lib/ui/app/lists/activity_list_tile.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class ActivityListTile extends StatelessWidget { @@ -16,29 +17,6 @@ class ActivityListTile extends StatelessWidget { final ActivityEntity activity; - IconData getIconData(EntityType entityType) { - switch (entityType) { - case EntityType.client: - return FontAwesomeIcons.users; - case EntityType.invoice: - return FontAwesomeIcons.filePdfO; - case EntityType.payment: - return FontAwesomeIcons.creditCard; - case EntityType.credit: - return FontAwesomeIcons.creditCard; - case EntityType.quote: - return FontAwesomeIcons.fileAltO; - case EntityType.vendor: - return FontAwesomeIcons.building; - case EntityType.expense: - return FontAwesomeIcons.fileImageO; - case EntityType.task: - return FontAwesomeIcons.clockO; - default: - return null; - } - } - @override Widget build(BuildContext context) { final localization = AppLocalization.of(context); diff --git a/lib/ui/dashboard/dashboard_view.dart b/lib/ui/dashboard/dashboard_view.dart index da9baae3f..93da07755 100644 --- a/lib/ui/dashboard/dashboard_view.dart +++ b/lib/ui/dashboard/dashboard_view.dart @@ -4,12 +4,16 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; +import 'package:invoiceninja_flutter/redux/client/client_actions.dart'; +import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart'; +import 'package:invoiceninja_flutter/redux/product/product_actions.dart'; import 'package:invoiceninja_flutter/ui/app/app_drawer_vm.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter.dart'; import 'package:invoiceninja_flutter/ui/app/list_filter_button.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_activity.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_panels.dart'; import 'package:invoiceninja_flutter/ui/dashboard/dashboard_vm.dart'; +import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class DashboardView extends StatefulWidget { @@ -81,7 +85,6 @@ class _DashboardViewState extends State } } - class CustomTabBarView extends StatelessWidget { const CustomTabBarView({ @required this.viewModel, @@ -99,26 +102,29 @@ class CustomTabBarView extends StatelessWidget { itemBuilder: (BuildContext context, index) { final entity = viewModel.filteredList[index]; final subtitle = entity.matchesFilterValue(viewModel.filter); - IconData icon; - switch (entity.entityType) { - case EntityType.client: - icon = FontAwesomeIcons.users; - break; - case EntityType.product: - icon = FontAwesomeIcons.cube; - break; - case EntityType.invoice: - icon = FontAwesomeIcons.filePdfO; - break; - } return ListTile( title: Text(entity.listDisplayName), - leading: Icon(icon), + leading: Icon(getIconData(entity.entityType)), trailing: Icon(Icons.navigate_next), subtitle: subtitle != null ? Text(subtitle) : Container(), + onTap: () { + dynamic action; + switch (entity.entityType) { + case EntityType.product: + action = EditProduct(product: entity, context: context); + break; + case EntityType.client: + action = ViewClient(clientId: entity.id, context: context); + break; + case EntityType.invoice: + action = + ViewInvoice(invoiceId: entity.id, context: context); + break; + } + StoreProvider.of(context).dispatch(action); + }, ); - } - ); + }); } return TabBarView( diff --git a/lib/ui/dashboard/dashboard_vm.dart b/lib/ui/dashboard/dashboard_vm.dart index 3687ce182..fe3205c23 100644 --- a/lib/ui/dashboard/dashboard_vm.dart +++ b/lib/ui/dashboard/dashboard_vm.dart @@ -65,7 +65,7 @@ class DashboardVM { isLoading: state.isLoading, onRefreshed: (context) => _handleRefresh(context), filter: filter, - filteredList: filteredSelector(filter, state.selectedCompanyState), + filteredList: memoizedFilteredSelector(filter, state.selectedCompanyState), ); } } diff --git a/lib/utils/icons.dart b/lib/utils/icons.dart new file mode 100644 index 000000000..11cfa4ae2 --- /dev/null +++ b/lib/utils/icons.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:invoiceninja_flutter/data/models/models.dart'; + +IconData getIconData(EntityType entityType) { + switch (entityType) { + case EntityType.client: + return FontAwesomeIcons.users; + case EntityType.invoice: + return FontAwesomeIcons.filePdfO; + case EntityType.payment: + return FontAwesomeIcons.creditCard; + case EntityType.credit: + return FontAwesomeIcons.creditCard; + case EntityType.quote: + return FontAwesomeIcons.fileAltO; + case EntityType.vendor: + return FontAwesomeIcons.building; + case EntityType.expense: + return FontAwesomeIcons.fileImageO; + case EntityType.task: + return FontAwesomeIcons.clockO; + default: + return null; + } +}