Skip to content

Commit 53e1a88

Browse files
author
dvbthien
committed
improve: split widgets to reduce rebuilds when settings change
1 parent 5964ece commit 53e1a88

19 files changed

+602
-436
lines changed

mobile/lib/pages/common/settings.page.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart';
55
import 'package:immich_mobile/extensions/theme_extensions.dart';
66
import 'package:immich_mobile/extensions/translate_extensions.dart';
77
import 'package:immich_mobile/utils/fade_on_tap.dart';
8-
import 'package:immich_mobile/widgets/settings/advanced_settings.dart';
8+
import 'package:immich_mobile/widgets/settings/advanced_settings/advanced_settings.dart';
99
import 'package:immich_mobile/widgets/settings/asset_list_settings/asset_list_settings.dart';
1010
import 'package:immich_mobile/widgets/settings/asset_viewer_settings/asset_viewer_settings.dart';
1111
import 'package:immich_mobile/widgets/settings/backup_settings/backup_settings.dart';

mobile/lib/widgets/settings/advanced_settings.dart

Lines changed: 0 additions & 178 deletions
This file was deleted.
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import 'dart:io';
2+
3+
import 'package:device_info_plus/device_info_plus.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter_hooks/flutter_hooks.dart' hide Store;
6+
import 'package:hooks_riverpod/hooks_riverpod.dart';
7+
8+
import 'package:immich_mobile/widgets/settings/advanced_settings/alternate_media_filter.dart';
9+
import 'package:immich_mobile/widgets/settings/advanced_settings/log_level_setting.dart';
10+
import 'package:immich_mobile/widgets/settings/advanced_settings/remote_image_preference.dart';
11+
import 'package:immich_mobile/widgets/settings/advanced_settings/self_signed_ssl_cert.dart';
12+
import 'package:immich_mobile/widgets/settings/advanced_settings/sync_remote_deletions.dart';
13+
import 'package:immich_mobile/widgets/settings/advanced_settings/troubleshooting_setting.dart';
14+
import 'package:immich_mobile/widgets/settings/advanced_settings/local_storage_settings.dart';
15+
import 'package:immich_mobile/widgets/settings/advanced_settings/ssl_client_cert_settings.dart';
16+
import 'package:immich_mobile/widgets/settings/core/setting_section_header.dart';
17+
import 'package:immich_mobile/widgets/settings/custom_proxy_headers_settings/custom_proxy_headers_settings.dart';
18+
import 'package:immich_mobile/widgets/settings/layouts/settings_card_layout.dart';
19+
import 'package:immich_mobile/widgets/settings/layouts/settings_sub_page_scaffold.dart';
20+
21+
class AdvancedSettings extends HookConsumerWidget {
22+
const AdvancedSettings({super.key});
23+
24+
static Future<bool> _checkAndroidVersion() async {
25+
if (Platform.isAndroid) {
26+
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
27+
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
28+
int sdkVersion = androidInfo.version.sdkInt;
29+
return sdkVersion >= 31;
30+
}
31+
return false;
32+
}
33+
34+
@override
35+
Widget build(BuildContext context, WidgetRef ref) {
36+
final isAndroid31Plus = useFuture(useMemoized(_checkAndroidVersion, []));
37+
38+
final advancedSettings = [
39+
const SettingsCardLayout(
40+
header: SettingSectionHeader(
41+
title: "Placeholder",
42+
),
43+
children: [
44+
TroubleshootingSetting(),
45+
LogLevelSetting(),
46+
],
47+
),
48+
if (isAndroid31Plus.hasData && isAndroid31Plus.data == true)
49+
const SyncRemoteDeletionsSetting(),
50+
const RemoteImagePreferenceSetting(),
51+
const LocalStorageSettings(),
52+
const SelfSignedSSLCertSetting(),
53+
const SslClientCertSettings(),
54+
const CustomProxyHeaderSettings(),
55+
const AlternateMediaFilterSetting(),
56+
];
57+
58+
return SettingsSubPageScaffold(settings: advancedSettings);
59+
}
60+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:hooks_riverpod/hooks_riverpod.dart';
3+
import 'package:immich_mobile/extensions/translate_extensions.dart';
4+
import 'package:immich_mobile/services/app_settings.service.dart';
5+
import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart';
6+
import 'package:immich_mobile/widgets/settings/core/setting_section_header.dart';
7+
import 'package:immich_mobile/widgets/settings/core/setting_switch_list_tile.dart';
8+
import 'package:immich_mobile/widgets/settings/layouts/settings_card_layout.dart';
9+
10+
class AlternateMediaFilterSetting extends HookConsumerWidget {
11+
const AlternateMediaFilterSetting({
12+
super.key,
13+
});
14+
15+
@override
16+
Widget build(BuildContext context, WidgetRef ref) {
17+
final useAlternatePMFilter =
18+
useAppSettingsState(AppSettingsEnum.photoManagerCustomFilter);
19+
20+
return SettingsCardLayout(
21+
header: const SettingSectionHeader(
22+
title: "Placeholder",
23+
),
24+
children: [
25+
SettingSwitchListTile(
26+
valueNotifier: useAlternatePMFilter,
27+
title: 'advanced_settings_enable_alternate_media_filter_title'
28+
.t(context: context),
29+
subtitle: 'advanced_settings_enable_alternate_media_filter_subtitle'
30+
.t(context: context),
31+
),
32+
],
33+
);
34+
}
35+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_hooks/flutter_hooks.dart' show useEffect, useState;
3+
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/entities/duplicated_asset.entity.dart';
5+
import 'package:immich_mobile/extensions/build_context_extensions.dart';
6+
import 'package:immich_mobile/extensions/theme_extensions.dart';
7+
import 'package:immich_mobile/extensions/translate_extensions.dart';
8+
import 'package:immich_mobile/providers/db.provider.dart';
9+
import 'package:immich_mobile/widgets/settings/core/setting_section_header.dart';
10+
import 'package:immich_mobile/widgets/settings/layouts/settings_card_layout.dart';
11+
12+
class LocalStorageSettings extends HookConsumerWidget {
13+
const LocalStorageSettings({super.key});
14+
@override
15+
Widget build(BuildContext context, WidgetRef ref) {
16+
final isarDb = ref.watch(dbProvider);
17+
final cacheItemCount = useState(0);
18+
19+
useEffect(
20+
() {
21+
cacheItemCount.value = isarDb.duplicatedAssets.countSync();
22+
return null;
23+
},
24+
[],
25+
);
26+
27+
void clearCache() async {
28+
await isarDb.writeTxn(() => isarDb.duplicatedAssets.clear());
29+
cacheItemCount.value = await isarDb.duplicatedAssets.count();
30+
}
31+
32+
return SettingsCardLayout(
33+
header: const SettingSectionHeader(
34+
title: "Placeholder",
35+
),
36+
children: [
37+
ListTile(
38+
contentPadding: EdgeInsets.zero,
39+
title: Text(
40+
'cache_settings_duplicated_assets_title'
41+
.t(context: context, args: {'count': cacheItemCount.value}),
42+
style: context.textTheme.bodyLarge?.copyWith(
43+
fontWeight: FontWeight.w500,
44+
color: context.colorScheme.onSurface,
45+
letterSpacing: 0,
46+
),
47+
),
48+
subtitle: Text(
49+
'cache_settings_duplicated_assets_subtitle'.t(context: context),
50+
style: context.textTheme.bodyMedium?.copyWith(
51+
color: context.colorScheme.onSurfaceSecondary,
52+
height: 1.4,
53+
letterSpacing: 0,
54+
),
55+
),
56+
trailing: TextButton(
57+
onPressed: cacheItemCount.value > 0 ? clearCache : null,
58+
child: Text(
59+
'cache_settings_duplicated_assets_clear_button'
60+
.t(context: context),
61+
style: TextStyle(
62+
fontSize: 12,
63+
color: cacheItemCount.value > 0
64+
? context.colorScheme.error
65+
: context.themeData.disabledColor,
66+
fontWeight: FontWeight.bold,
67+
),
68+
),
69+
),
70+
),
71+
],
72+
);
73+
}
74+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_hooks/flutter_hooks.dart';
3+
import 'package:hooks_riverpod/hooks_riverpod.dart';
4+
import 'package:immich_mobile/domain/services/log.service.dart';
5+
import 'package:immich_mobile/extensions/translate_extensions.dart';
6+
import 'package:immich_mobile/services/app_settings.service.dart';
7+
import 'package:immich_mobile/utils/hooks/app_settings_update_hook.dart';
8+
import 'package:immich_mobile/widgets/settings/core/setting_slider_list_tile.dart';
9+
import 'package:logging/logging.dart';
10+
11+
class LogLevelSetting extends HookConsumerWidget {
12+
const LogLevelSetting({
13+
super.key,
14+
});
15+
16+
@override
17+
Widget build(BuildContext context, WidgetRef ref) {
18+
final levelId = useAppSettingsState(AppSettingsEnum.logLevel);
19+
final logLevel = Level.LEVELS[levelId.value].name;
20+
useValueChanged(
21+
levelId.value,
22+
(_, __) =>
23+
LogService.I.setLogLevel(Level.LEVELS[levelId.value].toLogLevel()),
24+
);
25+
26+
return SettingSliderListTile(
27+
title: 'advanced_settings_log_level_title'
28+
.t(context: context, args: {'level': logLevel}),
29+
valueNotifier: levelId,
30+
max: 8,
31+
min: 1,
32+
divisions: 7,
33+
label: logLevel,
34+
);
35+
}
36+
}

0 commit comments

Comments
 (0)