saveNote function
Implementation
Future<void> saveNote(
BuildContext context,
TextEditingController textController,
GlobalKey<FormBuilderState> formKey, [
Map? prevNoteData,
bool shared = false,
Map notesMap = const {},
]) async {
if (formKey.currentState?.saveAndValidate() ?? false) {
// Compares to prevNoteData if previous note data provided
// Adds sharing metadata if shared==true
final SolidFunctionCallStatus 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
if (context.mounted) {
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
ViewSharedNote(
fullNoteData: newFullNoteData,
),
shared,
prevSharedNoteInfo,
);
// Navigate to return page
postSaveNav(
// context.mounted checked already
// ignore: use_build_context_synchronously
context,
createNoteStatus,
ViewSharedNote(
fullNoteData: newFullNoteData,
),
);
}
} else {
// Non-shared edited note
// Encrypt note, create TTL, update file in POD
if (context.mounted) {
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
EditNote(
noteData: noteNewData,
notesMap: notesMap,
),
shared,
);
// Navigate to return page
postSaveNav(
// context.mounted checked already
// ignore: use_build_context_synchronously
context,
createNoteStatus,
ViewNote(noteData: noteNewData, notesMap: notesMap),
);
}
}
}
} 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
if (context.mounted) {
createNoteStatus = await saveNoteToPod(
context,
noteNewData,
ListNotesScreen(),
);
// Navigate to return page
postSaveNav(
// context.mounted checked already
// ignore: use_build_context_synchronously
context,
createNoteStatus,
ListNotesScreen(),
);
}
} 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.',
);
}
}