From a32f01b2c4256b044828bd4129f1c00962fa3669 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 15 Feb 2019 19:58:58 +0100 Subject: [PATCH] Implement undo delete properly This way the git History is not modified. --- lib/main.dart | 1 - lib/note_viewer.dart | 12 +++++++++++- lib/state_container.dart | 20 ++++++++++++++++++++ lib/storage/git_storage.dart | 5 +++++ lib/utils.dart | 26 +++++++++++++++++++++++++- lib/widgets/journal_list.dart | 10 +++------- 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 025ae4cf..d6d57412 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_crashlytics/flutter_crashlytics.dart'; import 'package:journal/apis/git.dart'; import 'package:journal/app.dart'; -import 'package:journal/gitapp.dart'; import 'package:journal/settings.dart'; import 'package:journal/state_container.dart'; import 'package:shared_preferences/shared_preferences.dart'; diff --git a/lib/note_viewer.dart b/lib/note_viewer.dart index 03162679..a2104ed4 100644 --- a/lib/note_viewer.dart +++ b/lib/note_viewer.dart @@ -5,6 +5,7 @@ import 'package:journal/widgets/note_header.dart'; import 'note.dart'; import 'note_editor.dart'; +import 'utils.dart'; class NoteBrowsingScreen extends StatefulWidget { final List notes; @@ -23,6 +24,7 @@ class NoteBrowsingScreen extends StatefulWidget { class NoteBrowsingScreenState extends State { PageController pageController; + final GlobalKey _scaffoldKey = GlobalKey(); NoteBrowsingScreenState({@required int noteIndex}) { pageController = PageController(initialPage: noteIndex); @@ -39,6 +41,7 @@ class NoteBrowsingScreenState extends State { ); return Scaffold( + key: _scaffoldKey, appBar: AppBar( title: Text('TIMELINE'), actions: [ @@ -46,9 +49,16 @@ class NoteBrowsingScreenState extends State { icon: Icon(Icons.delete), onPressed: () { final stateContainer = StateContainer.of(context); - Note note = widget.notes[_currentIndex()]; + var noteIndex = _currentIndex(); + Note note = widget.notes[noteIndex]; stateContainer.removeNote(note); Navigator.pop(context); + + print("Shwoing an undo snackbar"); + var snackbar = buildUndoDeleteSnackbar(context, note, noteIndex); + _scaffoldKey.currentState + ..removeCurrentSnackBar() + ..showSnackBar(snackbar); }, ), ], diff --git a/lib/state_container.dart b/lib/state_container.dart index 2efdf44f..f9d77363 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -172,6 +172,26 @@ class StateContainerState extends State { }); } + /* + String _getGitDir(BuildContext context) { + var state = StateContainer.of(context).appState; + if (state.remoteGitRepoConfigured) { + return state.remoteGitRepoFolderName; + } else { + return state.localGitRepoPath; + } + } + */ + + void undoRemoveNote(Note note, int index) { + setState(() { + appState.notes.insert(index, note); + noteRepo.resetLastCommit().then((NoteRepoResult _) { + _syncNotes(); + }); + }); + } + void insertNote(int index, Note note) { print("State Container insertNote"); setState(() { diff --git a/lib/storage/git_storage.dart b/lib/storage/git_storage.dart index 62337a6d..25418956 100644 --- a/lib/storage/git_storage.dart +++ b/lib/storage/git_storage.dart @@ -73,6 +73,11 @@ class GitNoteRepository implements NoteRepository { return result; } + Future resetLastCommit() async { + await gitResetLast(this.dirName); + return NoteRepoResult(error: false); + } + @override Future updateNote(Note note) async { return _addNote(note, "Edited Journal Entry"); diff --git a/lib/utils.dart b/lib/utils.dart index a72512de..817e9853 100644 --- a/lib/utils.dart +++ b/lib/utils.dart @@ -1,6 +1,10 @@ -import 'package:journal/app.dart'; +import 'package:flutter/material.dart'; import 'package:package_info/package_info.dart'; +import 'app.dart'; +import 'note.dart'; +import 'state_container.dart'; + Future getVersionString() async { var info = await PackageInfo.fromPlatform(); var versionText = ""; @@ -14,3 +18,23 @@ Future getVersionString() async { return versionText; } + +SnackBar buildUndoDeleteSnackbar( + BuildContext context, + Note deletedNote, + int deletedNoteIndex, +) { + var snackbar = SnackBar( + content: Text("Note Deleted"), + action: SnackBarAction( + label: "Undo", + onPressed: () { + print("Undoing delete"); + var stateContainer = StateContainer.of(context); + stateContainer.undoRemoveNote(deletedNote, deletedNoteIndex); + }, + ), + ); + + return snackbar; +} diff --git a/lib/widgets/journal_list.dart b/lib/widgets/journal_list.dart index 6ef1be54..219b0845 100644 --- a/lib/widgets/journal_list.dart +++ b/lib/widgets/journal_list.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:journal/note.dart'; import 'package:journal/state_container.dart'; +import 'package:journal/utils.dart'; typedef void NoteSelectedFunction(int noteIndex); @@ -37,13 +38,8 @@ class JournalList extends StatelessWidget { final stateContainer = StateContainer.of(context); stateContainer.removeNote(note); - Scaffold.of(context).showSnackBar(SnackBar( - content: Text("Note deleted"), - action: SnackBarAction( - label: 'Undo', - onPressed: () => stateContainer.insertNote(i, note), - ), - )); + Scaffold.of(context) + .showSnackBar(buildUndoDeleteSnackbar(context, note, i)); }, ); },