twonly-app/lib/src/visual/elements/contact_chip.element.dart
otsmr df9b0d66bd
Some checks failed
Flutter analyze & test / flutter_analyze_and_test (push) Has been cancelled
fix comments and show shared contacts avatar
2026-07-16 10:31:58 +02:00

84 lines
2.4 KiB
Dart

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:twonly/src/database/daos/contacts.dao.dart';
import 'package:twonly/src/database/twonly.db.dart';
import 'package:twonly/src/utils/avatars.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/visual/components/avatar_icon.comp.dart';
import 'package:twonly/src/visual/components/verification_badge.comp.dart';
import 'package:twonly/src/visual/elements/reactive_tap_feedback.element.dart';
import 'package:twonly/src/visual/views/contact/contact.view.dart';
class ContactChip extends StatelessWidget {
const ContactChip({
this.contact,
this.username,
this.avatarSvg,
this.onTap,
super.key,
}) : assert(
contact != null || username != null,
'Either contact or username must be provided',
);
final Contact? contact;
final String? username;
final List<int>? avatarSvg;
final void Function(int)? onTap;
@override
Widget build(BuildContext context) {
return ReactiveTapFeedback(
onTap: () {
if (contact == null) return;
if (onTap != null) {
onTap!(contact!.userId);
} else {
context.navPush(
ContactView(
contact!.userId,
key: ValueKey(contact!.userId),
),
);
}
},
child: Chip(
avatar: AvatarIcon(
contactId: contact?.userId,
fontSize: 10,
svg: avatarSvg != null
? getAvatarSvg(Uint8List.fromList(avatarSvg!))
: null,
),
label: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text(
contact != null ? getContactDisplayName(contact!) : username!,
style: const TextStyle(fontSize: 14),
overflow: TextOverflow.ellipsis,
),
if (contact != null) ...[
const SizedBox(width: 6),
VerificationBadgeComp(
contact: contact,
size: 12,
clickable: false,
),
],
if (onTap != null && contact != null) ...[
const SizedBox(width: 15),
const FaIcon(
FontAwesomeIcons.xmark,
color: Colors.grey,
size: 12,
),
],
],
),
),
);
}
}