when in drafts if you click on an email listed there it will open the compose window with the info of that draft

This commit is contained in:
Juan Marulanda De Los Rios 2025-08-21 13:46:48 -04:00
parent 9d05e612cc
commit 9d6ec2b6bc

View File

@ -1,3 +1,5 @@
import 'package:crab_ui/api_service.dart';
import 'package:crab_ui/structs.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:super_editor/super_editor.dart'; import 'package:super_editor/super_editor.dart';
import 'package:super_editor_markdown/super_editor_markdown.dart'; import 'package:super_editor_markdown/super_editor_markdown.dart';
@ -6,12 +8,14 @@ class ComposeEmail extends StatefulWidget {
final VoidCallback onClose; final VoidCallback onClose;
final Function(String) onMinimize; final Function(String) onMinimize;
final Function(String) onSendMessage; final Function(String) onSendMessage;
const ComposeEmail({ GetThreadResponse? emailDraftID;
Key? key, ComposeEmail(
required this.onMinimize, {Key? key,
required this.onClose, required this.onMinimize,
required this.onSendMessage, required this.onClose,
}) : super(key: key); required this.onSendMessage,
this.emailDraftID})
: super(key: key);
@override @override
_ComposeEmailState createState() => _ComposeEmailState(); _ComposeEmailState createState() => _ComposeEmailState();
@ -23,20 +27,38 @@ class _ComposeEmailState extends State<ComposeEmail> {
late final MutableDocument _document; late final MutableDocument _document;
late final MutableDocumentComposer _composer; late final MutableDocumentComposer _composer;
TextEditingController _emailRecipientController = TextEditingController(); TextEditingController _emailRecipientController = TextEditingController();
TextEditingController _emailSubjectController = TextEditingController();
List<String>? contentOfDraft;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_loadDraftContent();
}
_document = MutableDocument(nodes: [ void _loadDraftContent() async {
ParagraphNode( if (widget.emailDraftID != null) {
id: Editor.createNodeId(), String? drafted = widget.emailDraftID?.messages.last;
text: AttributedText("hello world!"), if (drafted != null) {
) contentOfDraft =
]); await ApiService().fetchMarkdownContent([drafted!], "Drafts");
_composer = MutableDocumentComposer(); setState(() {
_editor = _document = MutableDocument(nodes: [
createDefaultDocumentEditor(document: _document!, composer: _composer!); ParagraphNode(
id: Editor.createNodeId(),
text: AttributedText(contentOfDraft?[0] ??
""), // NOW THIS SHOULD BE WTV ITS IN DRAFTS
)
]);
_composer = MutableDocumentComposer();
_editor = createDefaultDocumentEditor(
document: _document, composer: _composer);
_emailRecipientController.text =
widget.emailDraftID!.to[0].address;
_emailSubjectController.text = widget.emailDraftID!.subject;
});
}
}
} }
@override @override
@ -70,7 +92,7 @@ class _ComposeEmailState extends State<ComposeEmail> {
icon: Icon(Icons.minimize, color: Colors.grey[600])), icon: Icon(Icons.minimize, color: Colors.grey[600])),
IconButton( IconButton(
onPressed: () { onPressed: () {
//TODO: implement that maximizing //TODO: implement maximizing the window or widget
}, },
icon: Icon(Icons.maximize, color: Colors.grey[600])), icon: Icon(Icons.maximize, color: Colors.grey[600])),
IconButton( IconButton(
@ -81,9 +103,9 @@ class _ComposeEmailState extends State<ComposeEmail> {
], ],
), ),
Container( Container(
// TODO: WHEN NOT CLICKED ITS ONLY A TEXTFIELD WITH A HINT, AND THEN WHEN CLICKED THIS // TODO: WHEN NOT CLICKED ITS ONLY A TEXTFIELD WITH A HINT, AND THEN WHEN CLICKED THIS
width: 500.0, // width: 500.0,
height: 40.0, // height: 40.0,
child: Row( child: Row(
children: [ children: [
TextButton(onPressed: () {}, child: Text("To:")), TextButton(onPressed: () {}, child: Text("To:")),
@ -100,25 +122,95 @@ class _ComposeEmailState extends State<ComposeEmail> {
], ],
), ),
), ),
SizedBox(
height: 4,
),
Container(
// TODO: WHEN NOT CLICKED ITS ONLY A TEXTFIELD WITH A HINT, AND THEN WHEN CLICKED THIS
width: 500.0,
// height: 40.0,
child: Row(
children: [
Expanded(
child: TextField(
controller: _emailSubjectController,
decoration: InputDecoration(
hintText: "Subject",
),
),
)
],
),
),
Expanded( Expanded(
//here the widget goes //here the widget goes
child: SuperEditor( child: SuperEditor(
editor: _editor!, //make this its own
plugins: {MarkdownInlineUpstreamSyntaxPlugin()}, editor: _editor!,
stylesheet: Stylesheet( plugins: {MarkdownInlineUpstreamSyntaxPlugin()},
rules: [StyleRule(BlockSelector.all, (doc, docNode) {
return { // stylesheet: Stylesheet(
Styles.maxWidth: 640.0, // rules: [StyleRule(BlockSelector.all, (doc, docNode) {
Styles.padding: const CascadingPadding.symmetric(horizontal: 24), // return {
Styles.textStyle: const TextStyle( // Styles.maxWidth: 640.0,
color: Colors.black, // Styles.padding: const CascadingPadding.symmetric(horizontal: 24),
fontSize: 15, // Styles.textStyle: const TextStyle(
height: 1.4, // color: Colors.black,
// // fontSize: 15,
// height: 1.4,
// ),
// };
// }),],
// inlineTextStyler: defaultInlineTextStyler)
),
),
Container(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 5),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
ElevatedButton(
onPressed: () {
print('sent');
String markdown =
serializeDocumentToMarkdown(_editor.document);
print(_emailRecipientController.text);
print(_emailSubjectController.text);
print(markdown);
ApiService().sendEmail(_emailRecipientController.text,
_emailSubjectController.text, markdown);
},
style: ElevatedButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30)),
elevation: 4,
foregroundColor: Colors.white,
backgroundColor: Colors.blueAccent),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Text(
'Send',
style: TextStyle(fontWeight: FontWeight.bold),
), ),
}; // const SizedBox(
}),], // width: 8,
inlineTextStyler: defaultInlineTextStyler) // ),
), // Container(
// height: 30, width: 1.0, color: Colors.white),
// const SizedBox(
// width: 8,
// ),
// const Icon(
// Icons.arrow_drop_down,
// size: 24,
// )
],
),
),
],
),
) )
])), ])),
), ),
@ -131,6 +223,7 @@ class OverlayService {
factory OverlayService() => _instance; factory OverlayService() => _instance;
OverlayService._internal(); OverlayService._internal();
OverlayEntry? _overlayEntry; OverlayEntry? _overlayEntry;
GetThreadResponse? draftID;
void showPersistentWidget(BuildContext context) { void showPersistentWidget(BuildContext context) {
if (_overlayEntry != null) { if (_overlayEntry != null) {
@ -139,16 +232,16 @@ class OverlayService {
} }
_overlayEntry = OverlayEntry( _overlayEntry = OverlayEntry(
builder: (context) => ComposeEmail( builder: (context) => ComposeEmail(
onClose: () { onClose: () {
removeComposeWidget(); removeComposeWidget();
}, },
onMinimize: (String content) { onMinimize: (String content) {
minimizeComposeWidget(content); minimizeComposeWidget(content);
}, },
onSendMessage: (message) { onSendMessage: (message) {
print('msg senf form overlay $message'); print('msg senf form overlay $message');
}, },
)); emailDraftID: draftID));
Navigator.of(context).overlay?.insert(_overlayEntry!); Navigator.of(context).overlay?.insert(_overlayEntry!);
print("inserted into tree"); print("inserted into tree");
} }