mirror of
https://github.com/immich-app/immich
synced 2026-08-15 13:03:57 +00:00
* chore(mobile): example freezed implementation on some models * Don't commit Freezed generated code * Freezed easy pass * Formatting fix * Generate Flutter debugging info
154 lines
9.5 KiB
Dart
154 lines
9.5 KiB
Dart
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
import 'package:immich_mobile/constants/colors.dart';
|
|
import 'package:immich_mobile/constants/enums.dart';
|
|
import 'package:immich_mobile/domain/models/config/album_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/backup_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/cleanup_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/feature_message_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/image_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/map_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/network_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/share_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/slideshow_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/theme_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/timeline_config.dart';
|
|
import 'package:immich_mobile/domain/models/config/viewer_config.dart';
|
|
import 'package:immich_mobile/domain/models/log.model.dart';
|
|
import 'package:immich_mobile/domain/models/settings_key.dart';
|
|
import 'package:immich_mobile/domain/models/timeline.model.dart';
|
|
import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart';
|
|
import 'package:immich_mobile/utils/semver.dart';
|
|
|
|
part 'app_config.freezed.dart';
|
|
|
|
const defaultConfig = AppConfig();
|
|
|
|
@freezed
|
|
abstract class AppConfig with _$AppConfig {
|
|
const AppConfig._();
|
|
|
|
const factory AppConfig({
|
|
@Default(LogLevel.info) LogLevel logLevel,
|
|
@Default(ThemeConfig()) ThemeConfig theme,
|
|
@Default(CleanupConfig()) CleanupConfig cleanup,
|
|
@Default(MapConfig()) MapConfig map,
|
|
@Default(TimelineConfig()) TimelineConfig timeline,
|
|
@Default(ImageConfig()) ImageConfig image,
|
|
@Default(ViewerConfig()) ViewerConfig viewer,
|
|
@Default(SlideshowConfig()) SlideshowConfig slideshow,
|
|
@Default(AlbumConfig()) AlbumConfig album,
|
|
@Default(BackupConfig()) BackupConfig backup,
|
|
@Default(NetworkConfig()) NetworkConfig network,
|
|
@Default(ShareConfig()) ShareConfig share,
|
|
@Default(FeatureMessageConfig()) FeatureMessageConfig featureMessage,
|
|
}) = _AppConfig;
|
|
|
|
T read<T>(SettingsKey<T> key) =>
|
|
(switch (key) {
|
|
.logLevel => logLevel,
|
|
.themePrimaryColor => theme.primaryColor,
|
|
.themeMode => theme.mode,
|
|
.themeDynamic => theme.dynamicTheme,
|
|
.themeColorfulInterface => theme.colorfulInterface,
|
|
.imagePreferRemote => image.preferRemote,
|
|
.imageLoadOriginal => image.loadOriginal,
|
|
.viewerLoopVideo => viewer.loopVideo,
|
|
.viewerLoadOriginalVideo => viewer.loadOriginalVideo,
|
|
.viewerAutoPlayVideo => viewer.autoPlayVideo,
|
|
.viewerTapToNavigate => viewer.tapToNavigate,
|
|
.networkAutoEndpointSwitching => network.autoEndpointSwitching,
|
|
.networkPreferredWifiName => network.preferredWifiName,
|
|
.networkLocalEndpoint => network.localEndpoint,
|
|
.networkExternalEndpointList => network.externalEndpointList,
|
|
.networkCustomHeaders => network.customHeaders,
|
|
.albumSortMode => album.sortMode,
|
|
.albumIsReverse => album.isReverse,
|
|
.albumIsGrid => album.isGrid,
|
|
.backupEnabled => backup.enabled,
|
|
.backupUseCellularForVideos => backup.useCellularForVideos,
|
|
.backupUseCellularForPhotos => backup.useCellularForPhotos,
|
|
.backupRequireCharging => backup.requireCharging,
|
|
.backupTriggerDelay => backup.triggerDelay,
|
|
.backupSyncAlbums => backup.syncAlbums,
|
|
.timelineTilesPerRow => timeline.tilesPerRow,
|
|
.timelineGroupAssetsBy => timeline.groupAssetsBy,
|
|
.timelineStorageIndicator => timeline.storageIndicator,
|
|
.mapShowFavoriteOnly => map.favoritesOnly,
|
|
.mapRelativeDate => map.relativeDays,
|
|
.mapCustomFrom => map.customFrom,
|
|
.mapCustomTo => map.customTo,
|
|
.mapIncludeArchived => map.includeArchived,
|
|
.mapThemeMode => map.themeMode,
|
|
.mapWithPartners => map.withPartners,
|
|
.cleanupKeepFavorites => cleanup.keepFavorites,
|
|
.cleanupKeepMediaType => cleanup.keepMediaType,
|
|
.cleanupKeepAlbumIds => cleanup.keepAlbumIds,
|
|
.cleanupCutoffDaysAgo => cleanup.cutoffDaysAgo,
|
|
.cleanupDefaultsInitialized => cleanup.defaultsInitialized,
|
|
.shareFileType => share.fileType,
|
|
.slideshowRepeat => slideshow.repeat,
|
|
.slideshowDuration => slideshow.duration,
|
|
.slideshowLook => slideshow.look,
|
|
.slideshowDirection => slideshow.direction,
|
|
.featureMessageSeenRelease => featureMessage.seenRelease,
|
|
})
|
|
as T;
|
|
|
|
factory AppConfig.fromEntries(Map<SettingsKey, Object?> overrides) =>
|
|
overrides.entries.fold(const AppConfig(), (config, entry) => config.write(entry.key, entry.value));
|
|
|
|
AppConfig write<T, U extends T>(SettingsKey<T> key, U value) {
|
|
return switch (key) {
|
|
.logLevel => copyWith(logLevel: value as LogLevel),
|
|
.themePrimaryColor => copyWith(theme: theme.copyWith(primaryColor: value as ImmichColorPreset)),
|
|
.themeMode => copyWith(theme: theme.copyWith(mode: value as ThemeMode)),
|
|
.themeDynamic => copyWith(theme: theme.copyWith(dynamicTheme: value as bool)),
|
|
.themeColorfulInterface => copyWith(theme: theme.copyWith(colorfulInterface: value as bool)),
|
|
.imagePreferRemote => copyWith(image: image.copyWith(preferRemote: value as bool)),
|
|
.imageLoadOriginal => copyWith(image: image.copyWith(loadOriginal: value as bool)),
|
|
.viewerLoopVideo => copyWith(viewer: viewer.copyWith(loopVideo: value as bool)),
|
|
.viewerLoadOriginalVideo => copyWith(viewer: viewer.copyWith(loadOriginalVideo: value as bool)),
|
|
.viewerAutoPlayVideo => copyWith(viewer: viewer.copyWith(autoPlayVideo: value as bool)),
|
|
.viewerTapToNavigate => copyWith(viewer: viewer.copyWith(tapToNavigate: value as bool)),
|
|
.networkAutoEndpointSwitching => copyWith(network: network.copyWith(autoEndpointSwitching: value as bool)),
|
|
.networkPreferredWifiName => copyWith(
|
|
network: network.copyWith(preferredWifiName: .fromNullable(value as String?)),
|
|
),
|
|
.networkLocalEndpoint => copyWith(network: network.copyWith(localEndpoint: .fromNullable(value as String?))),
|
|
.networkExternalEndpointList => copyWith(network: network.copyWith(externalEndpointList: value as List<String>)),
|
|
.networkCustomHeaders => copyWith(network: network.copyWith(customHeaders: value as Map<String, String>)),
|
|
.albumSortMode => copyWith(album: album.copyWith(sortMode: value as AlbumSortMode)),
|
|
.albumIsReverse => copyWith(album: album.copyWith(isReverse: value as bool)),
|
|
.albumIsGrid => copyWith(album: album.copyWith(isGrid: value as bool)),
|
|
.backupEnabled => copyWith(backup: backup.copyWith(enabled: value as bool)),
|
|
.backupUseCellularForVideos => copyWith(backup: backup.copyWith(useCellularForVideos: value as bool)),
|
|
.backupUseCellularForPhotos => copyWith(backup: backup.copyWith(useCellularForPhotos: value as bool)),
|
|
.backupRequireCharging => copyWith(backup: backup.copyWith(requireCharging: value as bool)),
|
|
.backupTriggerDelay => copyWith(backup: backup.copyWith(triggerDelay: value as int)),
|
|
.backupSyncAlbums => copyWith(backup: backup.copyWith(syncAlbums: value as bool)),
|
|
.timelineTilesPerRow => copyWith(timeline: timeline.copyWith(tilesPerRow: value as int)),
|
|
.timelineGroupAssetsBy => copyWith(timeline: timeline.copyWith(groupAssetsBy: value as GroupAssetsBy)),
|
|
.timelineStorageIndicator => copyWith(timeline: timeline.copyWith(storageIndicator: value as bool)),
|
|
.mapShowFavoriteOnly => copyWith(map: map.copyWith(favoritesOnly: value as bool)),
|
|
.mapRelativeDate => copyWith(map: map.copyWith(relativeDays: value as int)),
|
|
.mapCustomFrom => copyWith(map: map.copyWith(customFrom: .fromNullable(value as DateTime?))),
|
|
.mapCustomTo => copyWith(map: map.copyWith(customTo: .fromNullable(value as DateTime?))),
|
|
.mapIncludeArchived => copyWith(map: map.copyWith(includeArchived: value as bool)),
|
|
.mapThemeMode => copyWith(map: map.copyWith(themeMode: value as ThemeMode)),
|
|
.mapWithPartners => copyWith(map: map.copyWith(withPartners: value as bool)),
|
|
.cleanupKeepFavorites => copyWith(cleanup: cleanup.copyWith(keepFavorites: value as bool)),
|
|
.cleanupKeepMediaType => copyWith(cleanup: cleanup.copyWith(keepMediaType: value as AssetKeepType)),
|
|
.cleanupKeepAlbumIds => copyWith(cleanup: cleanup.copyWith(keepAlbumIds: value as List<String>)),
|
|
.cleanupCutoffDaysAgo => copyWith(cleanup: cleanup.copyWith(cutoffDaysAgo: value as int)),
|
|
.cleanupDefaultsInitialized => copyWith(cleanup: cleanup.copyWith(defaultsInitialized: value as bool)),
|
|
.shareFileType => copyWith(share: share.copyWith(fileType: value as ShareAssetType)),
|
|
.slideshowRepeat => copyWith(slideshow: slideshow.copyWith(repeat: value as bool)),
|
|
.slideshowDuration => copyWith(slideshow: slideshow.copyWith(duration: value as int)),
|
|
.slideshowLook => copyWith(slideshow: slideshow.copyWith(look: value as SlideshowLook)),
|
|
.slideshowDirection => copyWith(slideshow: slideshow.copyWith(direction: value as SlideshowDirection)),
|
|
.featureMessageSeenRelease => copyWith(featureMessage: featureMessage.copyWith(seenRelease: value as SemVer)),
|
|
};
|
|
}
|
|
}
|