mirror of
https://github.com/immich-app/immich.git
synced 2026-03-16 22:49:21 -04:00
Videos have recently been changed to support zooming, but this can make the controls in the centre of the screen unergonomic as they will either stay in the centre when dismissing, or stick to the video when zooming. Neither is great. We should align the behaviour with other apps which has the play/pause toggle at the bottom of the screen with the seeker bar instead. Co-authored-by: Alex <alex.tran1502@gmail.com>
91 lines
4.0 KiB
Dart
91 lines
4.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/constants/enums.dart';
|
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_action_button.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/delete_local_action_button.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/edit_image_action_button.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/share_action_button.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/upload_action_button.widget.dart';
|
|
import 'package:immich_mobile/presentation/widgets/action_buttons/add_action_button.widget.dart';
|
|
import 'package:immich_mobile/providers/asset_viewer/asset_viewer.provider.dart';
|
|
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
|
|
import 'package:immich_mobile/providers/routes.provider.dart';
|
|
import 'package:immich_mobile/providers/user.provider.dart';
|
|
import 'package:immich_mobile/widgets/asset_viewer/video_controls.dart';
|
|
|
|
class ViewerBottomBar extends ConsumerWidget {
|
|
const ViewerBottomBar({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final asset = ref.watch(assetViewerProvider.select((s) => s.currentAsset));
|
|
if (asset == null) {
|
|
return const SizedBox.shrink();
|
|
}
|
|
|
|
final isReadonlyModeEnabled = ref.watch(readonlyModeProvider);
|
|
final user = ref.watch(currentUserProvider);
|
|
final isOwner = asset is RemoteAsset && asset.ownerId == user?.id;
|
|
final showingDetails = ref.watch(assetViewerProvider.select((s) => s.showingDetails));
|
|
final isInLockedView = ref.watch(inLockedViewProvider);
|
|
|
|
final originalTheme = context.themeData;
|
|
|
|
final actions = <Widget>[
|
|
const ShareActionButton(source: ActionSource.viewer),
|
|
|
|
if (!isInLockedView) ...[
|
|
if (asset.isLocalOnly) const UploadActionButton(source: ActionSource.viewer),
|
|
if (asset.type == AssetType.image) const EditImageActionButton(),
|
|
if (asset.hasRemote) AddActionButton(originalTheme: originalTheme),
|
|
|
|
if (isOwner) ...[
|
|
asset.isLocalOnly
|
|
? const DeleteLocalActionButton(source: ActionSource.viewer)
|
|
: const DeleteActionButton(source: ActionSource.viewer, showConfirmation: true),
|
|
],
|
|
],
|
|
];
|
|
|
|
return AnimatedSwitcher(
|
|
duration: Durations.short4,
|
|
child: showingDetails
|
|
? const SizedBox.shrink()
|
|
: Theme(
|
|
data: context.themeData.copyWith(
|
|
iconTheme: const IconThemeData(size: 22, color: Colors.white),
|
|
textTheme: context.themeData.textTheme.copyWith(
|
|
labelLarge: context.themeData.textTheme.labelLarge?.copyWith(color: Colors.white),
|
|
),
|
|
),
|
|
child: Container(
|
|
decoration: const BoxDecoration(
|
|
gradient: LinearGradient(
|
|
begin: Alignment.bottomCenter,
|
|
end: Alignment.topCenter,
|
|
colors: [Colors.black45, Colors.black12, Colors.transparent],
|
|
stops: [0.0, 0.7, 1.0],
|
|
),
|
|
),
|
|
child: SafeArea(
|
|
top: false,
|
|
child: Padding(
|
|
padding: const EdgeInsets.only(top: 16),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
if (asset.isVideo) VideoControls(videoPlayerName: asset.heroTag),
|
|
if (!isReadonlyModeEnabled)
|
|
Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: actions),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|