import 'package:flutter/material.dart'; import 'api_service.dart'; import 'structs.dart'; import 'emailView.dart'; class EmailListScreen extends StatefulWidget { final List emails; final Future> Function(List, String) getEmailContent; final String folder; final GlobalKey<_EmailListScreenState> key; EmailListScreen( {required this.key, required this.emails, required this.getEmailContent, required this.folder}) : super(key: key); @override _EmailListScreenState createState() => _EmailListScreenState(); } class _EmailListScreenState extends State { late List selectStates; // for checkboxes if its selected or not late List selectedEmails = []; // holds the emails that are selected i.e. the emails that got the checkbox on final Set _hoveredRows = {}; //the row that is being hovered over atm bool bulkSelectMenu = false; @override void initState() { super.initState(); selectStates = List.filled(widget.emails.length, false); } @override void didUpdateWidget(covariant EmailListScreen oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.emails.length != widget.emails.length) { selectStates = List.filled(widget.emails.length, false); } } bool selectAllChecks(bool selectionType) { setState(() { if (selectionType) { bulkSelectMenu = true; } for (int email = 0; email < selectStates.length; email++) { selectStates[email] = selectionType; } }); printTheSelected(); return false; } void printTheSelected() { for (int i = 0; i < selectedEmails.length; i++) { print(selectedEmails); } } @override Widget build(BuildContext context) { return Scaffold( body: ListView.separated( itemCount: widget.emails.length, itemBuilder: (context, index) { Color seenColour; final email = widget.emails[index]; if (email.seen) { seenColour = ThemeData().highlightColor; } else { seenColour = Colors.transparent; } return MouseRegion( onEnter: (_) => setState(() => _hoveredRows.add(index)), onExit: (_) => setState(() => _hoveredRows.remove(index)), child: ListTile( leading: Checkbox( value: selectStates[index], onChanged: (bool? value) { setState(() { //works great selectStates[index] = value ?? false; if (value!) { selectedEmails.add(widget.emails[index]); } else { selectedEmails.remove(widget.emails[index]); } }); }, ), title: Text(email.from_name, style: TextStyle(fontWeight: FontWeight.bold)), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [Text(email.subject)], ), // tileColor: () , trailing: _hoveredRows.contains(index) ? Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: Icon(Icons.mark_email_read_outlined), onPressed: () { //mark email as read }, ), IconButton( icon: Icon(Icons.delete_outline), onPressed: () { //delete email }, ), ], ) : Text(email.date.toString()), hoverColor: Colors.transparent, tileColor: seenColour, onTap: () async { List emailContent = // list of the html await widget.getEmailContent(email.messages, widget.folder); // print("thread id? $email.id"); yes print(email.messages); //email ids of the thread if (widget.folder == "Drafts") { print("IN DRAFTS MOVE THE CONTENT TO THE WRITING THING"); } else { Navigator.push( context, MaterialPageRoute( // could call collapsable and inside collable each calls email view? builder: (context) => EmailView( emailContent: emailContent, from: email.from_address, name: email.from_name, to: email.to.toString(), subject: email.subject, date: email.date.toString(), id: email.id.toString(), //i think this is thread id? messages: email.messages, ), ), ); ApiService().markAsSeen(email.id); } }, ), ); }, separatorBuilder: (context, index) => Divider(), ), ); } } // ignore: must_be_immutable class EmailPage extends StatefulWidget { EmailPage({Key? key}) : super(key: key); String selectedFolder = "INBOX"; //starter int offset = 0; int page = 1; @override EmailPageState createState() => EmailPageState(); } class EmailPageState extends State { final ApiService apiService = ApiService(); List emails = []; ValueNotifier currentPageNotifier = ValueNotifier(1); int page = 1; bool isBackDisabled = false; final GlobalKey<_EmailListScreenState> emailListKey = GlobalKey<_EmailListScreenState>(); @override void initState() { super.initState(); widget.page = page; isBackDisabled = true; _fetchEmails(); } List get getEmails => emails; String getPage() => widget.page.toString(); bool get backDisabled => isBackDisabled; void updateSelectedFolder(String folder) { setState(() { widget.selectedFolder = folder; }); print(folder); _fetchEmails(); } void updatePagenation(String option) { if (option == "next") { setState(() { widget.offset += 50; widget.page += 1; currentPageNotifier.value = widget.page; isBackDisabled = false; }); } else if (option == "back") { setState(() { widget.offset -= 50; widget.page -= 1; currentPageNotifier.value = widget.page; if (widget.page == 1) { isBackDisabled = true; print("back disabled"); } }); } print(widget.page); _fetchEmails(); } void _fetchEmails() async { try { List fetchedEmails = await apiService .fetchEmailsFromFolder(widget.selectedFolder, widget.offset); if (!mounted) return; setState(() { emails = fetchedEmails; // Update the list of emails }); } catch (e) { print('Error fetching emails: $e'); } } bool selectAllEmails(bool selectionType) { emailListKey.currentState?.selectAllChecks(selectionType); return false; } @override Widget build(BuildContext context) { return Scaffold( body: EmailListScreen( key: emailListKey, emails: emails, // getEmailContent: apiService.fetchEmailContent, getEmailContent: apiService.fetchMarkdownContent, folder: widget.selectedFolder, //try to grab from it directly )); } }