compose widget where you can write the email
This commit is contained in:
		
							parent
							
								
									2465201b0b
								
							
						
					
					
						commit
						433394a74a
					
				
					 1 changed files with 165 additions and 0 deletions
				
			
		
							
								
								
									
										165
									
								
								lib/Compose.dart
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								lib/Compose.dart
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,165 @@
 | 
			
		|||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:super_editor/super_editor.dart';
 | 
			
		||||
import 'package:super_editor_markdown/super_editor_markdown.dart';
 | 
			
		||||
 | 
			
		||||
class ComposeEmail extends StatefulWidget {
 | 
			
		||||
  final VoidCallback onClose;
 | 
			
		||||
  final Function(String) onMinimize;
 | 
			
		||||
  final Function(String) onSendMessage;
 | 
			
		||||
  const ComposeEmail({
 | 
			
		||||
    Key? key,
 | 
			
		||||
    required this.onMinimize,
 | 
			
		||||
    required this.onClose,
 | 
			
		||||
    required this.onSendMessage,
 | 
			
		||||
  }) : super(key: key);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  _ComposeEmailState createState() => _ComposeEmailState();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class _ComposeEmailState extends State<ComposeEmail> {
 | 
			
		||||
  // if one were to alter a mutableDocument, one should only alter the document through EditRequest to the Editor
 | 
			
		||||
  late final Editor _editor;
 | 
			
		||||
  late final MutableDocument _document;
 | 
			
		||||
  late final MutableDocumentComposer _composer;
 | 
			
		||||
  TextEditingController _emailRecipientController = TextEditingController();
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void initState() {
 | 
			
		||||
    super.initState();
 | 
			
		||||
 | 
			
		||||
    _document = MutableDocument(nodes: [
 | 
			
		||||
      ParagraphNode(
 | 
			
		||||
        id: Editor.createNodeId(),
 | 
			
		||||
        text: AttributedText("hello world!"),
 | 
			
		||||
      )
 | 
			
		||||
    ]);
 | 
			
		||||
    _composer = MutableDocumentComposer();
 | 
			
		||||
    _editor =
 | 
			
		||||
        createDefaultDocumentEditor(document: _document!, composer: _composer!);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void dispose() {
 | 
			
		||||
    _editor.dispose();
 | 
			
		||||
    super.dispose();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Widget build(BuildContext context) {
 | 
			
		||||
    return Positioned(
 | 
			
		||||
      bottom: 10.0,
 | 
			
		||||
      right: 10.0,
 | 
			
		||||
      child: Material(
 | 
			
		||||
        elevation: 8.0,
 | 
			
		||||
        child: Container(
 | 
			
		||||
            width: 600.0,
 | 
			
		||||
            height: 616.0,
 | 
			
		||||
            decoration: BoxDecoration(
 | 
			
		||||
              color: Colors.white,
 | 
			
		||||
            ),
 | 
			
		||||
            child: Column(children: [
 | 
			
		||||
              AppBar(
 | 
			
		||||
                title: const Text("new message"),
 | 
			
		||||
                actions: [
 | 
			
		||||
                  IconButton(
 | 
			
		||||
                      onPressed: () {
 | 
			
		||||
                        //TODO: implement minimize, and submit email to drafts
 | 
			
		||||
                        widget.onClose();
 | 
			
		||||
                      },
 | 
			
		||||
                      icon: Icon(Icons.minimize, color: Colors.grey[600])),
 | 
			
		||||
                  IconButton(
 | 
			
		||||
                      onPressed: () {
 | 
			
		||||
                        //TODO: implement that maximizing
 | 
			
		||||
                      },
 | 
			
		||||
                      icon: Icon(Icons.maximize, color: Colors.grey[600])),
 | 
			
		||||
                  IconButton(
 | 
			
		||||
                      onPressed: () {
 | 
			
		||||
                        widget.onClose();
 | 
			
		||||
                      },
 | 
			
		||||
                      icon: Icon(Icons.close, color: Colors.grey[600])),
 | 
			
		||||
                ],
 | 
			
		||||
              ),
 | 
			
		||||
              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: [
 | 
			
		||||
                    TextButton(onPressed: () {}, child: Text("To:")),
 | 
			
		||||
                    Expanded(
 | 
			
		||||
                      child: TextField(
 | 
			
		||||
                        controller: _emailRecipientController,
 | 
			
		||||
                      ),
 | 
			
		||||
                    ),
 | 
			
		||||
                    TextButton(onPressed: () {}, child: Text("Cc")),
 | 
			
		||||
                    SizedBox(
 | 
			
		||||
                      width: 4.0,
 | 
			
		||||
                    ),
 | 
			
		||||
                    TextButton(onPressed: () {}, child: Text("Bcc")),
 | 
			
		||||
                  ],
 | 
			
		||||
                ),
 | 
			
		||||
              ),
 | 
			
		||||
              Expanded(
 | 
			
		||||
                  //here the widget goes
 | 
			
		||||
                  child: SuperEditor(
 | 
			
		||||
                    editor: _editor!,
 | 
			
		||||
                    plugins: {MarkdownInlineUpstreamSyntaxPlugin()},
 | 
			
		||||
                    stylesheet: Stylesheet(
 | 
			
		||||
                      rules: [StyleRule(BlockSelector.all, (doc, docNode) {
 | 
			
		||||
                        return {
 | 
			
		||||
                          Styles.maxWidth: 640.0,
 | 
			
		||||
                          Styles.padding: const CascadingPadding.symmetric(horizontal: 24),
 | 
			
		||||
                          Styles.textStyle: const TextStyle(
 | 
			
		||||
                            color: Colors.black,
 | 
			
		||||
                            fontSize: 15,
 | 
			
		||||
                            height: 1.4,
 | 
			
		||||
                          ),
 | 
			
		||||
                        };
 | 
			
		||||
                      }),],
 | 
			
		||||
                      inlineTextStyler: defaultInlineTextStyler)
 | 
			
		||||
                  ),
 | 
			
		||||
              )
 | 
			
		||||
            ])),
 | 
			
		||||
      ),
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class OverlayService {
 | 
			
		||||
  static final OverlayService _instance = OverlayService._internal();
 | 
			
		||||
  factory OverlayService() => _instance;
 | 
			
		||||
  OverlayService._internal();
 | 
			
		||||
  OverlayEntry? _overlayEntry;
 | 
			
		||||
 | 
			
		||||
  void showPersistentWidget(BuildContext context) {
 | 
			
		||||
    if (_overlayEntry != null) {
 | 
			
		||||
      print("overlay visible");
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    _overlayEntry = OverlayEntry(
 | 
			
		||||
        builder: (context) => ComposeEmail(
 | 
			
		||||
              onClose: () {
 | 
			
		||||
                removeComposeWidget();
 | 
			
		||||
              },
 | 
			
		||||
              onMinimize: (String content) {
 | 
			
		||||
                minimizeComposeWidget(content);
 | 
			
		||||
              },
 | 
			
		||||
              onSendMessage: (message) {
 | 
			
		||||
                print('msg senf form overlay $message');
 | 
			
		||||
              },
 | 
			
		||||
            ));
 | 
			
		||||
    Navigator.of(context).overlay?.insert(_overlayEntry!);
 | 
			
		||||
    print("inserted into tree");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void removeComposeWidget() {
 | 
			
		||||
    _overlayEntry?.remove();
 | 
			
		||||
    _overlayEntry = null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  String minimizeComposeWidget(String content) {
 | 
			
		||||
    //just hide the overlay but keep its info
 | 
			
		||||
    return '';
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		
		Reference in a new issue