diff --git a/lib/file_storage.dart b/lib/file_storage.dart index e1b1de6b..386c5237 100644 --- a/lib/file_storage.dart +++ b/lib/file_storage.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/foundation.dart'; +import 'package:journal/notes_repository.dart'; import 'package:journal/serializers.dart'; import 'package:path/path.dart' as p; @@ -9,7 +10,7 @@ import './note.dart'; typedef String NoteFileNameGenerator(Note note); -class FileStorage { +class FileStorage implements NoteRepository { final Future Function() getDirectory; final NoteSerializer noteSerializer; final NoteFileNameGenerator fileNameGenerator; @@ -20,7 +21,8 @@ class FileStorage { @required this.fileNameGenerator, }); - Future> loadNotes() async { + @override + Future> listNotes() async { final dir = await getDirectory(); var notes = new List(); @@ -44,22 +46,7 @@ class FileStorage { return noteSerializer.decode(string); } - Future saveNotes(List notes) async { - final dir = await getDirectory(); - await dir.delete(recursive: true); - await dir.create(); - - for (var note in notes) { - var filePath = p.join(dir.path, fileNameGenerator(note)); - - var file = new File(filePath); - var contents = noteSerializer.encode(note); - await file.writeAsString(contents); - } - - return dir; - } - + @override Future addNote(Note note) async { final dir = await getDirectory(); var filePath = p.join(dir.path, fileNameGenerator(note)); @@ -71,6 +58,7 @@ class FileStorage { return true; } + @override Future removeNote(Note note) async { final dir = await getDirectory(); var filePath = p.join(dir.path, fileNameGenerator(note)); @@ -80,4 +68,14 @@ class FileStorage { return true; } + + @override + Future updateNote(Note note) async { + return addNote(note); + } + + @override + Future sync() async { + return false; + } } diff --git a/lib/notes_repository.dart b/lib/notes_repository.dart new file mode 100644 index 00000000..5141dde3 --- /dev/null +++ b/lib/notes_repository.dart @@ -0,0 +1,76 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; + +import 'package:journal/file_storage.dart'; +import 'package:journal/note.dart'; +import 'package:journal/serializers.dart'; + +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as p; + +abstract class NoteRepository { + // Syncs the repo + // - git pull with an auto merge + // - git push + + // TODO: Better error message! + Future sync(); + + Future addNote(Note note); + Future updateNote(Note note); + Future removeNote(Note note); + + Future> listNotes(); +} + +Future getNotesDir() async { + var appDir = await getApplicationDocumentsDirectory(); + var dir = new Directory(p.join(appDir.path, "notes")); + await dir.create(); + + return dir; +} + +class GitNoteRepository implements NoteRepository { + FileStorage _fileStorage = new FileStorage( + getDirectory: getNotesDir, + noteSerializer: new MarkdownYAMLSerializer(), + fileNameGenerator: (Note note) => note.id, + ); + final String gitUrl; + final String dirPath; + + GitNoteRepository({ + @required this.gitUrl, + @required this.dirPath, + }) { + // FIXME: This isn't correct. The gitUrl might not be cloned at this point! + } + + @override + Future addNote(Note note) async { + return _fileStorage.addNote(note); + } + + @override + Future> listNotes() { + return _fileStorage.listNotes(); + } + + @override + Future removeNote(Note note) async { + return _fileStorage.removeNote(note); + } + + @override + Future sync() async { + return false; + } + + @override + Future updateNote(Note note) async { + return _fileStorage.updateNote(note); + } +} diff --git a/lib/state_container.dart b/lib/state_container.dart index e33b8e9c..35daf236 100644 --- a/lib/state_container.dart +++ b/lib/state_container.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:journal/notes_repository.dart'; import 'package:journal/serializers.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; @@ -40,7 +41,7 @@ class StateContainer extends StatefulWidget { class StateContainerState extends State { AppState appState = AppState.loading(); - FileStorage fileStorage = new FileStorage( + NoteRepository noteRepo = new FileStorage( getDirectory: getNotesDir, noteSerializer: new MarkdownYAMLSerializer(), fileNameGenerator: (Note note) => note.id, @@ -50,7 +51,7 @@ class StateContainerState extends State { void initState() { super.initState(); - fileStorage.loadNotes().then((loadedNotes) { + noteRepo.listNotes().then((loadedNotes) { setState(() { appState = AppState(notes: loadedNotes); }); @@ -67,21 +68,21 @@ class StateContainerState extends State { setState(() { note.id = new Uuid().v4(); appState.notes.insert(0, note); - fileStorage.addNote(note); + noteRepo.addNote(note); }); } void removeNote(Note note) { setState(() { appState.notes.remove(note); - fileStorage.removeNote(note); + noteRepo.removeNote(note); }); } void insertNote(int index, Note note) { setState(() { appState.notes.insert(index, note); - fileStorage.addNote(note); + noteRepo.addNote(note); }); }