@ -4,26 +4,19 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import ' package:immich_mobile/constants/enums.dart ' ;
import ' package:immich_mobile/constants/enums.dart ' ;
import ' package:immich_mobile/domain/models/asset/base_asset.model.dart ' ;
import ' package:immich_mobile/domain/models/asset/base_asset.model.dart ' ;
import ' package:immich_mobile/domain/models/events.model.dart ' ;
import ' package:immich_mobile/domain/models/events.model.dart ' ;
import ' package:immich_mobile/domain/services/timeline.service.dart ' ;
import ' package:immich_mobile/domain/utils/event_stream.dart ' ;
import ' package:immich_mobile/domain/utils/event_stream.dart ' ;
import ' package:immich_mobile/extensions/build_context_extensions.dart ' ;
import ' package:immich_mobile/extensions/build_context_extensions.dart ' ;
import ' package:immich_mobile/extensions/translate_extensions.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/cast_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/download_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/favorite_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/favorite_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/motion_photo_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/motion_photo_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/action_buttons/unfavorite_action_button.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart ' ;
import ' package:immich_mobile/presentation/widgets/asset_viewer/asset_viewer.state.dart ' ;
import ' package:immich_mobile/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart ' ;
import ' package:immich_mobile/presentation/widgets/asset_viewer/viewer_kebab_menu.widget.dart ' ;
import ' package:immich_mobile/providers/activity.provider.dart ' ;
import ' package:immich_mobile/providers/activity.provider.dart ' ;
import ' package:immich_mobile/providers/cast.provider.dart ' ;
import ' package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.provider.dart ' ;
import ' package:immich_mobile/providers/infrastructure/asset_viewer/current_asset.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/readonly_mode.provider.dart ' ;
import ' package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart ' ;
import ' package:immich_mobile/providers/infrastructure/timeline.provider.dart ' ;
import ' package:immich_mobile/providers/routes.provider.dart ' ;
import ' package:immich_mobile/providers/routes.provider.dart ' ;
import ' package:immich_mobile/providers/user.provider.dart ' ;
import ' package:immich_mobile/providers/user.provider.dart ' ;
import ' package:immich_mobile/routing/router.dart ' ;
class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
const ViewerTopAppBar ( { super . key } ) ;
const ViewerTopAppBar ( { super . key } ) ;
@ -42,15 +35,6 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
final isInLockedView = ref . watch ( inLockedViewProvider ) ;
final isInLockedView = ref . watch ( inLockedViewProvider ) ;
final isReadonlyModeEnabled = ref . watch ( readonlyModeProvider ) ;
final isReadonlyModeEnabled = ref . watch ( readonlyModeProvider ) ;
final timelineOrigin = ref . read ( timelineServiceProvider ) . origin ;
final showViewInTimelineButton =
timelineOrigin ! = TimelineOrigin . main & &
timelineOrigin ! = TimelineOrigin . deepLink & &
timelineOrigin ! = TimelineOrigin . trash & &
timelineOrigin ! = TimelineOrigin . archive & &
timelineOrigin ! = TimelineOrigin . localAlbum & &
isOwner ;
final isShowingSheet = ref . watch ( assetViewerProvider . select ( ( state ) = > state . showingBottomSheet ) ) ;
final isShowingSheet = ref . watch ( assetViewerProvider . select ( ( state ) = > state . showingBottomSheet ) ) ;
int opacity = ref . watch ( assetViewerProvider . select ( ( state ) = > state . backgroundOpacity ) ) ;
int opacity = ref . watch ( assetViewerProvider . select ( ( state ) = > state . backgroundOpacity ) ) ;
final showControls = ref . watch ( assetViewerProvider . select ( ( s ) = > s . showingControls ) ) ;
final showControls = ref . watch ( assetViewerProvider . select ( ( s ) = > s . showingControls ) ) ;
@ -63,11 +47,10 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
opacity = 0 ;
opacity = 0 ;
}
}
final isCasting = ref . watch ( castProvider . select ( ( c ) = > c . isCasting ) ) ;
final originalTheme = context . themeData ;
final actions = < Widget > [
final actions = < Widget > [
if ( asset . isRemoteOnly ) const DownloadActionButton ( source : ActionSource . viewer , iconOnly: true ) ,
if ( asset . isMotionPhoto ) const MotionPhotoActionButton ( iconOnly: true ) ,
if ( isCasting | | ( asset . hasRemote ) ) const CastActionButton ( iconOnly: true ) ,
if ( album ! = null & & album . isActivityEnabled & & album . isShared )
if ( album ! = null & & album . isActivityEnabled & & album . isShared )
IconButton (
IconButton (
icon: const Icon ( Icons . chat_outlined ) ,
icon: const Icon ( Icons . chat_outlined ) ,
@ -75,29 +58,17 @@ class ViewerTopAppBar extends ConsumerWidget implements PreferredSizeWidget {
EventStream . shared . emit ( const ViewerOpenBottomSheetEvent ( activitiesMode: true ) ) ;
EventStream . shared . emit ( const ViewerOpenBottomSheetEvent ( activitiesMode: true ) ) ;
} ,
} ,
) ,
) ,
if ( showViewInTimelineButton )
IconButton (
onPressed: ( ) async {
await context . maybePop ( ) ;
await context . navigateTo ( const TabShellRoute ( children: [ MainTimelineRoute ( ) ] ) ) ;
EventStream . shared . emit ( ScrollToDateEvent ( asset . createdAt ) ) ;
} ,
icon: const Icon ( Icons . image_search ) ,
tooltip: ' view_in_timeline ' . t ( context: context ) ,
) ,
if ( asset . hasRemote & & isOwner & & ! asset . isFavorite )
if ( asset . hasRemote & & isOwner & & ! asset . isFavorite )
const FavoriteActionButton ( source : ActionSource . viewer , iconOnly: true ) ,
const FavoriteActionButton ( source : ActionSource . viewer , iconOnly: true ) ,
if ( asset . hasRemote & & isOwner & & asset . isFavorite )
if ( asset . hasRemote & & isOwner & & asset . isFavorite )
const UnFavoriteActionButton ( source : ActionSource . viewer , iconOnly: true ) ,
const UnFavoriteActionButton ( source : ActionSource . viewer , iconOnly: true ) ,
if ( asset . isMotionPhoto ) const MotionPhotoActionButton ( iconOnly: true ) ,
const ViewerKebabMenu ( ) ,
] ;
final lockedViewActions = < Widget > [
ViewerKebabMenu ( originalTheme: originalTheme ) ,
if ( isCasting | | ( asset . hasRemote ) ) const CastActionButton ( iconOnly: true ) ,
const ViewerKebabMenu ( ) ,
] ;
] ;
final lockedViewActions = < Widget > [ ViewerKebabMenu ( originalTheme: originalTheme ) ] ;
return IgnorePointer (
return IgnorePointer (
ignoring: opacity < 255 ,
ignoring: opacity < 255 ,
child: AnimatedOpacity (
child: AnimatedOpacity (