import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/entity_state_label.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class PaymentListItem extends StatelessWidget { const PaymentListItem({ @required this.user, @required this.onEntityAction, @required this.onTap, @required this.onLongPress, @required this.payment, @required this.filter, this.onCheckboxChanged, this.isChecked = false, }); final UserEntity user; final Function(EntityAction) onEntityAction; final GestureTapCallback onTap; final GestureTapCallback onLongPress; final PaymentEntity payment; final String filter; final Function(bool) onCheckboxChanged; final bool isChecked; static final paymentItemKey = (int id) => Key('__payment_${id}__'); @override Widget build(BuildContext context) { final state = StoreProvider.of(context).state; final uiState = state.uiState; final paymentUIState = uiState.paymentUIState; final listUIState = paymentUIState.listUIState; final isInMultiselect = listUIState.isInMultiselect(); final showCheckbox = onCheckboxChanged != null || isInMultiselect; final client = state.clientState.map[payment.clientId]; final localization = AppLocalization.of(context); final filterMatch = filter != null && filter.isNotEmpty ? payment.matchesFilterValue(filter) : null; final subtitle = filterMatch ?? (payment.number ?? '') + ' • ' + formatDate(payment.date, context); return DismissibleEntity( isSelected: payment.id == (uiState.isEditing ? paymentUIState.editing.id : paymentUIState.selectedId), userCompany: state.userCompany, entity: payment, onEntityAction: onEntityAction, child: ListTile( onTap: isInMultiselect ? () => onEntityAction(EntityAction.toggleMultiselect) : onTap, onLongPress: onLongPress, leading: showCheckbox ? IgnorePointer( ignoring: listUIState.isInMultiselect(), child: Checkbox( value: isChecked, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onChanged: (value) => onCheckboxChanged(value), activeColor: Theme.of(context).accentColor, ), ) : null, title: Container( width: MediaQuery.of(context).size.width, child: Row( children: [ Expanded( child: Text( client.displayName, style: Theme.of(context).textTheme.title, ), ), Text(formatNumber(payment.amount, context), style: Theme.of(context).textTheme.title), ], ), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: subtitle != null && subtitle.isNotEmpty ? Text( subtitle, maxLines: 3, overflow: TextOverflow.ellipsis, ) : Container(), ), Text(localization.lookup('payment_status_${payment.statusId}'), style: TextStyle( color: PaymentStatusColors.colors[payment.statusId], )), ], ), EntityStateLabel(payment), ], ), ), ); } }