1
0
mirror of https://github.com/immich-app/immich.git synced 2025-08-07 23:03:36 +02:00

feat: action buttons in more view (#19867)

* feat: action buttons in more view

* pr feedback
This commit is contained in:
Alex
2025-07-11 10:34:38 -05:00
committed by GitHub
parent 617a2f146d
commit de4217cefc
28 changed files with 469 additions and 102 deletions

View File

@ -1,29 +0,0 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
@RoutePage()
class DriftPartnerDetailPage extends StatelessWidget {
final String partnerId;
const DriftPartnerDetailPage({super.key, required this.partnerId});
@override
Widget build(BuildContext context) {
return ProviderScope(
overrides: [
timelineServiceProvider.overrideWith(
(ref) {
final timelineService =
ref.watch(timelineFactoryProvider).remoteAssets(partnerId);
ref.onDispose(timelineService.dispose);
return timelineService;
},
),
],
child: const Timeline(),
);
}
}

View File

@ -226,7 +226,7 @@ class RemoteMediaSummaryPage extends StatelessWidget {
name: album.name,
countFuture: countFuture,
onTap: () => context.router.push(
RemoteTimelineRoute(album: album),
RemoteAlbumRoute(album: album),
),
);
},

View File

@ -568,7 +568,7 @@ class _AlbumList extends StatelessWidget {
),
),
onTap: () => context.router.push(
RemoteTimelineRoute(album: album),
RemoteAlbumRoute(album: album),
),
leadingPadding: const EdgeInsets.only(
right: 16,
@ -705,7 +705,7 @@ class _GridAlbumCard extends StatelessWidget {
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => context.router.push(
RemoteTimelineRoute(album: album),
RemoteAlbumRoute(album: album),
),
child: Card(
elevation: 0,

View File

@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/archive_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -34,6 +35,7 @@ class DriftArchivePage extends StatelessWidget {
title: 'archive'.t(context: context),
icon: Icons.archive_outlined,
),
bottomSheet: const ArchiveBottomSheet(),
),
);
}

View File

@ -203,7 +203,7 @@ class _DriftCreateAlbumPageState extends ConsumerState<DriftCreateAlbumPage> {
if (album != null) {
context.replaceRoute(
RemoteTimelineRoute(album: album),
RemoteAlbumRoute(album: album),
);
}
}

View File

@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/favorite_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -34,6 +35,7 @@ class DriftFavoritePage extends StatelessWidget {
title: 'favorites'.t(context: context),
icon: Icons.favorite_outline,
),
bottomSheet: const FavoriteBottomSheet(),
),
);
}

View File

@ -512,8 +512,9 @@ class _PartnerList extends StatelessWidget {
fontWeight: FontWeight.w500,
),
).t(context: context, args: {'user': partner.name}),
onTap: () =>
context.pushRoute(DriftPartnerDetailRoute(partnerId: partner.id)),
onTap: () => context.pushRoute(
DriftPartnerDetailRoute(partner: partner),
),
);
},
);

View File

@ -1,9 +1,12 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/locked_folder_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
@RoutePage()
class DriftLockedFolderPage extends StatelessWidget {
@ -27,7 +30,12 @@ class DriftLockedFolderPage extends StatelessWidget {
},
),
],
child: const Timeline(),
child: Timeline(
appBar: MesmerizingSliverAppBar(
title: 'locked_folder'.t(context: context),
),
bottomSheet: const LockedFolderBottomSheet(),
),
);
}
}

View File

@ -0,0 +1,109 @@
import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/partner_detail_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
@RoutePage()
class DriftPartnerDetailPage extends StatelessWidget {
final UserDto partner;
const DriftPartnerDetailPage({
super.key,
required this.partner,
});
@override
Widget build(BuildContext context) {
return ProviderScope(
overrides: [
timelineServiceProvider.overrideWith(
(ref) {
final timelineService =
ref.watch(timelineFactoryProvider).remoteAssets(partner.id);
ref.onDispose(timelineService.dispose);
return timelineService;
},
),
],
child: Timeline(
appBar: MesmerizingSliverAppBar(
title: partner.name,
icon: Icons.person_outline,
),
topSliverWidget: _InfoBox(
onTap: () => {
// TODO: Create DriftUserProvider/DriftUserService to handle this action
},
inTimeline: partner.inTimeline,
),
topSliverWidgetHeight: 110,
bottomSheet: const PartnerDetailBottomSheet(),
),
);
}
}
class _InfoBox extends StatelessWidget {
final VoidCallback onTap;
final bool inTimeline;
const _InfoBox({
required this.onTap,
required this.inTimeline,
});
@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: SizedBox(
height: 110,
child: Padding(
padding: const EdgeInsets.only(left: 8.0, right: 8.0, top: 16.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(
color: context.colorScheme.onSurface.withAlpha(10),
width: 1,
),
borderRadius: const BorderRadius.all(
Radius.circular(20),
),
gradient: LinearGradient(
colors: [
context.colorScheme.primary.withAlpha(10),
context.colorScheme.primary.withAlpha(15),
],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: ListTile(
title: Text(
"Show in timeline",
style: context.textTheme.titleSmall?.copyWith(
color: context.colorScheme.primary,
),
),
subtitle: Text(
"Show photos and videos from this user in your timeline",
style: context.textTheme.bodyMedium,
),
trailing: Switch(
value: inTimeline,
onChanged: (_) => onTap(),
),
),
),
),
),
),
);
}
}

View File

@ -2,15 +2,16 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/album.model.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/remote_album_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
@RoutePage()
class RemoteTimelinePage extends StatelessWidget {
class RemoteAlbumPage extends StatelessWidget {
final RemoteAlbum album;
const RemoteTimelinePage({super.key, required this.album});
const RemoteAlbumPage({super.key, required this.album});
@override
Widget build(BuildContext context) {
@ -31,6 +32,9 @@ class RemoteTimelinePage extends StatelessWidget {
title: album.name,
icon: Icons.photo_album_outlined,
),
bottomSheet: RemoteAlbumBottomSheet(
album: album,
),
),
);
}

View File

@ -2,6 +2,7 @@ import 'package:auto_route/auto_route.dart';
import 'package:flutter/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/presentation/widgets/bottom_sheet/local_album_bottom_sheet.widget.dart';
import 'package:immich_mobile/presentation/widgets/timeline/timeline.widget.dart';
import 'package:immich_mobile/providers/infrastructure/timeline.provider.dart';
import 'package:immich_mobile/widgets/common/mesmerizing_sliver_app_bar.dart';
@ -28,6 +29,7 @@ class LocalTimelinePage extends StatelessWidget {
],
child: Timeline(
appBar: MesmerizingSliverAppBar(title: album.name),
bottomSheet: const LocalAlbumBottomSheet(),
),
);
}