Compare commits

...

4 Commits

5 changed files with 104 additions and 43 deletions

View File

@ -29,6 +29,7 @@ class _ComposeEmailState extends State<ComposeEmail> {
TextEditingController _emailRecipientController = TextEditingController();
TextEditingController _emailSubjectController = TextEditingController();
List<String>? contentOfDraft;
bool isInitialized = false;
@override
void initState() {
@ -53,22 +54,43 @@ class _ComposeEmailState extends State<ComposeEmail> {
_composer = MutableDocumentComposer();
_editor = createDefaultDocumentEditor(
document: _document, composer: _composer);
_emailRecipientController.text =
widget.emailDraftID!.to[0].address;
_emailRecipientController.text = widget.emailDraftID!.to[0].address;
_emailSubjectController.text = widget.emailDraftID!.subject;
isInitialized = true;
});
}
} else {
setState(() {
_document = MutableDocument(nodes: [
ParagraphNode(
id: Editor.createNodeId(),
text: AttributedText(""),
),
]);
_composer = MutableDocumentComposer();
_editor = createDefaultDocumentEditor(
document: _document, composer: _composer);
isInitialized = true;
});
}
}
@override
void dispose() {
_editor.dispose();
_emailRecipientController.dispose();
_emailSubjectController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!isInitialized) {
return Center(
child: CircularProgressIndicator(),
);
}
return Positioned(
bottom: 10.0,
right: 10.0,
@ -146,7 +168,7 @@ class _ComposeEmailState extends State<ComposeEmail> {
//here the widget goes
child: SuperEditor(
//make this its own
editor: _editor!,
editor: _editor,
plugins: {MarkdownInlineUpstreamSyntaxPlugin()},
// stylesheet: Stylesheet(

View File

@ -49,7 +49,39 @@ class ApiService {
return [];
}
}
Future<List<GetThreadResponse>> fetchEmailsFromFolderReversed(
String folder, int pagenitaion) async {
try {
var url = Uri.http('$ip:$port', 'sorted_threads_by_date_current', {
'folder': folder,
'limit': '50',
'offset': pagenitaion.toString(),
});
var response = await http.get(url);
List<GetThreadResponse> allEmails = [];
if (response.statusCode == 200) {
List json = jsonDecode(response.body);
for (var item in json) {
//each item in the json is a date
if (item.length > 1 && item[0] is String && item[1] is List) {
List<int> threadIDs = List<int>.from(item[1]);
for (var threadId in threadIDs) {
await fetchThreads(threadId, allEmails);
}
}
}
currFolder = folder;
return allEmails;
} else {
throw Exception('Failed to load threads');
}
} catch (e) {
print('_displayEmailsFromFolder caught error: $e');
return [];
}
}
Future<void> fetchThreads(
//populates allEmails, which is the List that contains all the emails in a thread
int threadId,
@ -180,15 +212,16 @@ class ApiService {
return false;
}
SerializableMessage firstMail = mailsInSerializable[0];
// SerializableMessage firstMail = mailsInSerializable[0];
Map<String, String> requestBody = {
'from': fromFolder,
'uid': firstMail.uid.toString(),
'to': "Deleted Crabmail",
};
try {
for (SerializableMessage mail in mailsInSerializable) {
Map<String, String> requestBody = {
'from': fromFolder,
'uid': mail.uid.toString(),
'to': "Deleted Crabmail",
};
var response = await http.post(
url,
headers: {
@ -201,7 +234,7 @@ class ApiService {
return true;
} else {
print('error ${response.statusCode} ${response.body}');
}
}}
} catch (e) {
print("failed trying to post move_email, with error: $e");
}
@ -374,8 +407,8 @@ class ApiService {
} catch (e) {
print('_getMDContent caught error: $e');
}
print("IDS inside fetch md content $IDsString");
// print("IDS inside fetch md content $IDsString");
// print("inside apiservice $MDofThread");
return MDofThread;
}
@ -454,9 +487,8 @@ class ApiService {
"subject": subject ?? "Untitled",
"in_reply_to": "",
"messages": [
{
"message": emailContent ?? "",
"is_html": false}],
{"message": emailContent ?? "", "is_html": false}
],
"attachments": [],
"inline_images": [],
};

View File

@ -237,13 +237,13 @@ class _DynamicClassesAugment extends State<EmailToolbar> {
// SizedBox(width: 8),
ElevatedButton(
onPressed: () => AugmentClasses()
.handleCreateLink(context, widget.emails, widget.subject),
.handleCreateLink(context, widget.emails, widget.subject, widget.emails[0]), //need to add the email ids
child: Text('Create Link'),
),
ElevatedButton(
// onPressed: () => localAugment!.handlePaste(context),
onPressed: () =>
AugmentClasses().handlePaste(context, widget.emails[0]),
AugmentClasses().handlePaste(context),
child: Text('Paste Link'),
),
],
@ -552,14 +552,14 @@ class AugmentClasses {
}
_copyLink(String anchor, String target, String format, String viewspecs,
String nameOfDocument) {
String form = "$anchor < $nameOfDocument, $target :$viewspecs >";
String nameOfDocument, emailID) {
String form = "$anchor < $nameOfDocument, $target :$viewspecs > $emailID";
final link = ClipboardData(text: form);
Clipboard.setData(link);
}
Future<void> handleCreateLink(BuildContext context,
List<String> emailsInThread, String nameOfDocument) async {
List<String> emailsInThread, String nameOfDocument, String emailID) async {
print("create link button pressed");
final TextEditingController targetController = TextEditingController();
final TextEditingController anchorController = TextEditingController();
@ -670,7 +670,9 @@ class AugmentClasses {
targetController.text,
format,
viewspecsController.text,
nameOfDocument),
nameOfDocument,
emailID,
),
Navigator.of(context).pop()
},
child: Text("OK")),
@ -682,7 +684,7 @@ class AugmentClasses {
));
}
Future<void> handlePaste(BuildContext context, String emailID) async {
Future<void> handlePaste(BuildContext context) async {
final TextEditingController gotoLink = TextEditingController();
Routinghandler localRouting;
@ -716,18 +718,16 @@ class AugmentClasses {
ElevatedButton(
onPressed: () {
print('pressed');
// i need this shit to be processed into args
print("email_id given $emailID");
Navigator.of(context).pop();
final localRouting =
Routinghandler(gotoLink.text, emailID);
Routinghandler(gotoLink.text);
final String subject =
localRouting.docName; // This is your :subject
final String target =
localRouting.target; // This is your :target
final String viewspecs =
localRouting.viewspecs; // This is your :viewspecs
final String finalEmailID = emailID;
final String finalEmailID = localRouting.emailID;
final encodedSubject = Uri.encodeComponent(subject);
final encodedTarget = Uri.encodeComponent(target);

View File

@ -199,6 +199,7 @@ class _EmailListScreenState extends State<EmailListScreen>
_thisInstance.draftID = email;
_thisInstance.showPersistentWidget(context);
} else {
// print(email)
Navigator.push(
context,
MaterialPageRoute(
@ -296,7 +297,7 @@ class EmailPageState extends State<EmailPage> {
void _fetchEmails() async {
try {
List<GetThreadResponse> fetchedEmails = await apiService
.fetchEmailsFromFolder(widget.selectedFolder, widget.offset);
.fetchEmailsFromFolderReversed(widget.selectedFolder, widget.offset);
if (!mounted) return;
setState(() {

View File

@ -7,7 +7,7 @@ import 'api_service.dart';
import 'structs.dart';
class Routinghandler extends StatefulWidget {
Routinghandler(String link, emailID) {
Routinghandler(String link) {
bool anchorDone = false;
bool docNameDone = false;
@ -16,6 +16,8 @@ class Routinghandler extends StatefulWidget {
bool targetDone = false;
bool emailIdDone = false;
for (int letter = 0; letter < link.length; letter++) {
if (!anchorDone) {
if (link[letter] != '<') {
@ -44,6 +46,8 @@ class Routinghandler extends StatefulWidget {
} else {
viewspecsDone = true;
}
} else if (!emailIdDone) {
emailID += link[letter];
}
}
anchor = anchor.trim();
@ -203,12 +207,14 @@ class _RoutingHandlerState extends State<Routinghandler> {
Expanded(
child: Align(
alignment: Alignment.topLeft,
child: Wrap(children: [
child: Wrap(
children: [
MarkdownBlock(
data: aug!.children![0]!.children![i]!.data ?? ''),
],)
)
),
data: aug!.children![0]!.children![i]!
.data ??
''),
],
))),
Padding(
padding: const EdgeInsets.fromLTRB(0, 10, 5, 0),
child: Text(