hym_ui/lib/folder_drawer.dart

223 lines
6.4 KiB
Dart

//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<FolderDrawer> {
List<String> folders = [];
final TextEditingController _renameController = TextEditingController();
@override
void initState() {
super.initState();
_fetchFolders();
}
Future<void> _fetchFolders() async {
try {
List<String> 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<bool> _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: <Widget>[
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<void> doubleCheckDelete(String folderTobeDeleted) async {
return showDialog<void>(
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<String>(
context: context,
position: RelativeRect.fromLTRB(
100, 100, overlay.size.width, overlay.size.height),
items: <PopupMenuEntry<String>>[
PopupMenuItem<String>(
value: 'Rename',
child: Text('Rename Folder'),
),
PopupMenuItem<String>(
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: <Widget>[
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"),
)
],
);
}
}