// Flutter imports: import 'package:flutter/material.dart'; // Package imports: import 'package:flutter_redux/flutter_redux.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; import 'package:invoiceninja_flutter/ui/app/entity_state_label.dart'; class TokenListItem extends StatelessWidget { const TokenListItem({ required this.user, required this.token, required this.filter, this.onTap, this.onLongPress, this.onCheckboxChanged, this.isChecked = false, }); final UserEntity? user; final GestureTapCallback? onTap; final GestureTapCallback? onLongPress; final TokenEntity token; final String? filter; final Function(bool?)? onCheckboxChanged; final bool isChecked; @override Widget build(BuildContext context) { final store = StoreProvider.of(context); final state = store.state; final uiState = state.uiState; final tokenUIState = uiState.tokenUIState; final listUIState = tokenUIState.listUIState; final isInMultiselect = listUIState.isInMultiselect(); final showCheckbox = onCheckboxChanged != null || isInMultiselect; final user = state.userState.get(token.createdUserId!); final filterMatch = filter != null && filter!.isNotEmpty ? token.matchesFilterValue(filter) : null; final subtitle = filterMatch; return DismissibleEntity( userCompany: state.userCompany, entity: token, isSelected: token.id == (uiState.isEditing ? tokenUIState.editing!.id : tokenUIState.selectedId), child: ListTile( onTap: () => onTap != null ? onTap!() : selectEntity(entity: token), onLongPress: () => onLongPress != null ? onLongPress!() : selectEntity(entity: token, longPress: true), leading: showCheckbox ? IgnorePointer( ignoring: listUIState.isInMultiselect(), child: Checkbox( value: isChecked, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, onChanged: (value) => onCheckboxChanged!(value), activeColor: Theme.of(context).colorScheme.secondary, ), ) : null, title: Text( token.name, style: Theme.of(context).textTheme.titleMedium, ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(user.listDisplayName), subtitle != null && subtitle.isNotEmpty ? Text( subtitle, maxLines: 3, overflow: TextOverflow.ellipsis, ) : Container(), EntityStateLabel(token), ], ), ), ); } }