diff --git a/lib/apis/git_migration.dart b/lib/apis/git_migration.dart index 1a37b934..4ac4f7bb 100644 --- a/lib/apis/git_migration.dart +++ b/lib/apis/git_migration.dart @@ -3,7 +3,7 @@ import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:journal/apis/git.dart'; - +import 'package:journal/settings.dart'; import 'package:path/path.dart' as p; // @@ -34,8 +34,8 @@ Future migrateGitRepo({ await gitAdd(toGitBasePath, fileName); await gitCommit( gitFolder: toGitBasePath, - authorEmail: "app@gitjournal.io", - authorName: "GitJournal", + authorEmail: Settings.instance.gitAuthorEmail, + authorName: Settings.instance.gitAuthor, message: "Migrated Journal Entry", ); } diff --git a/lib/main.dart b/lib/main.dart index f97c71d5..aba4be93 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,12 +1,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:shared_preferences/shared_preferences.dart'; import 'package:flutter_crashlytics/flutter_crashlytics.dart'; - -import 'package:journal/app.dart'; -import 'package:journal/state_container.dart'; import 'package:journal/apis/git.dart'; +import 'package:journal/app.dart'; +import 'package:journal/settings.dart'; +import 'package:journal/state_container.dart'; +import 'package:shared_preferences/shared_preferences.dart'; void main() async { bool isInDebugMode = true; @@ -58,6 +58,8 @@ Future runJournalApp() async { var dir = await getGitBaseDirectory(); + await Settings.instance.load(); + runApp(new StateContainer( localGitRepoConfigured: localGitRepoConfigured, remoteGitRepoConfigured: remoteGitRepoConfigured, diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 3d4a846a..cb6dc541 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:package_info/package_info.dart'; - import 'package:journal/app.dart'; +import 'package:journal/settings.dart'; +import 'package:package_info/package_info.dart'; class SettingsScreen extends StatelessWidget { @override @@ -29,10 +29,14 @@ class SettingsList extends StatefulWidget { } class SettingsListState extends State { + final gitAuthorKey = GlobalKey>(); + final gitAuthorEmailKey = GlobalKey>(); + @override Widget build(BuildContext context) { var gitAuthorForm = Form( child: TextFormField( + key: gitAuthorKey, style: Theme.of(context).textTheme.title, decoration: const InputDecoration( icon: Icon(Icons.person), @@ -46,14 +50,27 @@ class SettingsListState extends State { } }, textInputAction: TextInputAction.done, - onFieldSubmitted: (String _) {}, - initialValue: - JournalApp.preferences.getString("gitAuthor") ?? "GitJournal", + onFieldSubmitted: (String gitAuthor) { + Settings.instance.gitAuthor = gitAuthor; + Settings.instance.save(); + }, + onSaved: (String gitAuthor) { + Settings.instance.gitAuthor = gitAuthor; + Settings.instance.save(); + }, + initialValue: Settings.instance.gitAuthor, ), + onChanged: () { + if (!gitAuthorKey.currentState.validate()) return; + var gitAuthor = gitAuthorKey.currentState.value; + Settings.instance.gitAuthor = gitAuthor; + Settings.instance.save(); + }, ); var gitAuthorEmailForm = Form( child: TextFormField( + key: gitAuthorEmailKey, style: Theme.of(context).textTheme.title, decoration: const InputDecoration( icon: Icon(Icons.email), @@ -65,12 +82,30 @@ class SettingsListState extends State { if (value.isEmpty) { return 'Please enter an email'; } + + bool emailValid = + RegExp(r"^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+").hasMatch(value); + if (!emailValid) { + return 'Please enter a valid email'; + } }, textInputAction: TextInputAction.done, - onFieldSubmitted: (String _) {}, - initialValue: JournalApp.preferences.getString("gitAuthorEmail") ?? - "app@gitjournal.io", + onFieldSubmitted: (String gitAuthorEmail) { + Settings.instance.gitAuthorEmail = gitAuthorEmail; + Settings.instance.save(); + }, + onSaved: (String gitAuthorEmail) { + Settings.instance.gitAuthorEmail = gitAuthorEmail; + Settings.instance.save(); + }, + initialValue: Settings.instance.gitAuthorEmail, ), + onChanged: () { + if (!gitAuthorEmailKey.currentState.validate()) return; + var gitAuthorEmail = gitAuthorEmailKey.currentState.value; + Settings.instance.gitAuthorEmail = gitAuthorEmail; + Settings.instance.save(); + }, ); var listView = ListView(children: [ diff --git a/lib/settings.dart b/lib/settings.dart new file mode 100644 index 00000000..5b220e4c --- /dev/null +++ b/lib/settings.dart @@ -0,0 +1,24 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +class Settings { + // singleton + static final Settings _singleton = Settings._internal(); + factory Settings() => _singleton; + Settings._internal(); + static Settings get instance => _singleton; + + Future load() async { + var pref = await SharedPreferences.getInstance(); + gitAuthor = pref.getString("gitAuthor") ?? gitAuthor; + gitAuthorEmail = pref.getString("gitAuthorEmail") ?? gitAuthorEmail; + } + + Future save() async { + var pref = await SharedPreferences.getInstance(); + pref.setString("gitAuthor", gitAuthor); + pref.setString("gitAuthorEmail", gitAuthorEmail); + } + + String gitAuthor = "GitJournal"; + String gitAuthorEmail = "app@gitjournal.io"; +} diff --git a/lib/storage/git_storage.dart b/lib/storage/git_storage.dart index 2de582f9..3e639526 100644 --- a/lib/storage/git_storage.dart +++ b/lib/storage/git_storage.dart @@ -1,17 +1,16 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; -import 'package:path/path.dart' as p; - -import 'package:journal/note.dart'; import 'package:journal/apis/git.dart'; -import 'package:journal/storage/serializers.dart'; +import 'package:journal/note.dart'; +import 'package:journal/settings.dart'; import 'package:journal/storage/file_storage.dart'; import 'package:journal/storage/notes_repository.dart'; +import 'package:journal/storage/serializers.dart'; +import 'package:path/path.dart' as p; class GitNoteRepository implements NoteRepository { final FileStorage _fileStorage; - //final String gitCloneUrl = ""; final String dirName; bool cloned = false; @@ -42,8 +41,8 @@ class GitNoteRepository implements NoteRepository { await gitAdd(this.dirName, filePath); await gitCommit( gitFolder: this.dirName, - authorEmail: "app@gitjournal.io", - authorName: "GitJournal", + authorEmail: Settings.instance.gitAuthorEmail, + authorName: Settings.instance.gitAuthor, message: commitMessage, ); @@ -64,8 +63,8 @@ class GitNoteRepository implements NoteRepository { await gitRm(this.dirName, filePath); await gitCommit( gitFolder: this.dirName, - authorEmail: "app@gitjournal.io", - authorName: "GitJournal", + authorEmail: Settings.instance.gitAuthorEmail, + authorName: Settings.instance.gitAuthor, message: "Removed Journal entry", );