feat: Externalize settings into LocalUserAppState, fix bugs

This commit is contained in:
Anton Stubenbord
2023-04-26 01:29:14 +02:00
parent 8c2a6928b4
commit 37c9559888
41 changed files with 340 additions and 316 deletions

View File

@@ -1,6 +1,15 @@
import 'package:hive/hive.dart';
import 'package:paperless_mobile/core/config/hive/hive_config.dart';
part 'view_type.g.dart';
@HiveType(typeId: HiveTypeIds.viewType)
enum ViewType {
@HiveField(0)
grid,
@HiveField(1)
list,
@HiveField(2)
detailed;
ViewType toggle() {

View File

@@ -9,7 +9,7 @@ import 'package:paperless_mobile/core/config/hive/hive_config.dart';
import 'package:paperless_mobile/extensions/flutter_extensions.dart';
import 'package:paperless_mobile/features/login/cubit/authentication_cubit.dart';
import 'package:paperless_mobile/features/login/model/login_form_credentials.dart';
import 'package:paperless_mobile/core/database/tables/user_account.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/features/login/view/login_page.dart';
import 'package:paperless_mobile/core/database/tables/global_settings.dart';
import 'package:paperless_mobile/features/settings/view/dialogs/switch_account_dialog.dart';
@@ -26,7 +26,7 @@ class ManageAccountsPage extends StatelessWidget {
return GlobalSettingsBuilder(
builder: (context, globalSettings) {
return ValueListenableBuilder(
valueListenable: Hive.box<UserAccount>(HiveBoxes.userAccount).listenable(),
valueListenable: Hive.box<LocalUserAccount>(HiveBoxes.localUserAccount).listenable(),
builder: (context, box, _) {
final userIds = box.keys.toList().cast<String>();
final otherAccounts = userIds
@@ -68,7 +68,7 @@ class ManageAccountsPage extends StatelessWidget {
title: Text(S.of(context)!.addAccount),
leading: const Icon(Icons.person_add),
onTap: () {
_onAddAccount(context);
_onAddAccount(context, globalSettings.currentLoggedInUser!);
},
),
],
@@ -82,7 +82,7 @@ class ManageAccountsPage extends StatelessWidget {
Widget _buildAccountTile(
BuildContext context,
String userId,
UserAccount account,
LocalUserAccount account,
GlobalSettings settings,
) {
final isLoggedIn = userId == settings.currentLoggedInUser;
@@ -147,16 +147,7 @@ class ManageAccountsPage extends StatelessWidget {
onSelected: (value) async {
if (value == 0) {
// Switch
final navigator = Navigator.of(context);
if (settings.currentLoggedInUser == userId) return;
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const SwitchingAccountsPage(),
),
);
await context.read<AuthenticationCubit>().switchAccount(userId);
navigator.popUntil((route) => route.isFirst);
_onSwitchAccount(context, settings.currentLoggedInUser!, userId);
} else if (value == 1) {
// Remove
final shouldPop = userId == settings.currentLoggedInUser;
@@ -177,7 +168,7 @@ class ManageAccountsPage extends StatelessWidget {
return child;
}
Future<void> _onAddAccount(BuildContext context) async {
Future<void> _onAddAccount(BuildContext context, String currentUser) async {
final userId = await Navigator.push(
context,
MaterialPageRoute(
@@ -207,9 +198,21 @@ class ManageAccountsPage extends StatelessWidget {
) ??
false;
if (shoudSwitch) {
await context.read<AuthenticationCubit>().switchAccount(userId);
Navigator.pop(context);
_onSwitchAccount(context, currentUser, userId);
}
}
}
_onSwitchAccount(BuildContext context, String currentUser, String newUser) async {
final navigator = Navigator.of(context);
if (currentUser == newUser) return;
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => const SwitchingAccountsPage(),
),
);
await context.read<AuthenticationCubit>().switchAccount(newUser);
navigator.popUntil((route) => route.isFirst);
}
}

View File

@@ -1,9 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:paperless_mobile/core/bloc/paperless_server_information_cubit.dart';
import 'package:paperless_mobile/core/bloc/paperless_server_information_state.dart';
import 'package:paperless_mobile/core/bloc/server_information_cubit.dart';
import 'package:paperless_mobile/core/bloc/server_information_state.dart';
import 'package:paperless_mobile/features/settings/view/pages/application_settings_page.dart';
import 'package:paperless_mobile/features/settings/view/pages/security_settings_page.dart';
import 'package:paperless_mobile/features/settings/view/widgets/user_settings_builder.dart';
import 'package:paperless_mobile/generated/l10n/app_localizations.dart';
class SettingsPage extends StatelessWidget {
@@ -15,23 +16,27 @@ class SettingsPage extends StatelessWidget {
appBar: AppBar(
title: Text(S.of(context)!.settings),
),
bottomNavigationBar:
BlocBuilder<PaperlessServerInformationCubit, PaperlessServerInformationState>(
builder: (context, state) {
final info = state.information!;
bottomNavigationBar: UserAccountBuilder(
builder: (context, user) {
assert(user != null);
final host = user!.serverUrl.replaceFirst(RegExp(r"https?://"), "");
return ListTile(
title: Text(
S.of(context)!.loggedInAs(info.username ?? 'unknown') + "@${info.host}",
S.of(context)!.loggedInAs(user.username) + "@$host",
style: Theme.of(context).textTheme.labelSmall,
textAlign: TextAlign.center,
),
subtitle: Text(
S.of(context)!.paperlessServerVersion +
' ' +
info.version.toString() +
' (API v${info.apiVersion})',
style: Theme.of(context).textTheme.labelSmall,
textAlign: TextAlign.center,
subtitle: BlocBuilder<ServerInformationCubit, ServerInformationState>(
builder: (context, state) {
return Text(
S.of(context)!.paperlessServerVersion +
' ' +
state.information!.version.toString() +
' (API v${state.information!.apiVersion})',
style: Theme.of(context).textTheme.labelSmall,
textAlign: TextAlign.center,
);
},
),
);
},

View File

@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:paperless_mobile/core/database/tables/user_account.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
class UserAvatar extends StatelessWidget {
final String userId;
final UserAccount account;
final LocalUserAccount account;
const UserAvatar({
super.key,
required this.userId,

View File

@@ -1,14 +1,14 @@
import 'package:flutter/material.dart';
import 'package:hive_flutter/adapters.dart';
import 'package:paperless_mobile/core/config/hive/hive_config.dart';
import 'package:paperless_mobile/core/database/tables/user_account.dart';
import 'package:paperless_mobile/core/database/tables/local_user_account.dart';
import 'package:paperless_mobile/core/database/tables/global_settings.dart';
import 'package:paperless_mobile/core/database/tables/user_settings.dart';
import 'package:paperless_mobile/core/database/tables/local_user_settings.dart';
class UserAccountBuilder extends StatelessWidget {
final Widget Function(
BuildContext context,
UserAccount? settings,
LocalUserAccount? settings,
) builder;
const UserAccountBuilder({
@@ -18,8 +18,8 @@ class UserAccountBuilder extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ValueListenableBuilder<Box<UserAccount>>(
valueListenable: Hive.box<UserAccount>(HiveBoxes.userAccount).listenable(),
return ValueListenableBuilder<Box<LocalUserAccount>>(
valueListenable: Hive.box<LocalUserAccount>(HiveBoxes.localUserAccount).listenable(),
builder: (context, accountBox, _) {
final currentUser =
Hive.box<GlobalSettings>(HiveBoxes.globalSettings).getValue()!.currentLoggedInUser;