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 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/';
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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: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,
|
||||||
|
|
@ -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 {
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue