veilidchat/lib/contacts/views/contact_item_widget.dart

96 lines
2.9 KiB
Dart
Raw Normal View History

2024-07-31 12:04:43 -05:00
import 'package:async_tools/async_tools.dart';
2023-08-04 01:00:38 -04:00
import 'package:flutter/material.dart';
2023-08-05 23:58:13 -04:00
import 'package:flutter_translate/flutter_translate.dart';
2024-01-09 20:58:27 -05:00
import '../../proto/proto.dart' as proto;
import '../../theme/theme.dart';
2024-07-31 12:04:43 -05:00
const _kOnTap = 'onTap';
const _kOnDelete = 'onDelete';
2023-08-04 01:00:38 -04:00
2024-01-09 20:58:27 -05:00
class ContactItemWidget extends StatelessWidget {
2024-02-27 12:45:58 -05:00
const ContactItemWidget(
2024-07-31 12:04:43 -05:00
{required proto.Contact contact,
required bool disabled,
required bool selected,
Future<void> Function(proto.Contact)? onTap,
Future<void> Function(proto.Contact)? onDoubleTap,
Future<void> Function(proto.Contact)? onDelete,
super.key})
2024-06-15 23:29:15 -04:00
: _disabled = disabled,
2024-07-31 12:04:43 -05:00
_selected = selected,
_contact = contact,
_onTap = onTap,
_onDoubleTap = onDoubleTap,
_onDelete = onDelete;
2023-08-04 01:00:38 -04:00
@override
// ignore: prefer_expression_function_bodies
2024-01-09 20:58:27 -05:00
Widget build(
BuildContext context,
) {
final theme = Theme.of(context);
final scale = theme.extension<ScaleScheme>()!;
final scaleConfig = theme.extension<ScaleConfig>()!;
2024-07-31 12:04:43 -05:00
final name = _contact.nameOrNickname;
final title = _contact.displayName;
final subtitle = _contact.profile.status;
final avatar = AvatarWidget(
name: name,
size: 34,
borderColor: _disabled
? scale.grayScale.primaryText
: scale.primaryScale.primaryText,
foregroundColor: _disabled
? scale.grayScale.primaryText
: scale.primaryScale.primaryText,
backgroundColor:
_disabled ? scale.grayScale.primary : scale.primaryScale.primary,
scaleConfig: scaleConfig,
textStyle: theme.textTheme.titleLarge!,
);
2024-01-30 17:03:14 -05:00
return SliderTile(
2024-06-15 23:29:15 -04:00
key: ObjectKey(_contact),
2024-07-31 12:04:43 -05:00
disabled: _disabled,
selected: _selected,
tileScale: ScaleKind.primary,
2024-06-15 23:29:15 -04:00
title: title,
subtitle: subtitle,
leading: avatar,
2024-07-31 12:04:43 -05:00
onDoubleTap: _onDoubleTap == null
? null
: () => singleFuture<void>((this, _kOnTap), () async {
await _onDoubleTap(_contact);
}),
onTap: _onTap == null
? null
: () => singleFuture<void>((this, _kOnTap), () async {
await _onTap(_contact);
}),
endActions: [
2024-07-31 12:04:43 -05:00
if (_onDelete != null)
SliderTileAction(
icon: Icons.delete,
label: translate('button.delete'),
actionScale: ScaleKind.tertiary,
2024-07-31 12:04:43 -05:00
onPressed: (_context) =>
singleFuture<void>((this, _kOnDelete), () async {
await _onDelete(_contact);
}),
),
],
);
2023-08-04 01:00:38 -04:00
}
2024-06-15 23:29:15 -04:00
////////////////////////////////////////////////////////////////////////////
final proto.Contact _contact;
final bool _disabled;
2024-07-31 12:04:43 -05:00
final bool _selected;
final Future<void> Function(proto.Contact contact)? _onTap;
final Future<void> Function(proto.Contact contact)? _onDoubleTap;
final Future<void> Function(proto.Contact contact)? _onDelete;
2023-08-04 01:00:38 -04:00
}