isolating only api calls
This commit is contained in:
		
							parent
							
								
									0d07aee02a
								
							
						
					
					
						commit
						1792f98824
					
				
					 1 changed files with 25 additions and 174 deletions
				
			
		| 
						 | 
					@ -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();
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue