Hookup the Repository Manager to the AppDrawer

This makes multi repo support somewhat work. We still have some problems
with the old state not being clearer which I cannot seem to figure out.
This commit is contained in:
Vishesh Handa
2021-02-19 09:53:30 +01:00
parent 88c64d738d
commit b5d5705f82
4 changed files with 95 additions and 54 deletions

View File

@ -64,9 +64,12 @@ class JournalApp extends StatefulWidget {
child: Consumer<GitJournalRepo>( child: Consumer<GitJournalRepo>(
builder: (_, repo, __) => ChangeNotifierProvider<Settings>.value( builder: (_, repo, __) => ChangeNotifierProvider<Settings>.value(
value: repo.settings, value: repo.settings,
child: ChangeNotifierProvider<NotesFolderFS>.value( child: Consumer<GitJournalRepo>(
child: JournalApp(), builder: (_, repo, __) =>
ChangeNotifierProvider<NotesFolderFS>.value(
value: repo.notesFolder, value: repo.notesFolder,
child: JournalApp(),
),
), ),
), ),
), ),

View File

@ -7,33 +7,13 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:gitjournal/repository.dart'; import 'package:gitjournal/repository.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
import 'package:gitjournal/utils/logger.dart';
class RepositoryInfo {
String id;
String folderName;
// IconData iconData;
RepositoryInfo.fromMap(Map<String, dynamic> map) {
id = map['id'];
folderName = map['folderName'];
// iconData = IconData(map['iconData'] as int);
}
Map<String, dynamic> 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 { class RepositoryManager with ChangeNotifier {
List<String> repoIds; var repoIds = <String>[];
String currentId; var currentId = DEFAULT_ID;
GitJournalRepo _repo; GitJournalRepo _repo;
RepositoryInfo _repoInfo;
final String gitBaseDir; final String gitBaseDir;
final String cacheDir; final String cacheDir;
@ -44,18 +24,14 @@ class RepositoryManager with ChangeNotifier {
@required this.cacheDir, @required this.cacheDir,
@required this.pref, @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; GitJournalRepo get currentRepo => _repo;
RepositoryInfo get currentRepoInfo => _repoInfo;
Future<GitJournalRepo> buildActiveRepository() async { Future<GitJournalRepo> buildActiveRepository() async {
if (_repo != null) {
return _repo;
}
currentId ??= DEFAULT_ID;
var repoCacheDir = p.join(cacheDir, currentId); var repoCacheDir = p.join(cacheDir, currentId);
await Directory(repoCacheDir).create(recursive: true); await Directory(repoCacheDir).create(recursive: true);
@ -70,16 +46,46 @@ class RepositoryManager with ChangeNotifier {
return _repo; return _repo;
} }
Future<void> buildRepoInfoList() async { String repoFolderName(String id) {
// Add the latest folder, sort return pref.getString(id + "_" + FOLDER_NAME_KEY) ?? "journal";
// No need to do anything else
} }
// call notifyObservers(); Future<String> addRepo() async {
// --> After that what? int i = repoIds.length;
while (repoIds.contains(i.toString())) {
// addRepo(info) -> id i++;
// 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<void> _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<void> setCurrentRepo(String id) async {
assert(repoIds.contains(id));
currentId = id;
await _save();
Log.i("Switching to repo with id: $id");
await buildActiveRepository();
}
} }

View File

@ -14,6 +14,7 @@ import 'package:gitjournal/folder_views/common.dart';
import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/screens/note_editor.dart';
const DEFAULT_ID = "0"; const DEFAULT_ID = "0";
const FOLDER_NAME_KEY = "remoteGitRepoPath";
class Settings extends ChangeNotifier { class Settings extends ChangeNotifier {
Settings(this.id); Settings(this.id);
@ -142,7 +143,7 @@ class Settings extends ChangeNotifier {
_getStringList(pref, "inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes; _getStringList(pref, "inlineTagPrefixes")?.toSet() ?? inlineTagPrefixes;
// From AppState // From AppState
folderName = _getString(pref, "remoteGitRepoPath") ?? folderName; folderName = _getString(pref, FOLDER_NAME_KEY) ?? folderName;
sshPublicKey = _getString(pref, "sshPublicKey") ?? sshPublicKey; sshPublicKey = _getString(pref, "sshPublicKey") ?? sshPublicKey;
sshPrivateKey = _getString(pref, "sshPrivateKey") ?? sshPrivateKey; sshPrivateKey = _getString(pref, "sshPrivateKey") ?? sshPrivateKey;
@ -263,8 +264,7 @@ class Settings extends ChangeNotifier {
await _setInt(pref, "settingsVersion", version, defaultSet.version); await _setInt(pref, "settingsVersion", version, defaultSet.version);
await _setString( await _setString(pref, FOLDER_NAME_KEY, folderName, defaultSet.folderName);
pref, "remoteGitRepoPath", folderName, defaultSet.folderName);
notifyListeners(); notifyListeners();
} }

View File

@ -14,6 +14,7 @@ import 'package:url_launcher/url_launcher.dart';
import 'package:gitjournal/analytics.dart'; import 'package:gitjournal/analytics.dart';
import 'package:gitjournal/app_settings.dart'; import 'package:gitjournal/app_settings.dart';
import 'package:gitjournal/repository.dart'; import 'package:gitjournal/repository.dart';
import 'package:gitjournal/repository_manager.dart';
import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils.dart';
import 'package:gitjournal/utils/logger.dart'; import 'package:gitjournal/utils/logger.dart';
import 'package:gitjournal/widgets/app_drawer_header.dart'; import 'package:gitjournal/widgets/app_drawer_header.dart';
@ -56,23 +57,21 @@ class _AppDrawerState extends State<AppDrawer>
Widget _buildRepoList() { Widget _buildRepoList() {
var divider = Row(children: <Widget>[const Expanded(child: Divider())]); var divider = Row(children: <Widget>[const Expanded(child: Divider())]);
var repoManager = context.watch<RepositoryManager>();
var repoIds = repoManager.repoIds;
Widget w = Column( Widget w = Column(
children: <Widget>[ children: <Widget>[
const SizedBox(height: 8), const SizedBox(height: 8),
_buildDrawerTile( for (var id in repoIds) RepoTile(id),
context,
icon: FontAwesomeIcons.book,
isFontAwesome: true,
title: 'journal',
onTap: () => _navTopLevel(context, '/login'),
selected: false,
),
_buildDrawerTile( _buildDrawerTile(
context, context,
icon: Icons.add, icon: Icons.add,
title: 'Add Repository', title: 'Add Repository',
onTap: () => _navTopLevel(context, '/login'), onTap: () {
repoManager.addRepo();
Navigator.pop(context);
},
selected: false, selected: false,
), ),
divider, divider,
@ -338,6 +337,39 @@ class _AppDrawerState extends State<AppDrawer>
} }
} }
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<RepositoryManager>();
// 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) { void _navTopLevel(BuildContext context, String toRoute) {
var fromRoute = ModalRoute.of(context).settings.name; var fromRoute = ModalRoute.of(context).settings.name;
Log.i("Routing from $fromRoute -> $toRoute"); Log.i("Routing from $fromRoute -> $toRoute");