Implement undo delete properly

This way the git History is not modified.
This commit is contained in:
Vishesh Handa
2019-02-15 19:58:58 +01:00
parent 7128e736d9
commit a32f01b2c4
6 changed files with 64 additions and 10 deletions

View File

@ -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';

View File

@ -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<Note> notes;
@ -23,6 +24,7 @@ class NoteBrowsingScreen extends StatefulWidget {
class NoteBrowsingScreenState extends State<NoteBrowsingScreen> {
PageController pageController;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
NoteBrowsingScreenState({@required int noteIndex}) {
pageController = PageController(initialPage: noteIndex);
@ -39,6 +41,7 @@ class NoteBrowsingScreenState extends State<NoteBrowsingScreen> {
);
return Scaffold(
key: _scaffoldKey,
appBar: AppBar(
title: Text('TIMELINE'),
actions: <Widget>[
@ -46,9 +49,16 @@ class NoteBrowsingScreenState extends State<NoteBrowsingScreen> {
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);
},
),
],

View File

@ -172,6 +172,26 @@ class StateContainerState extends State<StateContainer> {
});
}
/*
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(() {

View File

@ -73,6 +73,11 @@ class GitNoteRepository implements NoteRepository {
return result;
}
Future<NoteRepoResult> resetLastCommit() async {
await gitResetLast(this.dirName);
return NoteRepoResult(error: false);
}
@override
Future<NoteRepoResult> updateNote(Note note) async {
return _addNote(note, "Edited Journal Entry");

View File

@ -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<String> getVersionString() async {
var info = await PackageInfo.fromPlatform();
var versionText = "";
@ -14,3 +18,23 @@ Future<String> 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;
}

View File

@ -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));
},
);
},