mirror of
https://github.com/immich-app/immich.git
synced 2025-10-26 08:12:33 -04:00
fix(mobile): persist album sorting in settings
This commit is contained in:
parent
1710230d61
commit
f02bc73f2c
@ -18,6 +18,9 @@ import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
|
|||||||
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
import 'package:immich_mobile/providers/infrastructure/current_album.provider.dart';
|
||||||
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
import 'package:immich_mobile/providers/timeline/multiselect.provider.dart';
|
||||||
import 'package:immich_mobile/providers/user.provider.dart';
|
import 'package:immich_mobile/providers/user.provider.dart';
|
||||||
|
import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart';
|
||||||
|
import 'package:immich_mobile/providers/app_settings.provider.dart';
|
||||||
|
import 'package:immich_mobile/services/app_settings.service.dart';
|
||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
import 'package:immich_mobile/utils/album_filter.utils.dart';
|
import 'package:immich_mobile/utils/album_filter.utils.dart';
|
||||||
import 'package:immich_mobile/widgets/common/confirm_dialog.dart';
|
import 'package:immich_mobile/widgets/common/confirm_dialog.dart';
|
||||||
@ -52,8 +55,20 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
// Load albums when component mounts
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
final appSettings = ref.read(appSettingsServiceProvider);
|
||||||
|
final savedSortMode = appSettings.getSetting(AppSettingsEnum.selectedAlbumSortOrder);
|
||||||
|
final savedIsReverse = appSettings.getSetting(AppSettingsEnum.selectedAlbumSortReverse);
|
||||||
|
|
||||||
|
final albumSortMode = AlbumSortMode.values.firstWhere(
|
||||||
|
(e) => e.storeIndex == savedSortMode,
|
||||||
|
orElse: () => AlbumSortMode.lastModified,
|
||||||
|
);
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
sort = AlbumSort(mode: toRemoteAlbumSortMode(albumSortMode), isReverse: savedIsReverse);
|
||||||
|
});
|
||||||
|
|
||||||
ref.read(remoteAlbumProvider.notifier).refresh();
|
ref.read(remoteAlbumProvider.notifier).refresh();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -98,6 +113,11 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
|
|||||||
this.sort = sort;
|
this.sort = sort;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final appSettings = ref.read(appSettingsServiceProvider);
|
||||||
|
final albumSortMode = toAlbumSortMode(sort.mode);
|
||||||
|
await appSettings.setSetting(AppSettingsEnum.selectedAlbumSortOrder, albumSortMode.storeIndex);
|
||||||
|
await appSettings.setSetting(AppSettingsEnum.selectedAlbumSortReverse, sort.isReverse);
|
||||||
|
|
||||||
await sortAlbums();
|
await sortAlbums();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,6 +202,8 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
|
|||||||
onToggleViewMode: toggleViewMode,
|
onToggleViewMode: toggleViewMode,
|
||||||
onSortChanged: changeSort,
|
onSortChanged: changeSort,
|
||||||
controller: menuController,
|
controller: menuController,
|
||||||
|
currentSortMode: sort.mode,
|
||||||
|
currentIsReverse: sort.isReverse,
|
||||||
),
|
),
|
||||||
isGrid
|
isGrid
|
||||||
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected)
|
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected)
|
||||||
@ -193,20 +215,45 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _SortButton extends ConsumerStatefulWidget {
|
class _SortButton extends ConsumerStatefulWidget {
|
||||||
const _SortButton(this.onSortChanged, {this.controller});
|
const _SortButton(
|
||||||
|
this.onSortChanged, {
|
||||||
|
required this.initialSortMode,
|
||||||
|
required this.initialIsReverse,
|
||||||
|
this.controller,
|
||||||
|
});
|
||||||
|
|
||||||
final Future<void> Function(AlbumSort) onSortChanged;
|
final Future<void> Function(AlbumSort) onSortChanged;
|
||||||
final MenuController? controller;
|
final MenuController? controller;
|
||||||
|
final RemoteAlbumSortMode initialSortMode;
|
||||||
|
final bool initialIsReverse;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ConsumerState<_SortButton> createState() => _SortButtonState();
|
ConsumerState<_SortButton> createState() => _SortButtonState();
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SortButtonState extends ConsumerState<_SortButton> {
|
class _SortButtonState extends ConsumerState<_SortButton> {
|
||||||
RemoteAlbumSortMode albumSortOption = RemoteAlbumSortMode.lastModified;
|
late RemoteAlbumSortMode albumSortOption;
|
||||||
bool albumSortIsReverse = true;
|
late bool albumSortIsReverse;
|
||||||
bool isSorting = false;
|
bool isSorting = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
albumSortOption = widget.initialSortMode;
|
||||||
|
albumSortIsReverse = widget.initialIsReverse;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void didUpdateWidget(_SortButton oldWidget) {
|
||||||
|
super.didUpdateWidget(oldWidget);
|
||||||
|
if (oldWidget.initialSortMode != widget.initialSortMode || oldWidget.initialIsReverse != widget.initialIsReverse) {
|
||||||
|
setState(() {
|
||||||
|
albumSortOption = widget.initialSortMode;
|
||||||
|
albumSortIsReverse = widget.initialIsReverse;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Future<void> onMenuTapped(RemoteAlbumSortMode sortMode) async {
|
Future<void> onMenuTapped(RemoteAlbumSortMode sortMode) async {
|
||||||
final selected = albumSortOption == sortMode;
|
final selected = albumSortOption == sortMode;
|
||||||
// Switch direction
|
// Switch direction
|
||||||
@ -466,6 +513,8 @@ class _QuickSortAndViewMode extends StatelessWidget {
|
|||||||
required this.isGrid,
|
required this.isGrid,
|
||||||
required this.onToggleViewMode,
|
required this.onToggleViewMode,
|
||||||
required this.onSortChanged,
|
required this.onSortChanged,
|
||||||
|
required this.currentSortMode,
|
||||||
|
required this.currentIsReverse,
|
||||||
this.controller,
|
this.controller,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -473,6 +522,8 @@ class _QuickSortAndViewMode extends StatelessWidget {
|
|||||||
final VoidCallback onToggleViewMode;
|
final VoidCallback onToggleViewMode;
|
||||||
final MenuController? controller;
|
final MenuController? controller;
|
||||||
final Future<void> Function(AlbumSort) onSortChanged;
|
final Future<void> Function(AlbumSort) onSortChanged;
|
||||||
|
final RemoteAlbumSortMode currentSortMode;
|
||||||
|
final bool currentIsReverse;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -482,7 +533,12 @@ class _QuickSortAndViewMode extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: [
|
children: [
|
||||||
_SortButton(onSortChanged, controller: controller),
|
_SortButton(
|
||||||
|
onSortChanged,
|
||||||
|
controller: controller,
|
||||||
|
initialSortMode: currentSortMode,
|
||||||
|
initialIsReverse: currentIsReverse,
|
||||||
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24),
|
icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24),
|
||||||
onPressed: onToggleViewMode,
|
onPressed: onToggleViewMode,
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import 'package:immich_mobile/domain/services/remote_album.service.dart';
|
import 'package:immich_mobile/domain/services/remote_album.service.dart';
|
||||||
import 'package:immich_mobile/models/albums/album_search.model.dart';
|
import 'package:immich_mobile/models/albums/album_search.model.dart';
|
||||||
|
import 'package:immich_mobile/providers/album/album_sort_by_options.provider.dart';
|
||||||
|
|
||||||
class AlbumFilter {
|
class AlbumFilter {
|
||||||
String? userId;
|
String? userId;
|
||||||
@ -23,3 +24,37 @@ class AlbumSort {
|
|||||||
return AlbumSort(mode: mode ?? this.mode, isReverse: isReverse ?? this.isReverse);
|
return AlbumSort(mode: mode ?? this.mode, isReverse: isReverse ?? this.isReverse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RemoteAlbumSortMode toRemoteAlbumSortMode(AlbumSortMode mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case AlbumSortMode.title:
|
||||||
|
return RemoteAlbumSortMode.title;
|
||||||
|
case AlbumSortMode.assetCount:
|
||||||
|
return RemoteAlbumSortMode.assetCount;
|
||||||
|
case AlbumSortMode.lastModified:
|
||||||
|
return RemoteAlbumSortMode.lastModified;
|
||||||
|
case AlbumSortMode.created:
|
||||||
|
return RemoteAlbumSortMode.created;
|
||||||
|
case AlbumSortMode.mostRecent:
|
||||||
|
return RemoteAlbumSortMode.mostRecent;
|
||||||
|
case AlbumSortMode.mostOldest:
|
||||||
|
return RemoteAlbumSortMode.mostOldest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AlbumSortMode toAlbumSortMode(RemoteAlbumSortMode mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case RemoteAlbumSortMode.title:
|
||||||
|
return AlbumSortMode.title;
|
||||||
|
case RemoteAlbumSortMode.assetCount:
|
||||||
|
return AlbumSortMode.assetCount;
|
||||||
|
case RemoteAlbumSortMode.lastModified:
|
||||||
|
return AlbumSortMode.lastModified;
|
||||||
|
case RemoteAlbumSortMode.created:
|
||||||
|
return AlbumSortMode.created;
|
||||||
|
case RemoteAlbumSortMode.mostRecent:
|
||||||
|
return AlbumSortMode.mostRecent;
|
||||||
|
case RemoteAlbumSortMode.mostOldest:
|
||||||
|
return AlbumSortMode.mostOldest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user