mirror of
https://github.com/immich-app/immich.git
synced 2025-12-19 01:11:07 +03:00
feat(mobile): add ButtonPosition enum and update action button context
This commit is contained in:
@@ -7,3 +7,5 @@ enum AssetVisibilityEnum { timeline, hidden, archive, locked }
|
|||||||
enum SortUserBy { id }
|
enum SortUserBy { id }
|
||||||
|
|
||||||
enum ActionSource { timeline, viewer }
|
enum ActionSource { timeline, viewer }
|
||||||
|
|
||||||
|
enum ButtonPosition { bottomBar, kebabMenu, other }
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ class ViewerBottomBar extends ConsumerWidget {
|
|||||||
source: ActionSource.viewer,
|
source: ActionSource.viewer,
|
||||||
timelineOrigin: timelineOrigin,
|
timelineOrigin: timelineOrigin,
|
||||||
originalTheme: originalTheme,
|
originalTheme: originalTheme,
|
||||||
|
buttonPosition: ButtonPosition.bottomBar,
|
||||||
);
|
);
|
||||||
|
|
||||||
final actions = ActionButtonBuilder.buildViewerBottomBar(buttonContext, context, ref);
|
final actions = ActionButtonBuilder.buildViewerBottomBar(buttonContext, context, ref);
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class ActionButtonContext {
|
|||||||
final bool isCasting;
|
final bool isCasting;
|
||||||
final TimelineOrigin timelineOrigin;
|
final TimelineOrigin timelineOrigin;
|
||||||
final ThemeData? originalTheme;
|
final ThemeData? originalTheme;
|
||||||
|
final ButtonPosition buttonPosition;
|
||||||
|
|
||||||
const ActionButtonContext({
|
const ActionButtonContext({
|
||||||
required this.asset,
|
required this.asset,
|
||||||
@@ -59,6 +60,7 @@ class ActionButtonContext {
|
|||||||
this.isCasting = false,
|
this.isCasting = false,
|
||||||
this.timelineOrigin = TimelineOrigin.main,
|
this.timelineOrigin = TimelineOrigin.main,
|
||||||
this.originalTheme,
|
this.originalTheme,
|
||||||
|
this.buttonPosition = ButtonPosition.other,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +140,8 @@ enum ActionButtonType {
|
|||||||
context.asset.storage == AssetState.local,
|
context.asset.storage == AssetState.local,
|
||||||
ActionButtonType.editImage =>
|
ActionButtonType.editImage =>
|
||||||
!context.isInLockedView && //
|
!context.isInLockedView && //
|
||||||
context.asset.type == AssetType.image,
|
context.asset.type == AssetType.image &&
|
||||||
|
!(context.buttonPosition == ButtonPosition.bottomBar && context.currentAlbum?.isShared == true),
|
||||||
ActionButtonType.addTo =>
|
ActionButtonType.addTo =>
|
||||||
!context.isInLockedView && //
|
!context.isInLockedView && //
|
||||||
context.asset.hasRemote,
|
context.asset.hasRemote,
|
||||||
@@ -296,9 +299,9 @@ class ActionButtonBuilder {
|
|||||||
ActionButtonType.share,
|
ActionButtonType.share,
|
||||||
ActionButtonType.upload,
|
ActionButtonType.upload,
|
||||||
ActionButtonType.editImage,
|
ActionButtonType.editImage,
|
||||||
|
ActionButtonType.addTo,
|
||||||
ActionButtonType.openActivity,
|
ActionButtonType.openActivity,
|
||||||
ActionButtonType.likeActivity,
|
ActionButtonType.likeActivity,
|
||||||
ActionButtonType.addTo,
|
|
||||||
ActionButtonType.deleteLocal,
|
ActionButtonType.deleteLocal,
|
||||||
ActionButtonType.delete,
|
ActionButtonType.delete,
|
||||||
ActionButtonType.removeFromLockFolder,
|
ActionButtonType.removeFromLockFolder,
|
||||||
|
|||||||
@@ -962,4 +962,102 @@ void main() {
|
|||||||
expect(nonArchivedWidgets, isNotEmpty);
|
expect(nonArchivedWidgets, isNotEmpty);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
group('ActionButtonBuilder.getViewerBottomBarTypes', () {
|
||||||
|
test('should return correct button types for shared album with activity', () {
|
||||||
|
final remoteAsset = createRemoteAsset();
|
||||||
|
final album = createRemoteAlbum(isActivityEnabled: true, isShared: true);
|
||||||
|
final context = ActionButtonContext(
|
||||||
|
asset: remoteAsset,
|
||||||
|
isOwner: true,
|
||||||
|
isArchived: false,
|
||||||
|
isTrashEnabled: true,
|
||||||
|
isInLockedView: false,
|
||||||
|
currentAlbum: album,
|
||||||
|
advancedTroubleshooting: false,
|
||||||
|
isStacked: false,
|
||||||
|
source: ActionSource.viewer,
|
||||||
|
buttonPosition: ButtonPosition.bottomBar,
|
||||||
|
);
|
||||||
|
|
||||||
|
final types = ActionButtonBuilder.getViewerBottomBarTypes(context);
|
||||||
|
|
||||||
|
expect(types.length, 4);
|
||||||
|
expect(types[0], ActionButtonType.share);
|
||||||
|
expect(types[1], ActionButtonType.addTo);
|
||||||
|
expect(types[2], ActionButtonType.openActivity);
|
||||||
|
expect(types[3], ActionButtonType.likeActivity);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct button types for local only asset', () {
|
||||||
|
final localAsset = createLocalAsset();
|
||||||
|
final context = ActionButtonContext(
|
||||||
|
asset: localAsset,
|
||||||
|
isOwner: true,
|
||||||
|
isArchived: false,
|
||||||
|
isTrashEnabled: true,
|
||||||
|
isInLockedView: false,
|
||||||
|
currentAlbum: null,
|
||||||
|
advancedTroubleshooting: false,
|
||||||
|
isStacked: false,
|
||||||
|
source: ActionSource.viewer,
|
||||||
|
buttonPosition: ButtonPosition.bottomBar,
|
||||||
|
);
|
||||||
|
|
||||||
|
final types = ActionButtonBuilder.getViewerBottomBarTypes(context);
|
||||||
|
|
||||||
|
expect(types.length, 4);
|
||||||
|
expect(types[0], ActionButtonType.share);
|
||||||
|
expect(types[1], ActionButtonType.upload);
|
||||||
|
expect(types[2], ActionButtonType.editImage);
|
||||||
|
expect(types[3], ActionButtonType.deleteLocal);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct button types for locked view', () {
|
||||||
|
final remoteAsset = createRemoteAsset();
|
||||||
|
final context = ActionButtonContext(
|
||||||
|
asset: remoteAsset,
|
||||||
|
isOwner: true,
|
||||||
|
isArchived: false,
|
||||||
|
isTrashEnabled: false,
|
||||||
|
isInLockedView: true,
|
||||||
|
currentAlbum: null,
|
||||||
|
advancedTroubleshooting: false,
|
||||||
|
isStacked: false,
|
||||||
|
source: ActionSource.viewer,
|
||||||
|
buttonPosition: ButtonPosition.bottomBar,
|
||||||
|
);
|
||||||
|
|
||||||
|
final types = ActionButtonBuilder.getViewerBottomBarTypes(context);
|
||||||
|
|
||||||
|
expect(types.length, 3);
|
||||||
|
expect(types[0], ActionButtonType.share);
|
||||||
|
expect(types[1], ActionButtonType.removeFromLockFolder);
|
||||||
|
expect(types[2], ActionButtonType.deletePermanent);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return correct button types for remote only asset', () {
|
||||||
|
final remoteAsset = createRemoteAsset();
|
||||||
|
final context = ActionButtonContext(
|
||||||
|
asset: remoteAsset,
|
||||||
|
isOwner: true,
|
||||||
|
isArchived: false,
|
||||||
|
isTrashEnabled: true,
|
||||||
|
isInLockedView: false,
|
||||||
|
currentAlbum: null,
|
||||||
|
advancedTroubleshooting: false,
|
||||||
|
isStacked: false,
|
||||||
|
source: ActionSource.viewer,
|
||||||
|
buttonPosition: ButtonPosition.bottomBar,
|
||||||
|
);
|
||||||
|
|
||||||
|
final types = ActionButtonBuilder.getViewerBottomBarTypes(context);
|
||||||
|
|
||||||
|
expect(types.length, 4);
|
||||||
|
expect(types[0], ActionButtonType.share);
|
||||||
|
expect(types[1], ActionButtonType.editImage);
|
||||||
|
expect(types[2], ActionButtonType.addTo);
|
||||||
|
expect(types[3], ActionButtonType.delete);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user