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 registerRoute = '/register/';
const notesRoute = '/notes/'; const notesRoute = '/notes/';
const verifyEmailRoute = '/verify-email/'; 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/constants/routes.dart';
import 'package:mynotes/services/auth/auth_service.dart'; import 'package:mynotes/services/auth/auth_service.dart';
import 'package:mynotes/views/login_view.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/notes/notes_view.dart';
import 'package:mynotes/views/register_view.dart'; import 'package:mynotes/views/register_view.dart';
import 'package:mynotes/views/verify_email_view.dart'; import 'package:mynotes/views/verify_email_view.dart';
@ -22,7 +22,7 @@ void main() {
registerRoute: (context) => const RegisterView(), registerRoute: (context) => const RegisterView(),
notesRoute: (context) => const NotesView(), notesRoute: (context) => const NotesView(),
verifyEmailRoute: (context) => const VerifyEmailView(), 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:flutter/material.dart';
import 'package:mynotes/services/auth/auth_service.dart'; import 'package:mynotes/services/auth/auth_service.dart';
import 'package:mynotes/services/crud/notes_service.dart'; import 'package:mynotes/services/crud/notes_service.dart';
import 'package:mynotes/utilities/generics/get_arguments.dart';
class NewNoteView extends StatefulWidget { class CreateUpdateNoteView extends StatefulWidget {
const NewNoteView({Key? key}) : super(key: key); const CreateUpdateNoteView({Key? key}) : super(key: key);
@override @override
_NewNoteViewState createState() => _NewNoteViewState(); _CreateUpdateNoteViewState createState() => _CreateUpdateNoteViewState();
} }
class _NewNoteViewState extends State<NewNoteView> { class _CreateUpdateNoteViewState extends State<CreateUpdateNoteView> {
DatabaseNote? _note; DatabaseNote? _note;
late final NotesService _notesService; late final NotesService _notesService;
late final TextEditingController _textController; late final TextEditingController _textController;
@ -38,7 +39,14 @@ class _NewNoteViewState extends State<NewNoteView> {
_textController.addListener(_textControllerListener); _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; final existingNote = _note;
if (existingNote != null) { if (existingNote != null) {
return existingNote; return existingNote;
@ -46,7 +54,9 @@ class _NewNoteViewState extends State<NewNoteView> {
final currentUser = AuthService.firebase().currentUser!; final currentUser = AuthService.firebase().currentUser!;
final email = currentUser.email!; final email = currentUser.email!;
final owner = await _notesService.getUser(email: 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() { void _deleteNoteIfTextIsEmpty() {
@ -90,11 +100,10 @@ class _NewNoteViewState extends State<NewNoteView> {
), ),
), ),
body: FutureBuilder( body: FutureBuilder(
future: createNewNote(), future: createOrGetExistingNote(context),
builder: (context, snapshot) { builder: (context, snapshot) {
switch (snapshot.connectionState) { switch (snapshot.connectionState) {
case ConnectionState.done: case ConnectionState.done:
_note = snapshot.data as DatabaseNote;
_setupTextControllerListener(); _setupTextControllerListener();
return TextField( return TextField(
controller: _textController, controller: _textController,

View File

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

View File

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