diff --git a/lib/app.dart b/lib/app.dart index 0e63f3e5..c27f5db3 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -64,9 +64,12 @@ class JournalApp extends StatefulWidget { child: Consumer( builder: (_, repo, __) => ChangeNotifierProvider.value( value: repo.settings, - child: ChangeNotifierProvider.value( - child: JournalApp(), - value: repo.notesFolder, + child: Consumer( + builder: (_, repo, __) => + ChangeNotifierProvider.value( + value: repo.notesFolder, + child: JournalApp(), + ), ), ), ), diff --git a/lib/repository_manager.dart b/lib/repository_manager.dart index f5de0eb8..13229f61 100644 --- a/lib/repository_manager.dart +++ b/lib/repository_manager.dart @@ -7,33 +7,13 @@ import 'package:shared_preferences/shared_preferences.dart'; import 'package:gitjournal/repository.dart'; import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/utils/logger.dart'; -class RepositoryInfo { - String id; - String folderName; - // IconData iconData; - - RepositoryInfo.fromMap(Map map) { - id = map['id']; - folderName = map['folderName']; - // iconData = IconData(map['iconData'] as int); - } - - Map toMap() => { - 'id': id, - 'folderName': folderName, - // 'iconData': iconData.codePoint, - }; -} - -// Make this info a change notifier where the current value is ? -// -> things required to create the Repo? class RepositoryManager with ChangeNotifier { - List repoIds; - String currentId; + var repoIds = []; + var currentId = DEFAULT_ID; GitJournalRepo _repo; - RepositoryInfo _repoInfo; final String gitBaseDir; final String cacheDir; @@ -44,18 +24,14 @@ class RepositoryManager with ChangeNotifier { @required this.cacheDir, @required this.pref, }) { - // From the pref load all the RepositoryInfos + _load(); + Log.i("Repo Ids $repoIds"); + Log.i("Current Id $currentId"); } GitJournalRepo get currentRepo => _repo; - RepositoryInfo get currentRepoInfo => _repoInfo; Future buildActiveRepository() async { - if (_repo != null) { - return _repo; - } - - currentId ??= DEFAULT_ID; var repoCacheDir = p.join(cacheDir, currentId); await Directory(repoCacheDir).create(recursive: true); @@ -70,16 +46,46 @@ class RepositoryManager with ChangeNotifier { return _repo; } - Future buildRepoInfoList() async { - // Add the latest folder, sort - // No need to do anything else + String repoFolderName(String id) { + return pref.getString(id + "_" + FOLDER_NAME_KEY) ?? "journal"; } - // call notifyObservers(); - // --> After that what? + Future addRepo() async { + int i = repoIds.length; + while (repoIds.contains(i.toString())) { + i++; + } - // addRepo(info) -> id - // removeRepo(id) - // selectRepo(id) - // updateRepo(id, info) + var id = i.toString(); + repoIds.add(id); + currentId = id; + await _save(); + + // Generate a default folder name! + await pref.setString(id + "_" + FOLDER_NAME_KEY, "repo_$id"); + Log.i("Creating new repo with id: $id and folder: repo_$id"); + + await buildActiveRepository(); + + return id; + } + + Future _save() async { + await pref.setString("activeRepo", currentId); + await pref.setStringList("gitRepos", repoIds); + } + + void _load() { + currentId = pref.getString("activeRepo") ?? DEFAULT_ID; + repoIds = pref.getStringList("gitRepos") ?? [DEFAULT_ID]; + } + + Future setCurrentRepo(String id) async { + assert(repoIds.contains(id)); + currentId = id; + await _save(); + + Log.i("Switching to repo with id: $id"); + await buildActiveRepository(); + } } diff --git a/lib/settings.dart b/lib/settings.dart index 6426c215..230084db 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -14,6 +14,7 @@ import 'package:gitjournal/folder_views/common.dart'; import 'package:gitjournal/screens/note_editor.dart'; const DEFAULT_ID = "0"; +const FOLDER_NAME_KEY = "remoteGitRepoPath"; class Settings extends ChangeNotifier { Settings(this.id); @@ -142,7 +143,7 @@ class Settings extends ChangeNotifier { _getStringList(pref, "inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes; // From AppState - folderName = _getString(pref, "remoteGitRepoPath") ?? folderName; + folderName = _getString(pref, FOLDER_NAME_KEY) ?? folderName; sshPublicKey = _getString(pref, "sshPublicKey") ?? sshPublicKey; sshPrivateKey = _getString(pref, "sshPrivateKey") ?? sshPrivateKey; @@ -263,8 +264,7 @@ class Settings extends ChangeNotifier { await _setInt(pref, "settingsVersion", version, defaultSet.version); - await _setString( - pref, "remoteGitRepoPath", folderName, defaultSet.folderName); + await _setString(pref, FOLDER_NAME_KEY, folderName, defaultSet.folderName); notifyListeners(); } diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index 1fb4c4cf..2c89aded 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -14,6 +14,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/app_settings.dart'; import 'package:gitjournal/repository.dart'; +import 'package:gitjournal/repository_manager.dart'; import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils/logger.dart'; import 'package:gitjournal/widgets/app_drawer_header.dart'; @@ -56,23 +57,21 @@ class _AppDrawerState extends State Widget _buildRepoList() { var divider = Row(children: [const Expanded(child: Divider())]); + var repoManager = context.watch(); + var repoIds = repoManager.repoIds; Widget w = Column( children: [ const SizedBox(height: 8), - _buildDrawerTile( - context, - icon: FontAwesomeIcons.book, - isFontAwesome: true, - title: 'journal', - onTap: () => _navTopLevel(context, '/login'), - selected: false, - ), + for (var id in repoIds) RepoTile(id), _buildDrawerTile( context, icon: Icons.add, title: 'Add Repository', - onTap: () => _navTopLevel(context, '/login'), + onTap: () { + repoManager.addRepo(); + Navigator.pop(context); + }, selected: false, ), divider, @@ -338,6 +337,39 @@ class _AppDrawerState extends State } } +class RepoTile extends StatelessWidget { + const RepoTile( + this.id, { + Key key, + }) : super(key: key); + + final String id; + + @override + Widget build(BuildContext context) { + var theme = Theme.of(context); + var listTileTheme = ListTileTheme.of(context); + var repoManager = context.watch(); + + // FIXME: Improve marking the selected repo + var selected = repoManager.currentId == id; + var textStyle = theme.textTheme.bodyText1.copyWith( + color: selected ? theme.accentColor : listTileTheme.textColor, + ); + + var icon = FaIcon(FontAwesomeIcons.book, color: textStyle.color); + + return ListTile( + leading: icon, + title: Text(repoManager.repoFolderName(id)), + onTap: () { + repoManager.setCurrentRepo(id); + Navigator.pop(context); + }, + ); + } +} + void _navTopLevel(BuildContext context, String toRoute) { var fromRoute = ModalRoute.of(context).settings.name; Log.i("Routing from $fromRoute -> $toRoute");