11import 'dart:async' ;
2+ import 'dart:convert' ;
23import 'package:flutter/material.dart' ;
34import 'package:flutter_quill/flutter_quill.dart' ;
45import 'package:hive_ce/hive.dart' ;
56import 'package:rxdart/rxdart.dart' ;
6- import 'package:sengthaite_blog/constants/app.constants.dart' ;
7- import 'package:sengthaite_blog/shared/file/hiveeditor.dart' ;
7+ import 'package:sengthaite_blog/features/tool/text_editor/text_editor_toolbar_view.dart' ;
8+ import 'package:sengthaite_blog/shared/app.data.dart' ;
9+ import 'package:sengthaite_blog/shared/data/file/hiveeditor.dart' ;
810
911class TextEditorTool extends StatefulWidget {
10- const TextEditorTool ({super .key, required this .initQuillController});
12+ const TextEditorTool ({
13+ super .key,
14+ required this .initQuillController,
15+ this .showBottomToolbar = false ,
16+ });
1117
1218 final ValueNotifier <QuillController > initQuillController;
19+ final bool showBottomToolbar;
1320
1421 @override
1522 State <TextEditorTool > createState () => _TextEditorToolState ();
1623}
1724
1825class _TextEditorToolState extends State <TextEditorTool > {
1926 final _hiveSubject = PublishSubject <Document >();
27+ final hiveEditor = HiveEditor ();
2028 QuillController ? controller;
2129
22- Future <Box <HiveEditor >> get _box async =>
23- await Hive .openBox <HiveEditor >(hiveEditor);
24-
25- Future <void > saveOnChanged (Document document) async {
26- final box = await _box;
27- final hiveEditor = HiveEditor ();
28- box.put ("content" , hiveEditor);
29- debugPrint ("Saved markdown: ${document .toPlainText ()}" );
30- hiveEditor.saveData (document.toDelta ());
31- }
32-
3330 Future <void > loadMarkdown () async {
3431 try {
35- final box = await _box;
36- final hiveBox = box.get ("content" );
37- if (hiveBox == null ) return ;
38- final data = hiveBox.formatDelta (hiveBox.data);
39- if (data != null ) {
40- var doc = Document .fromDelta (data);
41- controller = QuillController (
42- document: doc,
43- selection: TextSelection .fromPosition (
44- TextPosition (offset: doc.length > 0 ? doc.length - 1 : 0 ),
45- ),
46- );
47- } else {
48- controller = QuillController .basic ();
32+ if (await AppData ().initTextEditorData () == false ) {
33+ throw HiveError ("initTextEditorData() failed" );
34+ }
35+ final box = AppData ().textEditor;
36+ if (box != null ) {
37+ final data = box.formatDelta ();
38+ if (data != null ) {
39+ var doc = Document .fromDelta (data);
40+ controller = QuillController (
41+ document: doc,
42+ selection: TextSelection .fromPosition (
43+ TextPosition (offset: doc.length > 0 ? doc.length - 1 : 0 ),
44+ ),
45+ );
46+ }
4947 }
48+ controller ?? = QuillController .basic ();
5049 widget.initQuillController.value = controller! ;
5150 controller! .changes
5251 .debounceTime (const Duration (milliseconds: 100 ))
53- .listen ((document) async => await saveOnChanged (controller! .document));
52+ .listen ((document) async {
53+ var content = '' ;
54+ var deltaContent = controller? .document;
55+ if (deltaContent != null ) {
56+ content = jsonEncode (deltaContent.toDelta ().toJson ());
57+ }
58+ AppData ().textEditor? .data = content;
59+ await AppData ().saveEditorContent ();
60+ });
5461 } catch (error) {
5562 debugPrint ("load markdown: ${error .toString ()}" );
5663 }
@@ -72,12 +79,23 @@ class _TextEditorToolState extends State<TextEditorTool> {
7279
7380 @override
7481 Widget build (BuildContext context) {
82+ var showBottomToolbar = widget.showBottomToolbar;
7583 return ValueListenableBuilder (
7684 valueListenable: widget.initQuillController,
7785 builder: (context, controller, widget) {
7886 return Column (
7987 children: [
8088 Expanded (child: QuillEditor .basic (controller: controller)),
89+ if (showBottomToolbar)
90+ Padding (
91+ padding: const EdgeInsets .only (
92+ left: 4 ,
93+ right: 4 ,
94+ top: 4 ,
95+ bottom: 8 ,
96+ ),
97+ child: TextEditorToolbarView (controller: controller),
98+ ),
8199 ],
82100 );
83101 },
0 commit comments