mynotes: update/edit existing notes

This commit is contained in:
Evan Ferrao 2024-09-12 11:07:28 +05:30
parent df152aafc1
commit 1c58bf1098
No known key found for this signature in database
GPG Key ID: F01DEB4D7CFC9B52
6 changed files with 49 additions and 16 deletions

View File

@ -2,4 +2,4 @@ const loginRoute = '/login/';
const registerRoute = '/register/';
const notesRoute = '/notes/';
const verifyEmailRoute = '/verify-email/';
const newNoteRoute = '/notes/new-note/';
const createOrUpdateNoteRoute = '/notes/new-note/';

View File

@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:mynotes/constants/routes.dart';
import 'package:mynotes/services/auth/auth_service.dart';
import 'package:mynotes/views/login_view.dart';
import 'package:mynotes/views/notes/new_note_view.dart';
import 'package:mynotes/views/notes/create_update_note_view.dart';
import 'package:mynotes/views/notes/notes_view.dart';
import 'package:mynotes/views/register_view.dart';
import 'package:mynotes/views/verify_email_view.dart';
@ -22,7 +22,7 @@ void main() {
registerRoute: (context) => const RegisterView(),
notesRoute: (context) => const NotesView(),
verifyEmailRoute: (context) => const VerifyEmailView(),
newNoteRoute: (context) => const NewNoteView(),
createOrUpdateNoteRoute: (context) => const CreateUpdateNoteView(),
},
),
);

View File

@ -0,0 +1,14 @@
import 'package:flutter/material.dart' show BuildContext, ModalRoute;
extension GetArguments on BuildContext {
T? getArgument<T>() {
final modalRoute = ModalRoute.of(this);
if (modalRoute != null) {
final args = modalRoute.settings.arguments;
if (args != null && args is T) {
return args as T;
}
}
return null;
}
}

View File

@ -1,15 +1,16 @@
import 'package:flutter/material.dart';
import 'package:mynotes/services/auth/auth_service.dart';
import 'package:mynotes/services/crud/notes_service.dart';
import 'package:mynotes/utilities/generics/get_arguments.dart';
class NewNoteView extends StatefulWidget {
const NewNoteView({Key? key}) : super(key: key);
class CreateUpdateNoteView extends StatefulWidget {
const CreateUpdateNoteView({Key? key}) : super(key: key);
@override
_NewNoteViewState createState() => _NewNoteViewState();
_CreateUpdateNoteViewState createState() => _CreateUpdateNoteViewState();
}
class _NewNoteViewState extends State<NewNoteView> {
class _CreateUpdateNoteViewState extends State<CreateUpdateNoteView> {
DatabaseNote? _note;
late final NotesService _notesService;
late final TextEditingController _textController;
@ -38,7 +39,14 @@ class _NewNoteViewState extends State<NewNoteView> {
_textController.addListener(_textControllerListener);
}
Future<DatabaseNote> createNewNote() async {
Future<DatabaseNote> createOrGetExistingNote(BuildContext context) async {
final widgetNote = context.getArgument<DatabaseNote>();
if (widgetNote != null) {
_note = widgetNote;
_textController.text = widgetNote.text;
return widgetNote;
}
final existingNote = _note;
if (existingNote != null) {
return existingNote;
@ -46,7 +54,9 @@ class _NewNoteViewState extends State<NewNoteView> {
final currentUser = AuthService.firebase().currentUser!;
final email = currentUser.email!;
final owner = await _notesService.getUser(email: email);
return await _notesService.createNote(owner: owner);
final newNote = await _notesService.createNote(owner: owner);
_note = newNote;
return newNote;
}
void _deleteNoteIfTextIsEmpty() {
@ -90,11 +100,10 @@ class _NewNoteViewState extends State<NewNoteView> {
),
),
body: FutureBuilder(
future: createNewNote(),
future: createOrGetExistingNote(context),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.done:
_note = snapshot.data as DatabaseNote;
_setupTextControllerListener();
return TextField(
controller: _textController,

View File

@ -1,18 +1,19 @@
import 'package:flutter/material.dart';
import 'package:mynotes/services/crud/notes_service.dart';
import 'package:mynotes/utilities/dialogs/delete_dialog.dart';
typedef DeleteNoteCallback = void Function(DatabaseNote note);
typedef NoteCallback = void Function(DatabaseNote note);
class NotesListView extends StatelessWidget {
final List<DatabaseNote> notes;
final DeleteNoteCallback onDeleteNote;
final NoteCallback onDeleteNote;
final NoteCallback onTap;
const NotesListView({
Key? key,
required this.notes,
required this.onDeleteNote,
required this.onTap,
}) : super(key: key);
@override
@ -22,6 +23,9 @@ class NotesListView extends StatelessWidget {
itemBuilder: (context, index) {
final note = notes[index];
return ListTile(
onTap: () {
onTap(note);
},
title: Text(
note.text,
maxLines: 1,
@ -41,4 +45,4 @@ class NotesListView extends StatelessWidget {
},
);
}
}
}

View File

@ -32,7 +32,7 @@ class _NotesViewState extends State<NotesView> {
actions: [
IconButton(
onPressed: () {
Navigator.of(context).pushNamed(newNoteRoute);
Navigator.of(context).pushNamed(createOrUpdateNoteRoute);
},
icon: const Icon(Icons.add),
),
@ -79,6 +79,12 @@ class _NotesViewState extends State<NotesView> {
onDeleteNote: (note) async {
await _notesService.deleteNote(id: note.id);
},
onTap: (note) {
Navigator.of(context).pushNamed(
createOrUpdateNoteRoute,
arguments: note,
);
},
);
} else {
return const CircularProgressIndicator();