Skip to content

Commit 8b10d8f

Browse files
author
davidwei
committed
fix #32: Add draft service to save and restore note content
1 parent f1c7128 commit 8b10d8f

2 files changed

Lines changed: 55 additions & 4 deletions

File tree

lib/dependency_injection.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import 'package:happy_notes/services/mastodon_application_service.dart';
1212
import 'package:happy_notes/services/mastodon_service.dart';
1313
import 'package:happy_notes/services/mastodon_user_account_service.dart';
1414
import 'package:happy_notes/services/note_tag_service.dart';
15+
import 'package:happy_notes/services/draft_service.dart';
1516
import 'package:happy_notes/services/notes_services.dart';
1617
import 'package:get_it/get_it.dart';
1718
import 'package:happy_notes/services/telegram_settings_service.dart';
@@ -46,6 +47,7 @@ void _registerApis() {
4647
void _registerServices() {
4748
locator.registerLazySingleton(() => NoteTagService(noteTagApi: locator()));
4849
locator.registerLazySingleton(() => NotesService());
50+
locator.registerLazySingleton(() => DraftService());
4951
locator.registerLazySingleton(() => ImageService());
5052
locator.registerLazySingleton(() => AccountService(
5153
accountApi: locator(),

lib/screens/new_note/new_note.dart

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import '../../models/note_model.dart';
88
import '../../models/save_note_result.dart';
99
import '../../providers/notes_provider.dart';
1010
import '../../services/dialog_services.dart';
11+
import '../../services/draft_service.dart';
1112
import '../../utils/util.dart';
1213
import '../components/note_edit.dart';
1314
import '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

3535
class 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

Comments
 (0)