diff --git a/lib/email.dart b/lib/email.dart index f922d61..2c2a260 100644 --- a/lib/email.dart +++ b/lib/email.dart @@ -3,53 +3,137 @@ import 'api_service.dart'; import 'structs.dart'; import 'emailView.dart'; -class EmailListScreen extends StatelessWidget { +class EmailListScreen extends StatefulWidget { final List emails; final Future> Function(List, String) getEmailContent; final String folder; + final GlobalKey<_EmailListScreenState> key; - EmailListScreen( - {required this.emails, + EmailListScreen({ + required this.key, + required this.emails, required this.getEmailContent, - required this.folder}); -//fix the email list + 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 + + @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(() { + 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: emails.length, + itemCount: widget.emails.length, itemBuilder: (context, index) { - final email = emails[index]; - return ListTile( - title: Text(email.from_name, - style: TextStyle(fontWeight: FontWeight.bold)), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [Text(email.subject)], - ), - trailing: Text(email.date.toString()), - onTap: () async { - List emailContent = // list of the html - await getEmailContent(email.messages, folder); + final email = widget.emails[index]; - print(email.messages); //email ids of the thread - 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, - ), - ), - ); - }, + 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)], + ), + 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()), + onTap: () async { + List emailContent = // list of the html + await widget.getEmailContent(email.messages, widget.folder); + + 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, + ), + ), + ); + } + }, + ), ); }, separatorBuilder: (context, index) => Divider(), @@ -75,6 +159,9 @@ class EmailPageState extends State { ValueNotifier currentPageNotifier = ValueNotifier(1); int page = 1; bool isBackDisabled = false; + + final GlobalKey<_EmailListScreenState> emailListKey = GlobalKey<_EmailListScreenState>(); + @override void initState() { @@ -84,6 +171,7 @@ class EmailPageState extends State { _fetchEmails(); } + List get getEmails => emails; String getPage() => widget.page.toString(); bool get backDisabled => isBackDisabled; @@ -114,7 +202,6 @@ class EmailPageState extends State { } }); } - // print(currentPage); print(widget.page); _fetchEmails(); } @@ -133,15 +220,19 @@ class EmailPageState extends State { } } + bool selectAllEmails(bool selectionType) { + emailListKey.currentState?.selectAllChecks(selectionType); + return false; + } + @override Widget build(BuildContext context) { - return Scaffold( - body: EmailListScreen( - emails: emails, - // getEmailContent: apiService.fetchEmailContent, - getEmailContent: apiService.fetchMarkdownContent, - folder: widget.selectedFolder, //try to grab from it directly - ), - ); + return Scaffold(body: EmailListScreen( + key: emailListKey, + emails: emails, + // getEmailContent: apiService.fetchEmailContent, + getEmailContent: apiService.fetchMarkdownContent, + folder: widget.selectedFolder, //try to grab from it directly + )); } }