@@ -8,6 +8,7 @@ import '../../models/note_model.dart';
88import '../../models/save_note_result.dart' ;
99import '../../providers/notes_provider.dart' ;
1010import '../../services/dialog_services.dart' ;
11+ import '../../services/draft_service.dart' ;
1112import '../../utils/util.dart' ;
1213import '../components/note_edit.dart' ;
1314import 'package:happy_notes/screens/components/shared_fab.dart' ;
@@ -23,9 +24,8 @@ class NewNote extends StatefulWidget {
2324 Key ? key,
2425 required this .isPrivate,
2526 this .initialTag,
26- // this.onNoteSaved, // Removed
2727 this .date,
28- this .onSaveSuccessInMainMenu, // Add to constructor
28+ this .onSaveSuccessInMainMenu,
2929 }) : super (key: key);
3030
3131 @override
@@ -34,8 +34,10 @@ class NewNote extends StatefulWidget {
3434
3535class NewNoteState extends State <NewNote > {
3636 final _newNoteController = locator <NewNoteController >();
37+ final _draftService = locator <DraftService >();
3738 late NoteModel noteModel;
3839 bool isSaving = false ;
40+ bool _draftLoaded = false ;
3941 VoidCallback ? _floatingActionButtonOnPressed;
4042
4143 @override
@@ -49,6 +51,52 @@ class NewNoteState extends State<NewNote> {
4951 if (widget.initialTag != null ) {
5052 noteModel.initialContent = widget.initialTag! ;
5153 }
54+ _loadDraft ();
55+ noteModel.addListener (_onNoteModelChanged);
56+ _draftService.addListener (_onDraftCleared);
57+ }
58+
59+ @override
60+ void dispose () {
61+ noteModel.removeListener (_onNoteModelChanged);
62+ _draftService.removeListener (_onDraftCleared);
63+ super .dispose ();
64+ }
65+
66+ void _onDraftCleared () {
67+ if (mounted) {
68+ setState (() {
69+ noteModel.content = '' ;
70+ noteModel.isPrivate = widget.isPrivate;
71+ noteModel.isMarkdown = AppConfig .markdownIsEnabled;
72+ });
73+ }
74+ }
75+
76+ void _onNoteModelChanged () {
77+ if (_draftLoaded) {
78+ _draftService.saveDraft (
79+ content: noteModel.content,
80+ isPrivate: noteModel.isPrivate,
81+ isMarkdown: noteModel.isMarkdown,
82+ );
83+ }
84+ }
85+
86+ Future <void > _loadDraft () async {
87+ if (widget.initialTag != null ) {
88+ _draftLoaded = true ;
89+ return ;
90+ }
91+ final draft = await _draftService.loadDraft ();
92+ if (draft != null && mounted) {
93+ setState (() {
94+ noteModel.content = draft.content;
95+ noteModel.isPrivate = draft.isPrivate;
96+ noteModel.isMarkdown = draft.isMarkdown;
97+ });
98+ }
99+ _draftLoaded = true ;
52100 }
53101
54102 /// Handle SaveNoteResult from controller
@@ -60,6 +108,7 @@ class NewNoteState extends State<NewNote> {
60108 ) {
61109 switch (result) {
62110 case SaveNoteSuccess success:
111+ _draftService.clearDraft ();
63112 switch (success.action) {
64113 case SaveNoteAction .executeCallback:
65114 onSaveSuccessInMainMenu? .call ();
@@ -78,28 +127,28 @@ class NewNoteState extends State<NewNote> {
78127 }
79128 }
80129
81- /// Handle PopHandlerResult from controller
82130 Future <void > _handlePopResult (
83131 BuildContext context,
84132 PopHandlerResult result,
85133 NoteModel noteModel,
86134 ) async {
87135 switch (result) {
88136 case PopHandlerAllow ():
137+ _draftService.clearDraft ();
89138 noteModel.initialContent = '' ;
90139 FocusScope .of (context).unfocus ();
91140 Navigator .of (context).pop ();
92141 break ;
93142 case PopHandlerShowDialog ():
94143 final shouldPop = await DialogService .showUnsavedChangesDialog (context) ?? false ;
95144 if (shouldPop && context.mounted) {
145+ _draftService.clearDraft ();
96146 noteModel.initialContent = '' ;
97147 FocusScope .of (context).unfocus ();
98148 Navigator .of (context).pop ();
99149 }
100150 break ;
101151 case PopHandlerPrevent ():
102- // Do nothing - pop is already prevented
103152 break ;
104153 }
105154 }
0 commit comments