Make image clickable again (IOS-192)

This commit is contained in:
Nathan Mattes 2023-12-27 19:01:01 +01:00
parent dda0ae2d7c
commit 9e49775201
3 changed files with 56 additions and 90 deletions

View File

@ -140,60 +140,39 @@ extension DataSourceFacade {
case profileBanner(ProfileHeaderView) case profileBanner(ProfileHeaderView)
} }
func thumbnail() async -> UIImage? { func thumbnail() -> UIImage? {
return await imageView.image return imageView.image
} }
} }
@MainActor @MainActor
static func coordinateToMediaPreviewScene( static func coordinateToMediaPreviewScene(
dependency: NeedsDependency & MediaPreviewableViewController, dependency: NeedsDependency & MediaPreviewableViewController,
user: ManagedObjectRecord<MastodonUser>, account: Mastodon.Entity.Account,
previewContext: ImagePreviewContext previewContext: ImagePreviewContext
) async throws { ) async throws {
let managedObjectContext = dependency.context.managedObjectContext
var _avatarAssetURL: String? let avatarAssetURL = account.avatar
var _headerAssetURL: String? let headerAssetURL = account.header
try await managedObjectContext.perform { let thumbnail = previewContext.thumbnail()
guard let user = user.object(in: managedObjectContext) else { return }
_avatarAssetURL = user.avatar
_headerAssetURL = user.header
}
let thumbnail = await previewContext.thumbnail() let source: MediaPreviewTransitionItem.Source
let source: MediaPreviewTransitionItem.Source = {
switch previewContext.containerView { switch previewContext.containerView {
case .profileAvatar(let view): return .profileAvatar(view) case .profileAvatar(let view): source = .profileAvatar(view)
case .profileBanner(let view): return .profileBanner(view) case .profileBanner(let view): source = .profileBanner(view)
} }
}()
let mediaPreviewTransitionItem: MediaPreviewTransitionItem = { let mediaPreviewTransitionItem = MediaPreviewTransitionItem(
let item = MediaPreviewTransitionItem(
source: source, source: source,
previewableViewController: dependency previewableViewController: dependency
) )
let imageView = previewContext.imageView let imageView = previewContext.imageView
item.initialFrame = { mediaPreviewTransitionItem.initialFrame = imageView.superview?.convert(imageView.frame, to: nil)
let initialFrame = imageView.superview!.convert(imageView.frame, to: nil) mediaPreviewTransitionItem.image = thumbnail
assert(initialFrame != .zero) mediaPreviewTransitionItem.aspectRatio = thumbnail?.size ?? CGSize(width: 100, height: 100)
return initialFrame mediaPreviewTransitionItem.sourceImageViewCornerRadius = {
}()
item.image = thumbnail
item.aspectRatio = {
if let thumbnail = thumbnail {
return thumbnail.size
}
return CGSize(width: 100, height: 100)
}()
item.sourceImageViewCornerRadius = {
switch previewContext.containerView { switch previewContext.containerView {
case .profileAvatar: case .profileAvatar:
return ProfileHeaderView.avatarImageViewCornerRadius return ProfileHeaderView.avatarImageViewCornerRadius
@ -202,24 +181,19 @@ extension DataSourceFacade {
} }
}() }()
return item let mediaPreviewItem: MediaPreviewViewModel.PreviewItem
}()
let mediaPreviewItem: MediaPreviewViewModel.PreviewItem = {
switch previewContext.containerView { switch previewContext.containerView {
case .profileAvatar: case .profileAvatar:
return .profileAvatar(.init( mediaPreviewItem = .profileAvatar(.init(
assetURL: _avatarAssetURL, assetURL: avatarAssetURL,
thumbnail: thumbnail thumbnail: thumbnail
)) ))
case .profileBanner: case .profileBanner:
return .profileBanner(.init( mediaPreviewItem = .profileBanner(.init(
assetURL: _headerAssetURL, assetURL: headerAssetURL,
thumbnail: thumbnail thumbnail: thumbnail
)) ))
} }
}()
guard mediaPreviewItem.isAssetURLValid else { guard mediaPreviewItem.isAssetURLValid else {
return return

View File

@ -151,8 +151,8 @@ extension MediaPreviewViewModel {
return true // default valid return true // default valid
case .profileBanner(let item): case .profileBanner(let item):
guard let assertURL = item.assetURL else { return false } guard let assertURL = item.assetURL else { return false }
guard !assertURL.hasSuffix("missing.png") else { return false }
return true return assertURL.hasSuffix("missing.png") == false
} }
} }
} }

View File

@ -274,37 +274,29 @@ extension ProfileHeaderViewController {
// MARK: - ProfileHeaderViewDelegate // MARK: - ProfileHeaderViewDelegate
extension ProfileHeaderViewController: ProfileHeaderViewDelegate { extension ProfileHeaderViewController: ProfileHeaderViewDelegate {
func profileHeaderView(_ profileHeaderView: ProfileHeaderView, avatarButtonDidPressed button: AvatarButton) { func profileHeaderView(_ profileHeaderView: ProfileHeaderView, avatarButtonDidPressed button: AvatarButton) {
#warning("TODO: Implement") Task {
// guard let user = viewModel.user else { return } try await DataSourceFacade.coordinateToMediaPreviewScene(
// let record: ManagedObjectRecord<MastodonUser> = .init(objectID: user.objectID) dependency: self,
// account: viewModel.account,
// Task { previewContext: DataSourceFacade.ImagePreviewContext(
// try await DataSourceFacade.coordinateToMediaPreviewScene( imageView: button.avatarImageView,
// dependency: self, containerView: .profileAvatar(profileHeaderView)
// user: record, )
// previewContext: DataSourceFacade.ImagePreviewContext( )
// imageView: button.avatarImageView, }
// containerView: .profileAvatar(profileHeaderView)
// )
// )
// } // end Task
} }
func profileHeaderView(_ profileHeaderView: ProfileHeaderView, bannerImageViewDidPressed imageView: UIImageView) { func profileHeaderView(_ profileHeaderView: ProfileHeaderView, bannerImageViewDidPressed imageView: UIImageView) {
#warning("TODO: Implement") Task {
// guard let account = viewModel.account else { return } try await DataSourceFacade.coordinateToMediaPreviewScene(
// let record: ManagedObjectRecord<MastodonUser> = .init(objectID: user.objectID) dependency: self,
// account: viewModel.account,
// Task { previewContext: DataSourceFacade.ImagePreviewContext(
// try await DataSourceFacade.coordinateToMediaPreviewScene( imageView: imageView,
// dependency: self, containerView: .profileBanner(profileHeaderView)
// user: record, )
// previewContext: DataSourceFacade.ImagePreviewContext( )
// imageView: imageView, }
// containerView: .profileBanner(profileHeaderView)
// )
// )
// } // end Task
} }
func profileHeaderView( func profileHeaderView(