feat(mobile): add ButtonPosition enum and update action button context

This commit is contained in:
idubnori
2025-12-17 14:27:38 +09:00
parent c38ecab1a6
commit 939c222728
4 changed files with 106 additions and 2 deletions

View File

@@ -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 }

View File

@@ -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);

View File

@@ -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,

View File

@@ -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);
});
});
} }