isolating only api calls

This commit is contained in:
Juan Marulanda De Los Rios 2024-10-20 03:17:24 -04:00
parent 0d07aee02a
commit 1792f98824

View File

@ -9,46 +9,22 @@ import 'dart:ui_web' as ui;
import 'augment.dart'; import 'augment.dart';
import 'dart:html' as html; import 'dart:html' as html;
//data structure
class MailAddress {
final String? name;
final String address;
MailAddress({this.name, required this.address});
factory MailAddress.fromJson(Map<String, dynamic> json) { class ApiService {
return MailAddress( // List emails = [];
name: json['name'],
address: json['address'],
);
}
@override
String toString() {
// TODO: implement toString
return '${name} <${address}>';
}
}
class EmailPage extends StatefulWidget {
// email widget
const EmailPage({super.key});
final String title = 'Emails';
@override
State<EmailPage> createState() => EmailPageState();
}
class EmailPageState extends State<EmailPage> {
List emails = [];
void _displayEmailsFromFolder(String folder) async {
List<GetThreadResponse> allEmails = []; //all the emails
Future<List<GetThreadResponse>> fetchEmailsFromFolder(
String folder, int pagenitaion) async {
try { try {
var url = Uri.http('127.0.0.1:3001', 'sorted_threads_by_date', var url = Uri.http('127.0.0.1:3001', 'sorted_threads_by_date', {
{'folder': folder, 'limit': '10', 'offset': '0'}); 'folder': folder,
'limit': '20',
'offset': pagenitaion,
});
var response = await http.get(url); var response = await http.get(url);
print(response); print(response);
List<GetThreadResponse> allEmails = [];
if (response.statusCode == 200) { if (response.statusCode == 200) {
List json = jsonDecode(response.body); List json = jsonDecode(response.body);
for (var item in json.take(1)) { for (var item in json.take(1)) {
@ -60,21 +36,25 @@ class EmailPageState extends State<EmailPage> {
} }
} }
} }
return allEmails;
} else { } else {
throw Exception('Failed to load threads'); throw Exception('Failed to load threads');
} }
} catch (e) { } catch (e) {
print('_displayEmailsFromFolder caught error: $e'); print('_displayEmailsFromFolder caught error: $e');
return [];
} }
print("Done"); print("Done");
setState(() { // setState(() {
emails = allEmails; // emails = allEmails;
}); // });
} }
Future<void> fetchThreads( Future<void> fetchThreads(
int threadId, List<GetThreadResponse> allEmails) async { //populates allEmails, which is the List that contains all the emails in a thread
int threadId,
List<GetThreadResponse> allEmails) async {
try { try {
var url = var url =
Uri.http('127.0.0.1:3001', 'get_thread', {'id': threadId.toString()}); Uri.http('127.0.0.1:3001', 'get_thread', {'id': threadId.toString()});
@ -95,7 +75,7 @@ class EmailPageState extends State<EmailPage> {
} }
} }
Future<String> _getEmailContent(List<String> IDs) async { Future<String> fetchEmailContent(List<String> IDs) async {
String content = r""" String content = r"""
"""; """;
@ -108,7 +88,7 @@ class EmailPageState extends State<EmailPage> {
if (response.statusCode == 200) { if (response.statusCode == 200) {
content += response.body; content += response.body;
content += "<p>end of mail</p><br><br><br>"; content += "<p>end of mail</p><br><br><br><hr>";
} }
} }
} catch (e) { } catch (e) {
@ -122,144 +102,15 @@ class EmailPageState extends State<EmailPage> {
// showDialog(context: context, builder: builder) // showDialog(context: context, builder: builder)
// } // }
Future<List<Widget>> getDrawerItems(BuildContext context) async { Future<List<String>> fetchFolders() async {
List<String> drawerItems = [];
try { try {
var url = Uri.http('127.0.0.1:3001', 'folders'); var url = Uri.http('127.0.0.1:3001', 'folders');
var response = await http.get(url); var response = await http.get(url);
drawerItems = List<String>.from(json.decode(response.body)); return List<String>.from(json.decode(response.body));
} catch (e) { } catch (e) {
print('getDrawerItems caught error: $e'); print('fetchFolders caught error: $e');
return [];
} }
List<Widget> drawerWidgets = []; // email folders
for (String item in drawerItems) {
drawerWidgets.add(
ListTile(
leading: Icon(Icons.mail),
title: Text(item),
onTap: () {
_displayEmailsFromFolder(item);
Navigator.pop(context);
},
),
);
}
drawerWidgets.add(ListTile(
leading: Icon(Icons.add),
onTap: () {
// _addMailBox(context);
print('adding folder');
Navigator.pop(context);
},
));
return drawerWidgets;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
drawer: Drawer(
child: FutureBuilder<List<Widget>>(
future: getDrawerItems(
context), // call the async function to get the future
builder:
(BuildContext context, AsyncSnapshot<List<Widget>> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
// While data is loading, show a progress indicator
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
// If something went wrong, show an error message
return Center(child: Text('Error: ${snapshot.error}'));
} else {
// When data is fetched successfully, display the items
return ListView(
padding: EdgeInsets.zero,
children:
snapshot.data!, // Unwrap the data once confirmed it's there
);
}
},
),
),
body: EmailListScreen(
emails: emails,
getEmailContent: _getEmailContent,
// getJsonEmail: _getThreadMessagesJson
),
);
}
}
class EmailListScreen extends StatelessWidget {
//this is the bulding of the drawer with all emails
// try to only get the subject and id, date, sender to make it faster
final List emails;
final Future<String> Function(List<String>) getEmailContent;
EmailListScreen({
required this.emails,
required this.getEmailContent,
});
// instead of getting the entire email, just the from, text, subject, and id
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Emails'),
),
body: ListView.separated(
itemCount: emails.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(emails[index].from_name,
style: TextStyle(fontWeight: FontWeight.bold)),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(emails[index].subject),
],
),
trailing: Text(emails[index].date.toString()),
//here we assign each part of json to a var, this could be changed so it only happens,
// when clicking on email for modularity
onTap: () async {
String emailContent =
await getEmailContent(emails[index].messages);
String fromName = emails[index].from_name.toString();
String fromAddress = emails[index].from_address.toString();
String to = emails[index].to.toString();
String subject = emails[index].subject.toString();
String date = emails[index].date.toString();
String id = emails[index].id.toString();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => EmailView(
emailContent: emailContent,
from: fromAddress,
name: fromName,
to: to,
subject: subject,
date: date,
id: id,
)),
);
});
},
separatorBuilder: (context, index) {
return Divider();
},
),
);
} }
} }