select emails in bulk and each, select all and unselect

This commit is contained in:
Juan Marulanda De Los Rios 2025-08-09 00:11:29 -04:00
parent 71707bd1c0
commit 5d4854901e

View File

@ -3,53 +3,137 @@ import 'api_service.dart';
import 'structs.dart'; import 'structs.dart';
import 'emailView.dart'; import 'emailView.dart';
class EmailListScreen extends StatelessWidget { class EmailListScreen extends StatefulWidget {
final List<GetThreadResponse> emails; final List<GetThreadResponse> emails;
final Future<List<String>> Function(List<String>, String) getEmailContent; final Future<List<String>> Function(List<String>, String) getEmailContent;
final String folder; final String folder;
final GlobalKey<_EmailListScreenState> key;
EmailListScreen( EmailListScreen({
{required this.emails, required this.key,
required this.emails,
required this.getEmailContent, required this.getEmailContent,
required this.folder}); required this.folder})
//fix the email list : super(key: key);
@override
_EmailListScreenState createState() => _EmailListScreenState();
}
class _EmailListScreenState extends State<EmailListScreen> {
late List<bool> selectStates; // for checkboxes if its selected or not
late List<GetThreadResponse> selectedEmails =
[]; // holds the emails that are selected i.e. the emails that got the checkbox on
final Set<int> _hoveredRows = {}; //the row that is being hovered over atm
@override
void initState() {
super.initState();
selectStates = List<bool>.filled(widget.emails.length, false);
}
@override
void didUpdateWidget(covariant EmailListScreen oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.emails.length != widget.emails.length) {
selectStates = List<bool>.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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
body: ListView.separated( body: ListView.separated(
itemCount: emails.length, itemCount: widget.emails.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {
final email = emails[index]; final email = widget.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<String> emailContent = // list of the html
await getEmailContent(email.messages, folder);
print(email.messages); //email ids of the thread return MouseRegion(
Navigator.push( onEnter: (_) => setState(() => _hoveredRows.add(index)),
context, onExit: (_) => setState(() => _hoveredRows.remove(index)),
MaterialPageRoute( child: ListTile(
// could call collapsable and inside collable each calls email view? leading: Checkbox(
builder: (context) => EmailView( value: selectStates[index],
emailContent: emailContent, onChanged: (bool? value) {
from: email.from_address, setState(() {
name: email.from_name, //works great
to: email.to.toString(), selectStates[index] = value ?? false;
subject: email.subject, if (value!) {
date: email.date.toString(), selectedEmails.add(widget.emails[index]);
id: email.id.toString(), //i think this is thread id? } else {
messages: email.messages, 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<String> 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(), separatorBuilder: (context, index) => Divider(),
@ -76,6 +160,9 @@ class EmailPageState extends State<EmailPage> {
int page = 1; int page = 1;
bool isBackDisabled = false; bool isBackDisabled = false;
final GlobalKey<_EmailListScreenState> emailListKey = GlobalKey<_EmailListScreenState>();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -84,6 +171,7 @@ class EmailPageState extends State<EmailPage> {
_fetchEmails(); _fetchEmails();
} }
List<GetThreadResponse> get getEmails => emails;
String getPage() => widget.page.toString(); String getPage() => widget.page.toString();
bool get backDisabled => isBackDisabled; bool get backDisabled => isBackDisabled;
@ -114,7 +202,6 @@ class EmailPageState extends State<EmailPage> {
} }
}); });
} }
// print(currentPage);
print(widget.page); print(widget.page);
_fetchEmails(); _fetchEmails();
} }
@ -133,15 +220,19 @@ class EmailPageState extends State<EmailPage> {
} }
} }
bool selectAllEmails(bool selectionType) {
emailListKey.currentState?.selectAllChecks(selectionType);
return false;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(body: EmailListScreen(
body: EmailListScreen( key: emailListKey,
emails: emails, emails: emails,
// getEmailContent: apiService.fetchEmailContent, // getEmailContent: apiService.fetchEmailContent,
getEmailContent: apiService.fetchMarkdownContent, getEmailContent: apiService.fetchMarkdownContent,
folder: widget.selectedFolder, //try to grab from it directly folder: widget.selectedFolder, //try to grab from it directly
), ));
);
} }
} }