1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-25 06:19:22 +00:00
comunicmobile/lib/ui/routes/settings/general_account_settings.dart

260 lines
7.6 KiB
Dart
Raw Normal View History

2020-04-27 16:44:41 +00:00
import 'package:comunic/enums/user_page_visibility.dart';
2021-03-14 17:15:38 +00:00
import 'package:comunic/helpers/serialization/user_list_serialization_helper.dart';
2021-04-16 06:14:19 +00:00
import 'package:comunic/helpers/server_config_helper.dart';
2020-04-27 11:27:37 +00:00
import 'package:comunic/helpers/settings_helper.dart';
import 'package:comunic/models/general_settings.dart';
2020-04-27 16:44:41 +00:00
import 'package:comunic/ui/dialogs/multi_choices_dialog.dart';
2020-04-28 15:52:22 +00:00
import 'package:comunic/ui/dialogs/virtual_directory_dialog.dart';
2020-04-27 11:27:37 +00:00
import 'package:comunic/ui/widgets/async_screen_widget.dart';
2021-02-12 21:36:22 +00:00
import 'package:comunic/ui/widgets/settings/header_spacer_section.dart';
2020-05-01 18:55:24 +00:00
import 'package:comunic/ui/widgets/settings/multi_choices_settings_tile.dart';
2020-04-27 11:27:37 +00:00
import 'package:comunic/ui/widgets/settings/text_settings_edit_tile.dart';
import 'package:comunic/utils/account_utils.dart';
2020-04-27 17:05:36 +00:00
import 'package:comunic/utils/input_utils.dart';
2020-04-27 11:27:37 +00:00
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';
import 'package:settings_ui/settings_ui.dart';
/// General account settings
///
/// @author Pierre HUBERT
2020-05-13 16:12:45 +00:00
class GeneralAccountSettingsScreen extends StatefulWidget {
2020-04-27 11:27:37 +00:00
@override
2020-05-13 16:12:45 +00:00
_GeneralAccountSettingsScreenState createState() =>
_GeneralAccountSettingsScreenState();
2020-04-27 11:27:37 +00:00
}
2020-05-13 16:12:45 +00:00
class _GeneralAccountSettingsScreenState
extends State<GeneralAccountSettingsScreen> {
2020-04-27 11:27:37 +00:00
GeneralSettings _settings;
final _key = GlobalKey<AsyncScreenWidgetState>();
2020-04-27 11:34:25 +00:00
@override
void dispose() {
// Remove current user information to force refresh of account image
2021-03-14 17:15:38 +00:00
UsersListSerialisationHelper().removeUserByID(userID());
2020-04-27 11:34:25 +00:00
super.dispose();
}
2020-04-27 11:27:37 +00:00
@override
Widget build(BuildContext context) {
return AsyncScreenWidget(
key: _key,
onReload: () async =>
_settings = await SettingsHelper.getGeneralSettings(),
onBuild: _buildSettings,
errorMessage: tr("Could not load general settings!"),
showOldDataWhileUpdating: true,
);
2020-04-27 11:27:37 +00:00
}
Widget _buildSettings() {
return SettingsList(
sections: [
2021-02-12 21:36:22 +00:00
HeadSpacerSection(),
2020-04-27 11:27:37 +00:00
SettingsSection(
title: tr("Main account information"),
tiles: _mainInformationTiles(),
2020-04-27 16:44:41 +00:00
),
SettingsSection(
title: tr("Your page settings"),
tiles: _pageSettingsTiles(),
2020-04-27 11:27:37 +00:00
)
],
);
}
List<SettingsTile> _mainInformationTiles() {
return [
SettingsTile(
title: tr("User ID"),
subtitle: "${userID()}",
),
SettingsTile(
title: tr("Email address"),
subtitle: _settings.email,
),
// First name
TextEditSettingsTile(
title: tr("First name"),
currValue: _settings.firstName,
onChanged: (s) {
_settings.firstName = s;
_updateSettings();
},
2021-04-16 06:14:19 +00:00
maxLength: srvConfig.accountInformationPolicy.maxFirstNameLength,
checkInput: (s) =>
s.length >= srvConfig.accountInformationPolicy.minFirstNameLength,
2020-04-27 11:27:37 +00:00
),
// Last name
TextEditSettingsTile(
title: tr("Last name"),
currValue: _settings.lastName,
onChanged: (s) {
_settings.lastName = s;
_updateSettings();
},
2021-04-16 06:14:19 +00:00
maxLength: srvConfig.accountInformationPolicy.maxLastNameLength,
checkInput: (s) =>
s.length >= srvConfig.accountInformationPolicy.minLastNameLength,
2020-04-27 11:27:37 +00:00
),
2020-04-27 11:37:43 +00:00
// Emails settings
SettingsTile.switchTile(
title: tr("Allow comunic to send emails"),
onToggle: (s) {
_settings.allowComunicEmails = s;
_updateSettings();
},
2021-04-17 06:40:33 +00:00
titleMaxLines: 2,
2020-04-27 11:37:43 +00:00
switchValue: _settings.allowComunicEmails,
),
2020-04-27 11:27:37 +00:00
];
}
2020-04-27 16:44:41 +00:00
List<MultiChoiceEntry> get _visibilityChoices => [
MultiChoiceEntry(
id: UserPageVisibility.PRIVATE,
title: tr("Private"),
subtitle: tr("Private, accessible only to your friends")),
MultiChoiceEntry(
id: UserPageVisibility.PUBLIC,
title: tr("Public"),
subtitle: tr("Public, accessible to all Comunic members")),
MultiChoiceEntry(
id: UserPageVisibility.OPEN,
title: tr("Open"),
subtitle:
tr("Accessible to everyone, including non-Comunic users")),
];
/// Build page settings tile
List<SettingsTile> _pageSettingsTiles() {
return [
// Page visibility
2020-05-01 18:55:24 +00:00
MultiChoicesSettingsTile(
title: tr("Page visibility"),
choices: _visibilityChoices,
currentValue: _settings.pageVisibility,
onChanged: (v) {
_settings.pageVisibility = v;
_updateSettings();
}),
2020-04-27 16:51:54 +00:00
// Allow comments on user page ?
SettingsTile.switchTile(
title: tr("Allow comments on your page"),
onToggle: (v) {
_settings.allowComments = v;
_updateSettings();
},
switchValue: _settings.allowComments,
2021-04-17 06:40:33 +00:00
titleMaxLines: 2,
2020-04-27 16:51:54 +00:00
),
// Allow posts from friends
SettingsTile.switchTile(
title: tr("Allow posts from your friends on your page"),
onToggle: (v) {
_settings.allowPostsFromFriends = v;
_updateSettings();
},
switchValue: _settings.allowPostsFromFriends,
2021-04-17 06:30:00 +00:00
titleMaxLines: 2,
),
// Make friends list public
SettingsTile.switchTile(
title: tr("Make your friends list public"),
onToggle: (v) {
_settings.publicFriendsList = v;
_updateSettings();
},
switchValue: _settings.publicFriendsList,
),
2020-04-27 17:05:36 +00:00
2021-04-17 06:30:00 +00:00
// Make email address public
SettingsTile.switchTile(
title: tr("Make your email address public"),
onToggle: (v) {
_settings.publicEmail = v;
_updateSettings();
},
switchValue: _settings.publicEmail,
),
2020-04-27 17:05:36 +00:00
// Personal website
TextEditSettingsTile(
2020-04-27 17:21:30 +00:00
title: tr("Personal website URL (optional)"),
2020-04-27 17:05:36 +00:00
currValue: _settings.personalWebsite,
onChanged: (v) {
_settings.personalWebsite = v;
_updateSettings();
},
checkInput: (s) => validateUrl(s),
allowEmptyValues: true,
2020-04-27 17:21:30 +00:00
),
2021-04-17 06:30:00 +00:00
// Location
TextEditSettingsTile(
title: tr("Location (optional)"),
currValue: _settings.location ?? "",
onChanged: (v) {
_settings.location = v;
_updateSettings();
},
maxLength: srvConfig.accountInformationPolicy.maxLocationLength,
allowEmptyValues: true,
),
2020-04-27 17:21:30 +00:00
// Public notes
TextEditSettingsTile(
title: tr("Public note (optional)"),
currValue: _settings.publicNote,
onChanged: (v) {
_settings.publicNote = v;
_updateSettings();
},
allowEmptyValues: true,
maxLength: 255,
maxLines: 3,
),
2020-04-28 15:52:22 +00:00
// Virtual directory
SettingsTile(
title: tr("Virtual directory (optional)"),
subtitle: _settings.virtualDirectory,
2021-02-07 16:09:08 +00:00
onPressed: (_) async {
2020-04-28 15:52:22 +00:00
final dir = await showVirtualDirectoryDialog(
context: context,
initialDirectory: _settings.virtualDirectory,
type: VirtualDirectoryTargetType.USER,
id: userID());
if (dir == null) return;
_settings.virtualDirectory = dir;
_updateSettings();
},
),
2020-04-27 16:44:41 +00:00
];
}
2020-04-27 11:27:37 +00:00
/// Apply new settings
Future<void> _updateSettings() async {
try {
await SettingsHelper.updateGeneralSettings(_settings);
} catch (e, stack) {
print("Error while updating settings! $e/n$stack");
showSimpleSnack(context, tr("Could not update general settings!"));
}
_key.currentState.refresh();
}
}