fix: don't show remove from album action from the main timeline (#20757)

* fix: don't show remove from album action from the main timeline

* pr feedback
This commit is contained in:
Alex 2025-08-07 13:06:16 -05:00 committed by GitHub
parent a896c5a4dd
commit 7b83b7b2d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 94 additions and 82 deletions

View File

@ -10,6 +10,7 @@ import 'package:immich_mobile/presentation/widgets/bottom_sheet/remote_album_bot
import 'package:immich_mobile/presentation/widgets/remote_album/drift_album_option.widget.dart'; import 'package:immich_mobile/presentation/widgets/remote_album/drift_album_option.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart'; import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart'; 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/remote_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart'; import 'package:immich_mobile/providers/user.provider.dart';
@ -215,22 +216,34 @@ class _RemoteAlbumPageState extends ConsumerState<RemoteAlbumPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ProviderScope( return PopScope(
overrides: [ onPopInvokedWithResult: (didPop, _) {
timelineServiceProvider.overrideWith((ref) { if (didPop) {
final timelineService = ref.watch(timelineFactoryProvider).remoteAlbum(albumId: _album.id); Future.microtask(() {
ref.onDispose(timelineService.dispose); if (mounted) {
return timelineService; ref.read(currentRemoteAlbumProvider.notifier).dispose();
}), ref.read(remoteAlbumProvider.notifier).refresh();
], }
child: Timeline( });
appBar: RemoteAlbumSliverAppBar( }
icon: Icons.photo_album_outlined, },
onShowOptions: () => showOptionSheet(context), child: ProviderScope(
onToggleAlbumOrder: () => toggleAlbumOrder(), overrides: [
onEditTitle: () => showEditTitleAndDescription(context), timelineServiceProvider.overrideWith((ref) {
final timelineService = ref.watch(timelineFactoryProvider).remoteAlbum(albumId: _album.id);
ref.onDispose(timelineService.dispose);
return timelineService;
}),
],
child: Timeline(
appBar: RemoteAlbumSliverAppBar(
icon: Icons.photo_album_outlined,
onShowOptions: () => showOptionSheet(context),
onToggleAlbumOrder: () => toggleAlbumOrder(),
onEditTitle: () => showEditTitleAndDescription(context),
),
bottomSheet: RemoteAlbumBottomSheet(album: _album),
), ),
bottomSheet: RemoteAlbumBottomSheet(album: _album),
), ),
); );
} }

View File

@ -31,5 +31,6 @@ class CurrentAlbumNotifier extends AutoDisposeNotifier<RemoteAlbum?> {
void dispose() { void dispose() {
_keepAliveLink?.close(); _keepAliveLink?.close();
_assetSubscription?.cancel(); _assetSubscription?.cancel();
state = null;
} }
} }

View File

@ -14,7 +14,6 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/datetime_extensions.dart'; import 'package:immich_mobile/extensions/datetime_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/images/image_provider.dart'; import 'package:immich_mobile/presentation/widgets/images/image_provider.dart';
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/infrastructure/remote_album.provider.dart'; import 'package:immich_mobile/providers/infrastructure/remote_album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart'; import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
@ -74,76 +73,75 @@ class _MesmerizingSliverAppBarState extends ConsumerState<RemoteAlbumSliverAppBa
const Shadow(offset: Offset(0, 2), blurRadius: 0, color: Colors.transparent), const Shadow(offset: Offset(0, 2), blurRadius: 0, color: Colors.transparent),
]; ];
return isMultiSelectEnabled if (isMultiSelectEnabled) {
? SliverToBoxAdapter( return SliverToBoxAdapter(
child: switch (_scrollProgress) { child: switch (_scrollProgress) {
< 0.8 => const SizedBox(height: 120), < 0.8 => const SizedBox(height: 120),
_ => const SizedBox(height: 452), _ => const SizedBox(height: 452),
}, },
) );
: SliverAppBar( } else {
expandedHeight: 400.0, return SliverAppBar(
floating: false, expandedHeight: 400.0,
pinned: true, floating: false,
snap: false, pinned: true,
elevation: 0, snap: false,
leading: IconButton( elevation: 0,
icon: Icon( leading: IconButton(
Platform.isIOS ? Icons.arrow_back_ios_new_rounded : Icons.arrow_back, icon: Icon(
color: actionIconColor, Platform.isIOS ? Icons.arrow_back_ios_new_rounded : Icons.arrow_back,
shadows: actionIconShadows, color: actionIconColor,
), shadows: actionIconShadows,
onPressed: () { ),
ref.read(remoteAlbumProvider.notifier).refresh(); onPressed: () => context.navigateTo(const TabShellRoute(children: [DriftAlbumsRoute()])),
context.navigateTo(const TabShellRoute(children: [DriftAlbumsRoute()])); ),
}, actions: [
if (widget.onToggleAlbumOrder != null)
IconButton(
icon: Icon(Icons.swap_vert_rounded, color: actionIconColor, shadows: actionIconShadows),
onPressed: widget.onToggleAlbumOrder,
), ),
actions: [ if (widget.onShowOptions != null)
if (widget.onToggleAlbumOrder != null) IconButton(
IconButton( icon: Icon(Icons.more_vert, color: actionIconColor, shadows: actionIconShadows),
icon: Icon(Icons.swap_vert_rounded, color: actionIconColor, shadows: actionIconShadows), onPressed: widget.onShowOptions,
onPressed: widget.onToggleAlbumOrder, ),
), ],
if (widget.onShowOptions != null) flexibleSpace: Builder(
IconButton( builder: (context) {
icon: Icon(Icons.more_vert, color: actionIconColor, shadows: actionIconShadows), final settings = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>();
onPressed: widget.onShowOptions, final scrollProgress = _calculateScrollProgress(settings);
),
],
flexibleSpace: Builder(
builder: (context) {
final settings = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>();
final scrollProgress = _calculateScrollProgress(settings);
// Update scroll progress for the leading button // Update scroll progress for the leading button
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted && _scrollProgress != scrollProgress) { if (mounted && _scrollProgress != scrollProgress) {
setState(() { setState(() {
_scrollProgress = scrollProgress; _scrollProgress = scrollProgress;
});
}
}); });
}
});
return FlexibleSpaceBar( return FlexibleSpaceBar(
centerTitle: true, centerTitle: true,
title: AnimatedSwitcher( title: AnimatedSwitcher(
duration: const Duration(milliseconds: 200), duration: const Duration(milliseconds: 200),
child: scrollProgress > 0.95 child: scrollProgress > 0.95
? Text( ? Text(
currentAlbum.name, currentAlbum.name,
style: TextStyle(color: context.primaryColor, fontWeight: FontWeight.w600, fontSize: 18), style: TextStyle(color: context.primaryColor, fontWeight: FontWeight.w600, fontSize: 18),
) )
: null, : null,
), ),
background: _ExpandedBackground( background: _ExpandedBackground(
scrollProgress: scrollProgress, scrollProgress: scrollProgress,
icon: widget.icon, icon: widget.icon,
onEditTitle: widget.onEditTitle, onEditTitle: widget.onEditTitle,
), ),
); );
}, },
), ),
); );
}
} }
} }