saveNote function
Implementation
Future<void> saveNote(BuildContext context,
TextEditingController _textController, GlobalKey<FormBuilderState> formKey,
[Map? prevNoteData, bool shared = false]) async {
if (formKey.currentState?.saveAndValidate() ?? false) {
// Compares to prevNoteData if previous note data provided
// Adds sharing metadata if shared==true
final createNoteStatus;
Map formData = formKey.currentState?.value as Map;
String noteText = _textController.text;
Map noteNewData = {};
// Previous shared note info only used when saveNote() on edit shared note
Map prevSharedNoteInfo = {};
// Note title need to be spaceless as we are using that name
// to create a .acl file. And the acl file url cannot have spaces
String noteTitle = formData[noteTitlePred].replaceAll('\n', '');
// Get current datetimestamp for mod time and/or creation time
String modifiedDateTimeStr =
DateFormat('yyyyMMddTHHmmss').format(DateTime.now()).toString();
if (shared) {
Map prevNoteFullData = prevNoteData!;
prevNoteData = prevNoteFullData['sharedNoteContent'];
prevSharedNoteInfo = prevNoteFullData['sharedNoteInfo'];
}
if (prevNoteData != null) {
if (noteTitle == prevNoteData[noteTitlePred] &&
noteText == prevNoteData[noteContentPred]) {
showErrDialog(context, 'You have no new changes!');
} else {
// Loading animation
showAnimationDialog(
context,
17,
'Saving the note!',
false,
);
// Update existing note
String createdDateTimeStr = prevNoteData[createdDateTimePred];
// Format new note data structure
noteNewData = await prepNewNoteData(
createdDateTimeStr, modifiedDateTimeStr, noteTitle, noteText);
if (shared) {
// Shared edited note
// New full note data
Map newFullNoteData = {
'sharedNoteInfo': prevSharedNoteInfo,
'sharedNoteContent': noteNewData
};
// Encrypt note, create TTL, update file in POD
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
ViewSharedNote(
fullNoteData: newFullNoteData,
),
shared,
prevSharedNoteInfo);
// Navigate to return page
postSaveNav(
context,
createNoteStatus,
ViewSharedNote(
fullNoteData: newFullNoteData,
));
} else {
// Non-shared edited note
// Encrypt note, create TTL, update file in POD
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
EditNote(
noteData: noteNewData,
),
shared);
// Navigate to return page
postSaveNav(
context, createNoteStatus, ViewNote(noteData: noteNewData));
}
}
} else {
// Newly created note (not editing previous note)
// Check note content is not empty
if (noteText.trim() != '') {
// Loading animation
showAnimationDialog(
context,
17,
'Saving the note!',
false,
);
// Format new note data structure
// As new note, use modoifiedDateTimeStr for creation datetimestamp
noteNewData = await prepNewNoteData(
modifiedDateTimeStr, modifiedDateTimeStr, noteTitle, noteText);
// Encrypt note, create TTL and write to file in POD
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
EditNote(
noteData: noteNewData,
));
// Navigate to return page
postSaveNav(context, createNoteStatus, ViewNote(noteData: noteNewData));
} else {
// Nn note content message
Navigator.pop(context);
showErrDialog(context, 'Please enter some note content.');
}
}
} else {
showErrDialog(
context, 'Note name validation failed! Try using a different name.');
}
}