mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 02:07:39 +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>(
|
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(),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
Reference in New Issue
Block a user