Files
Client/lib/view/pages/talk/widgets/user_search_tile.dart
T

67 lines
2.0 KiB
Dart

import 'package:flutter/material.dart';
import '../../../../api/marianumconnect/queries/user_search/user_search_response.dart';
import '../../../../widget/user_avatar.dart';
/// List entry for a MarianumConnect user-search hit: avatar, full name, a muted
/// identifier line and a colour-coded role badge. Shared by the dedicated user
/// search ([JoinChat]) and the "start new chat" section of the chat search.
class UserSearchTile extends StatelessWidget {
final McUserSearchResult user;
final VoidCallback onTap;
const UserSearchTile({super.key, required this.user, required this.onTap});
@override
Widget build(BuildContext context) {
return ListTile(
leading: UserAvatar(id: user.username, isGroup: false),
title: Text('${user.firstName} ${user.lastName}'),
subtitle: Text(_subtitle),
trailing: RoleBadge(userType: user.userType),
onTap: onTap,
);
}
String get _subtitle {
final className = user.className;
if (user.userType == 'STUDENT' &&
className != null &&
className.isNotEmpty) {
return '${user.username} · $className';
}
return user.username;
}
}
/// Compact colour-coded badge distinguishing teachers, students and staff.
class RoleBadge extends StatelessWidget {
final String userType;
const RoleBadge({super.key, required this.userType});
@override
Widget build(BuildContext context) {
final (label, color) = switch (userType) {
'TEACHER' => ('Lehrkraft', Colors.blue),
'STUDENT' => ('Schüler:in', Colors.green),
_ => ('Personal', Colors.orange),
};
return Container(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
decoration: BoxDecoration(
color: color.withValues(alpha: 0.15),
borderRadius: BorderRadius.circular(12),
),
child: Text(
label,
style: TextStyle(
color: color,
fontSize: 12,
fontWeight: FontWeight.w600,
),
),
);
}
}