mirror of https://github.com/evanferrao/mynotes
mynotes: update/edit existing notes
This commit is contained in:
parent
df152aafc1
commit
1c58bf1098
|
|
@ -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/';
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
},
|
||||
),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
@ -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 {
|
|||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue