diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index c74b03c809..f1e3b61e52 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -24,6 +24,7 @@ import 'package:immich_mobile/platform/background_worker_lock_api.g.dart'; import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart'; import 'package:immich_mobile/providers/infrastructure/db.provider.dart'; +import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; import 'package:immich_mobile/providers/infrastructure/platform.provider.dart'; import 'package:immich_mobile/providers/locale_provider.dart'; import 'package:immich_mobile/providers/routes.provider.dart'; @@ -241,7 +242,7 @@ class ImmichAppState extends ConsumerState with WidgetsBindingObserve localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, - themeMode: ref.watch(immichThemeModeProvider), + themeMode: ref.watch(appConfigProvider.select((config) => config.theme.mode)), darkTheme: getThemeData(colorScheme: immichTheme.dark, locale: context.locale), theme: getThemeData(colorScheme: immichTheme.light, locale: context.locale), builder: (context, child) => ImmichTranslationProvider( diff --git a/mobile/lib/providers/theme.provider.dart b/mobile/lib/providers/theme.provider.dart index a56a8e7bd8..909b8137c1 100644 --- a/mobile/lib/providers/theme.provider.dart +++ b/mobile/lib/providers/theme.provider.dart @@ -1,32 +1,17 @@ -import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/constants/colors.dart'; import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; import 'package:immich_mobile/theme/color_scheme.dart'; import 'package:immich_mobile/theme/dynamic_theme.dart'; import 'package:immich_mobile/theme/theme_data.dart'; -final immichThemeModeProvider = StateProvider((ref) => ref.watch(appConfigProvider).theme.mode); - -final immichThemePresetProvider = StateProvider( - (ref) => ref.watch(appConfigProvider.select((config) => config.theme.primaryColor)), -); - -final dynamicThemeSettingProvider = StateProvider( - (ref) => ref.watch(appConfigProvider.select((config) => config.theme.dynamicTheme)), -); - -final colorfulInterfaceSettingProvider = StateProvider( - (ref) => ref.watch(appConfigProvider.select((config) => config.theme.colorfulInterface)), -); - // Provider for current selected theme final immichThemeProvider = StateProvider((ref) { - final primaryColorPreset = ref.watch(immichThemePresetProvider); - final useSystemColor = ref.watch(dynamicThemeSettingProvider); - final useColorfulInterface = ref.watch(colorfulInterfaceSettingProvider); - final ImmichTheme? dynamicTheme = DynamicTheme.theme; - final currentTheme = (useSystemColor && dynamicTheme != null) ? dynamicTheme : primaryColorPreset.themeOfPreset; + final themeConfig = ref.watch(appConfigProvider.select((config) => config.theme)); - return useColorfulInterface ? currentTheme : decolorizeSurfaces(theme: currentTheme); + final ImmichTheme? dynamicTheme = DynamicTheme.theme; + final currentTheme = (themeConfig.dynamicTheme && dynamicTheme != null) + ? dynamicTheme + : themeConfig.primaryColor.themeOfPreset; + + return themeConfig.colorfulInterface ? currentTheme : decolorizeSurfaces(theme: currentTheme); }); diff --git a/mobile/lib/widgets/settings/preference_settings/theme_setting.dart b/mobile/lib/widgets/settings/preference_settings/theme_setting.dart index a12b14cb3c..a011252061 100644 --- a/mobile/lib/widgets/settings/preference_settings/theme_setting.dart +++ b/mobile/lib/widgets/settings/preference_settings/theme_setting.dart @@ -5,7 +5,6 @@ import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; -import 'package:immich_mobile/providers/theme.provider.dart'; import 'package:immich_mobile/widgets/settings/preference_settings/primary_color_setting.dart'; import 'package:immich_mobile/widgets/settings/setting_group_title.dart'; import 'package:immich_mobile/widgets/settings/settings_switch_list_tile.dart'; @@ -15,7 +14,7 @@ class ThemeSetting extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final currentTheme = useState(ref.read(immichThemeModeProvider)); + final currentTheme = useState(ref.read(appConfigProvider.select((config) => config.theme.mode))); final isDarkTheme = useValueNotifier(currentTheme.value == ThemeMode.dark); final isSystemTheme = useValueNotifier(currentTheme.value == ThemeMode.system); final colorfulInterface = useValueNotifier( @@ -23,13 +22,7 @@ class ThemeSetting extends HookConsumerWidget { ); void onThemeChange(bool isDark) { - if (isDark) { - ref.watch(immichThemeModeProvider.notifier).state = ThemeMode.dark; - currentTheme.value = ThemeMode.dark; - } else { - ref.watch(immichThemeModeProvider.notifier).state = ThemeMode.light; - currentTheme.value = ThemeMode.light; - } + currentTheme.value = isDark ? ThemeMode.dark : ThemeMode.light; ref.read(metadataProvider).write(MetadataKey.themeMode, currentTheme.value); } @@ -37,17 +30,14 @@ class ThemeSetting extends HookConsumerWidget { if (isSystem) { currentTheme.value = ThemeMode.system; isSystemTheme.value = true; - ref.watch(immichThemeModeProvider.notifier).state = ThemeMode.system; } else { final currentSystemBrightness = context.platformBrightness; isSystemTheme.value = false; isDarkTheme.value = currentSystemBrightness == Brightness.dark; if (currentSystemBrightness == Brightness.light) { currentTheme.value = ThemeMode.light; - ref.watch(immichThemeModeProvider.notifier).state = ThemeMode.light; } else if (currentSystemBrightness == Brightness.dark) { currentTheme.value = ThemeMode.dark; - ref.watch(immichThemeModeProvider.notifier).state = ThemeMode.dark; } } ref.read(metadataProvider).write(MetadataKey.themeMode, currentTheme.value);