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>(
builder: (_, repo, __) => ChangeNotifierProvider<Settings>.value(
value: repo.settings,
child: ChangeNotifierProvider<NotesFolderFS>.value(
child: JournalApp(),
value: repo.notesFolder,
child: Consumer<GitJournalRepo>(
builder: (_, repo, __) =>
ChangeNotifierProvider<NotesFolderFS>.value(
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/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 {
List<String> repoIds;
String currentId;
var repoIds = <String>[];
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<GitJournalRepo> 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<void> 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<String> 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<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';
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();
}

View File

@ -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<AppDrawer>
Widget _buildRepoList() {
var divider = Row(children: <Widget>[const Expanded(child: Divider())]);
var repoManager = context.watch<RepositoryManager>();
var repoIds = repoManager.repoIds;
Widget w = Column(
children: <Widget>[
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<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) {
var fromRoute = ModalRoute.of(context).settings.name;
Log.i("Routing from $fromRoute -> $toRoute");