mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-09 20:07:51 -06:00
feat: Externalize settings into LocalUserAppState, fix bugs
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user