saveNote function

Future<void> saveNote(
  1. BuildContext context,
  2. TextEditingController _textController,
  3. GlobalKey<FormBuilderState> formKey, [
  4. Map? prevNoteData,
  5. bool shared = false,
])

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.');
  }
}