mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 16:46:51 +08:00
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:
@ -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(),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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");
|
||||
|
Reference in New Issue
Block a user