//drawer with the folders for emails a.k.a mailboxes import 'package:flutter/material.dart'; import 'api_service.dart'; // ignore: must_be_immutable class FolderDrawer extends StatefulWidget { ApiService apiService; Function(String) onFolderTap; FolderDrawer({required this.apiService, required this.onFolderTap}); @override _FolderDrawerState createState() => _FolderDrawerState(); } class _FolderDrawerState extends State { List folders = []; final TextEditingController _renameController = TextEditingController(); @override void initState() { super.initState(); _fetchFolders(); } Future _fetchFolders() async { try { List fetchedFolders = await widget.apiService.fetchFolders(); setState(() { folders = fetchedFolders; }); } catch (e) { print('Error fetching folders: $e'); } } @override Widget build(BuildContext context) { return Drawer( child: ListView( padding: EdgeInsets.zero, children: [ ...folders.map((folder) { return ListTile( leading: Icon(Icons.mail), title: Text(folder), trailing: IconButton( icon: Icon(Icons.more_vert), onPressed: () => { ///show options _showOptions(context, folder) }, ), onTap: () { widget.onFolderTap(folder); Navigator.pop( context); // Close the drawer after selecting a folder }, ); }).toList(), ListTile( leading: Icon(Icons.add), title: Text("New Mailbox"), onTap: () { showDialog( context: context, builder: (BuildContext context) { return NewMailbox(apiService: widget.apiService); }, ); // Navigator.of(context).pop(); }, ), ListTile( leading: Icon(Icons.refresh), title: Text('Refresh Folders'), onTap: () { _fetchFolders(); // Refresh folders when this tile is tapped Navigator.pop(context); // Close the drawer after refresh }, ), ], ), ); } Future _renameDialog(String oldFolder) async { showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text("Rename Mailbox"), content: TextField( controller: _renameController, decoration: const InputDecoration( hintText: "New Name", ), ), actions: [ TextButton( onPressed: () { String newfolderName = _renameController.text; if (newfolderName.isNotEmpty) { //make an and to make sure there's two folders with the same name ApiService().renameFolder(oldFolder, newfolderName); } Navigator.of(context).pop(); }, child: const Text("Rename"), ), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text("Cancel"), ) ], ); }); return false; } Future doubleCheckDelete(String folderTobeDeleted) async { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return AlertDialog( title: Text("Confirm delete of: $folderTobeDeleted"), actions: [ TextButton( onPressed: () { ApiService().deleteFolder(folderTobeDeleted); Navigator.of(context).pop(); }, child: Text("Yes")), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text("No")), ], ); }); } void _showOptions(BuildContext context, String folderName) async { final RenderBox overlay = Overlay.of(context).context.findRenderObject() as RenderBox; print(folderName); await showMenu( context: context, position: RelativeRect.fromLTRB( 100, 100, overlay.size.width, overlay.size.height), items: >[ PopupMenuItem( value: 'Rename', child: Text('Rename Folder'), ), PopupMenuItem( value: 'Delete', child: Text('Delete Folder'), ), ], ).then((value) { // Handle the action based on the selected menu item if (value == 'Rename') { // Logic for renaming the folder print('Rename folder $folderName'); _renameDialog(folderName); } else if (value == 'Delete') { // Logic for deleting the folder print("Deleting $folderName"); doubleCheckDelete(folderName); // ApiService().deleteFolder(folderName); print('Deleted folder'); } }); } } class NewMailbox extends StatelessWidget { final ApiService apiService; final TextEditingController _textFieldController = TextEditingController(); NewMailbox({required this.apiService}); @override Widget build(BuildContext context) { return AlertDialog( title: const Text("Create a new Mailbox"), content: TextField( controller: _textFieldController, decoration: const InputDecoration( hintText: "New Folder", ), ), actions: [ TextButton( onPressed: () { print("Folder name: ${_textFieldController.text}"); String folderName = _textFieldController.text; if (folderName.isNotEmpty) { apiService.createFolder(folderName); } Navigator.of(context).pop(); }, child: const Text("Approve"), ), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text("Cancel"), ) ], ); } }