You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
uco-mobile-poc/lib/app/modules/contacts_screen/views/contacts_screen_view.dart

107 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../../../core/constants/translation_keys.dart';
import '../../../custom_widgets/custom_app_bar.dart';
import '../../../custom_widgets/custom_no_record.dart';
import '../../../res/app_colors.dart';
import '../../../res/app_dimensions.dart';
import '../controllers/contacts_screen_controller.dart';
class ContactsScreenView extends GetView<ContactsScreenController> {
const ContactsScreenView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
String className = runtimeType.toString().split('.').last;
return Scaffold(
appBar: DashBoardAppBar(
title: TranslationKeys.makeTranslation("Contacts"),
onBackButtonPressed: () {
Get.back();
},
),
body: Padding(
padding: EdgeInsets.symmetric(vertical: AppDimensions.screenVerticalPadding, horizontal: AppDimensions.screenHorizontalPadding),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
TextField(
style: Theme.of(context).textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.w400, fontSize: 12),
decoration: const InputDecoration(
suffixIconColor: AppColors.colorPrimary,
filled: true,
fillColor: AppColors.colorGrey200,
enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(width: 1, color: Colors.transparent)),
border: OutlineInputBorder(borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(width: 1, color: AppColors.colorGrey500)),
focusedBorder: OutlineInputBorder(borderRadius: BorderRadius.all(Radius.circular(10.0)), borderSide: BorderSide(width: 1, style: BorderStyle.solid, color: Colors.transparent)),
hintText: 'Search contact number',
hintStyle: TextStyle(fontSize: 14, fontWeight: FontWeight.w400, color: AppColors.colorGrey500),
suffixIcon: Icon(Icons.search_rounded, size: 22),
),
onChanged: (value) {
controller.filterContacts(value);
}),
const SizedBox(height: 20),
Text(TranslationKeys.makeTranslation("Contacts"), style: Theme.of(context).textTheme.bodyMedium),
const SizedBox(height: 10),
Obx(() {
return controller.filteredContacts.isEmpty
? const Center(
child: CustomNoRecord(title: "No Record Found", description: "We couldn't find any activity at this moment"),
)
: Expanded(
flex: 2,
child: ListView.builder(
itemCount: controller.filteredContacts.length,
itemBuilder: (context, index) {
final contact = controller.filteredContacts[index];
final phoneNumber = contact.phones.isNotEmpty ? contact.phones[0].number : 'No phone number';
return ListTile(
onTap: () {
controller.handleContactSelection(contact);
},
title: Text(contact.displayName),
subtitle: Text(
phoneNumber,
style: Theme.of(context).textTheme.bodySmall,
),
leading: CircleAvatar(
backgroundColor: AppColors.colorPrimary,
backgroundImage: contact.photo != null ? MemoryImage(contact.photo!) : null,
child: Text(
getInitials(contact.displayName),
style: Theme.of(context).textTheme.titleSmall?.copyWith(color: Colors.white),
),
),
);
},
),
);
}),
],
),
),
);
}
String getInitials(String fullName) {
if (fullName.isEmpty) {
return "";
}
// Split the full name into words
List<String> nameParts = fullName.trim().split(' ');
// Check if there's at least a first and last name
if (nameParts.length < 2) {
return fullName.substring(0, 1).toUpperCase(); // Get first character
}
// Get first characters of first and last name
String firstInitial = nameParts[0].substring(0, 1).toUpperCase();
String lastInitial = nameParts[nameParts.length - 1].substring(0, 1).toUpperCase();
return firstInitial + lastInitial;
}
}