mirror of
https://github.com/immich-app/immich.git
synced 2025-01-04 02:46:47 +01:00
3a2e30e30e
* fix(mobile): make widgets rebuild on locale changes This will make the make the pages to instantly refresh the correct translated string, without the need to pop and push the settings page. * fix(mobile): set the default intl locale This is needed because across the app, you don't pass the context.locale to DateFormat, so by default it uses the system's locale. This will fix the issue without the need to refactor a lot of code. * feat(mobile): create localeProvider This provider can be used to refresh providers that provide UI elements and get cached. * fix(mobile): refresh asset providers on locale change This is necessary to update the locale on the already evaluated DateFormat. --------- Co-authored-by: Alex <alex.tran1502@gmail.com>
142 lines
4.6 KiB
Dart
142 lines
4.6 KiB
Dart
import 'package:auto_route/auto_route.dart';
|
|
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
|
import 'package:immich_mobile/widgets/settings/advanced_settings.dart';
|
|
import 'package:immich_mobile/widgets/settings/asset_list_settings/asset_list_settings.dart';
|
|
import 'package:immich_mobile/widgets/settings/asset_viewer_settings/asset_viewer_settings.dart';
|
|
import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart';
|
|
import 'package:immich_mobile/widgets/settings/language_settings.dart';
|
|
import 'package:immich_mobile/widgets/settings/notification_setting.dart';
|
|
import 'package:immich_mobile/widgets/settings/preference_settings/preference_setting.dart';
|
|
import 'package:immich_mobile/routing/router.dart';
|
|
|
|
enum SettingSection {
|
|
notifications(
|
|
'setting_notifications_title',
|
|
Icons.notifications_none_rounded,
|
|
),
|
|
languages('setting_languages_title', Icons.language),
|
|
preferences('preferences_settings_title', Icons.interests_outlined),
|
|
backup('backup_controller_page_backup', Icons.cloud_upload_outlined),
|
|
timeline('asset_list_settings_title', Icons.auto_awesome_mosaic_outlined),
|
|
viewer('asset_viewer_settings_title', Icons.image_outlined),
|
|
advanced('advanced_settings_tile_title', Icons.build_outlined);
|
|
|
|
final String title;
|
|
final IconData icon;
|
|
|
|
Widget get widget => switch (this) {
|
|
SettingSection.notifications => const NotificationSetting(),
|
|
SettingSection.languages => const LanguageSettings(),
|
|
SettingSection.preferences => const PreferenceSetting(),
|
|
SettingSection.backup => const BackupSettings(),
|
|
SettingSection.timeline => const AssetListSettings(),
|
|
SettingSection.viewer => const AssetViewerSettings(),
|
|
SettingSection.advanced => const AdvancedSettings(),
|
|
};
|
|
|
|
const SettingSection(this.title, this.icon);
|
|
}
|
|
|
|
@RoutePage()
|
|
class SettingsPage extends StatelessWidget {
|
|
const SettingsPage({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
context.locale;
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
centerTitle: false,
|
|
title: const Text('setting_pages_app_bar_settings').tr(),
|
|
),
|
|
body: context.isMobile ? _MobileLayout() : _TabletLayout(),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _MobileLayout extends StatelessWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ListView(
|
|
children: SettingSection.values
|
|
.map(
|
|
(s) => ListTile(
|
|
contentPadding:
|
|
const EdgeInsets.symmetric(vertical: 2.0, horizontal: 16.0),
|
|
leading: Icon(s.icon),
|
|
title: Padding(
|
|
padding: const EdgeInsets.only(left: 8.0),
|
|
child: Text(
|
|
s.title,
|
|
style: const TextStyle(
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
).tr(),
|
|
),
|
|
onTap: () => context.pushRoute(SettingsSubRoute(section: s)),
|
|
),
|
|
)
|
|
.toList(),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _TabletLayout extends HookWidget {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final selectedSection =
|
|
useState<SettingSection>(SettingSection.values.first);
|
|
|
|
return Row(
|
|
mainAxisAlignment: MainAxisAlignment.start,
|
|
children: [
|
|
Expanded(
|
|
flex: 2,
|
|
child: CustomScrollView(
|
|
slivers: SettingSection.values
|
|
.map(
|
|
(s) => SliverToBoxAdapter(
|
|
child: ListTile(
|
|
title: Text(s.title).tr(),
|
|
leading: Icon(s.icon),
|
|
selected: s.index == selectedSection.value.index,
|
|
selectedColor: context.primaryColor,
|
|
selectedTileColor: context.themeData.highlightColor,
|
|
onTap: () => selectedSection.value = s,
|
|
),
|
|
),
|
|
)
|
|
.toList(),
|
|
),
|
|
),
|
|
const VerticalDivider(width: 1),
|
|
Expanded(
|
|
flex: 4,
|
|
child: selectedSection.value.widget,
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
@RoutePage()
|
|
class SettingsSubPage extends StatelessWidget {
|
|
const SettingsSubPage(this.section, {super.key});
|
|
|
|
final SettingSection section;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
context.locale;
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
centerTitle: false,
|
|
title: Text(section.title).tr(),
|
|
),
|
|
body: section.widget,
|
|
);
|
|
}
|
|
}
|