// history_page.dart import 'package:flutter/material.dart'; import 'package:flutter_contacts/flutter_contacts.dart'; import 'package:intl/intl.dart'; // For date formatting import 'package:dialer/features/contacts/contact_state.dart'; class History { final Contact contact; final DateTime date; final String callType; // 'incoming' or 'outgoing' final String callStatus; // 'missed' or 'answered' final int attempts; History( this.contact, this.date, this.callType, this.callStatus, this.attempts, ); } class HistoryPage extends StatefulWidget { const HistoryPage({Key? key}) : super(key: key); @override _HistoryPageState createState() => _HistoryPageState(); } class _HistoryPageState extends State { List histories = []; bool loading = true; @override void didChangeDependencies() { super.didChangeDependencies(); if (loading) { _buildHistories(); } } Future _buildHistories() async { final contactState = ContactState.of(context); if (contactState.loading) { // Wait for contacts to be loaded await Future.doWhile(() async { await Future.delayed(const Duration(milliseconds: 100)); return contactState.loading; }); } List contacts = contactState.contacts; // Ensure there are enough contacts if (contacts.isEmpty) { setState(() { loading = false; }); return; } // Build histories using the contacts setState(() { histories = List.generate( contacts.length >= 10 ? 10 : contacts.length, (index) => History( contacts[index], DateTime.now().subtract(Duration(hours: (index + 1) * 2)), index % 2 == 0 ? 'outgoing' : 'incoming', index % 3 == 0 ? 'missed' : 'answered', index % 3 + 1, ), ); loading = false; }); } @override Widget build(BuildContext context) { final contactState = ContactState.of(context); if (loading || contactState.loading) { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( title: const Text('History'), ), body: const Center( child: CircularProgressIndicator(), ), ); } if (histories.isEmpty) { return Scaffold( backgroundColor: Colors.black, appBar: AppBar( title: const Text('History'), ), body: const Center( child: Text( 'No call history available.', style: TextStyle(color: Colors.white), ), ), ); } return Scaffold( backgroundColor: Colors.black, appBar: AppBar( title: const Text('History'), ), body: ListView.builder( itemCount: histories.length, itemBuilder: (context, index) { final history = histories[index]; final contact = history.contact; return ListTile( leading: (contact.thumbnail != null && contact.thumbnail!.isNotEmpty) ? CircleAvatar( backgroundImage: MemoryImage(contact.thumbnail!), ) : CircleAvatar( child: Text( contact.displayName.isNotEmpty ? contact.displayName[0] : '?', ), ), title: Text( contact.displayName, style: const TextStyle(color: Colors.white), ), subtitle: Text( '${history.callType} - ${history.callStatus} - ${DateFormat('MMM dd, hh:mm a').format(history.date)}', style: const TextStyle(color: Colors.grey), ), trailing: Text( '${history.attempts}x', style: const TextStyle(color: Colors.white), ), onTap: () { // Handle tap event if needed }, ); }, ), ); } }