diff --git a/lib/api_service.dart b/lib/api_service.dart index 6f700ab..1adab2a 100644 --- a/lib/api_service.dart +++ b/lib/api_service.dart @@ -9,46 +9,22 @@ import 'dart:ui_web' as ui; import 'augment.dart'; 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 json) { - return MailAddress( - 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 createState() => EmailPageState(); -} - -class EmailPageState extends State { - List emails = []; - - void _displayEmailsFromFolder(String folder) async { - List allEmails = []; //all the emails +class ApiService { + // List emails = []; + Future> fetchEmailsFromFolder( + String folder, int pagenitaion) async { try { - var url = Uri.http('127.0.0.1:3001', 'sorted_threads_by_date', - {'folder': folder, 'limit': '10', 'offset': '0'}); + var url = Uri.http('127.0.0.1:3001', 'sorted_threads_by_date', { + 'folder': folder, + 'limit': '20', + 'offset': pagenitaion, + }); var response = await http.get(url); print(response); + List allEmails = []; + if (response.statusCode == 200) { List json = jsonDecode(response.body); for (var item in json.take(1)) { @@ -60,21 +36,25 @@ class EmailPageState extends State { } } } + return allEmails; } else { throw Exception('Failed to load threads'); } } catch (e) { print('_displayEmailsFromFolder caught error: $e'); + return []; } print("Done"); - setState(() { - emails = allEmails; - }); + // setState(() { + // emails = allEmails; + // }); } Future fetchThreads( - int threadId, List allEmails) async { + //populates allEmails, which is the List that contains all the emails in a thread + int threadId, + List allEmails) async { try { var url = Uri.http('127.0.0.1:3001', 'get_thread', {'id': threadId.toString()}); @@ -95,7 +75,7 @@ class EmailPageState extends State { } } - Future _getEmailContent(List IDs) async { + Future fetchEmailContent(List IDs) async { String content = r""" """; @@ -108,7 +88,7 @@ class EmailPageState extends State { if (response.statusCode == 200) { content += response.body; - content += "

end of mail




"; + content += "

end of mail





"; } } } catch (e) { @@ -122,144 +102,15 @@ class EmailPageState extends State { // showDialog(context: context, builder: builder) // } - Future> getDrawerItems(BuildContext context) async { - List drawerItems = []; - + Future> fetchFolders() async { try { var url = Uri.http('127.0.0.1:3001', 'folders'); var response = await http.get(url); - drawerItems = List.from(json.decode(response.body)); + return List.from(json.decode(response.body)); } catch (e) { - print('getDrawerItems caught error: $e'); + print('fetchFolders caught error: $e'); + return []; } - - List 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>( - future: getDrawerItems( - context), // call the async function to get the future - builder: - (BuildContext context, AsyncSnapshot> 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 Function(List) 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(); - }, - ), - ); } }