mynotes-course/lib/views/notes/create_update_note_view.dart

135 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:mynotes/extensions/buildcontext/loc.dart';
import 'package:mynotes/services/auth/auth_service.dart';
import 'package:mynotes/utilities/dialogs/cannot_share_empty_note_dialog.dart';
import 'package:mynotes/utilities/generics/get_arguments.dart';
import 'package:mynotes/services/cloud/cloud_note.dart';
import 'package:mynotes/services/cloud/firebase_cloud_storage.dart';
import 'package:share_plus/share_plus.dart';
class CreateUpdateNoteView extends StatefulWidget {
const CreateUpdateNoteView({Key? key}) : super(key: key);
@override
_CreateUpdateNoteViewState createState() => _CreateUpdateNoteViewState();
}
class _CreateUpdateNoteViewState extends State<CreateUpdateNoteView> {
CloudNote? _note;
late final FirebaseCloudStorage _notesService;
late final TextEditingController _textController;
@override
void initState() {
_notesService = FirebaseCloudStorage();
_textController = TextEditingController();
super.initState();
}
void _textControllerListener() async {
final note = _note;
if (note == null) {
return;
}
final text = _textController.text;
await _notesService.updateNote(
documentId: note.documentId,
text: text,
);
}
void _setupTextControllerListener() {
_textController.removeListener(_textControllerListener);
_textController.addListener(_textControllerListener);
}
Future<CloudNote> createOrGetExistingNote(BuildContext context) async {
final widgetNote = context.getArgument<CloudNote>();
if (widgetNote != null) {
_note = widgetNote;
_textController.text = widgetNote.text;
return widgetNote;
}
final existingNote = _note;
if (existingNote != null) {
return existingNote;
}
final currentUser = AuthService.firebase().currentUser!;
final userId = currentUser.id;
final newNote = await _notesService.createNewNote(ownerUserId: userId);
_note = newNote;
return newNote;
}
void _deleteNoteIfTextIsEmpty() {
final note = _note;
if (_textController.text.isEmpty && note != null) {
_notesService.deleteNote(documentId: note.documentId);
}
}
void _saveNoteIfTextNotEmpty() async {
final note = _note;
final text = _textController.text;
if (note != null && text.isNotEmpty) {
await _notesService.updateNote(
documentId: note.documentId,
text: text,
);
}
}
@override
void dispose() {
_deleteNoteIfTextIsEmpty();
_saveNoteIfTextNotEmpty();
_textController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
context.loc.note,
),
actions: [
IconButton(
onPressed: () async {
final text = _textController.text;
if (_note == null || text.isEmpty) {
await showCannotShareEmptyNoteDialog(context);
} else {
Share.share(text);
}
},
icon: const Icon(Icons.share),
),
],
),
body: FutureBuilder(
future: createOrGetExistingNote(context),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.done:
_setupTextControllerListener();
return TextField(
controller: _textController,
keyboardType: TextInputType.multiline,
maxLines: null,
decoration: InputDecoration(
hintText: context.loc.start_typing_your_note,
),
);
default:
return const CircularProgressIndicator();
}
},
),
);
}
}