diff --git a/Mastodon/Protocol/Provider/DataSourceFacade+Media.swift b/Mastodon/Protocol/Provider/DataSourceFacade+Media.swift index 45622dba4..9608d8257 100644 --- a/Mastodon/Protocol/Provider/DataSourceFacade+Media.swift +++ b/Mastodon/Protocol/Provider/DataSourceFacade+Media.swift @@ -140,87 +140,61 @@ extension DataSourceFacade { case profileBanner(ProfileHeaderView) } - func thumbnail() async -> UIImage? { - return await imageView.image + func thumbnail() -> UIImage? { + return imageView.image } } @MainActor static func coordinateToMediaPreviewScene( dependency: NeedsDependency & MediaPreviewableViewController, - user: ManagedObjectRecord, + account: Mastodon.Entity.Account, previewContext: ImagePreviewContext ) async throws { - let managedObjectContext = dependency.context.managedObjectContext + + let avatarAssetURL = account.avatar + let headerAssetURL = account.header + + let thumbnail = previewContext.thumbnail() - var _avatarAssetURL: String? - var _headerAssetURL: String? - - try await managedObjectContext.perform { - guard let user = user.object(in: managedObjectContext) else { return } - _avatarAssetURL = user.avatar - _headerAssetURL = user.header + let source: MediaPreviewTransitionItem.Source + switch previewContext.containerView { + case .profileAvatar(let view): source = .profileAvatar(view) + case .profileBanner(let view): source = .profileBanner(view) } - - let thumbnail = await previewContext.thumbnail() - - let source: MediaPreviewTransitionItem.Source = { + + let mediaPreviewTransitionItem = MediaPreviewTransitionItem( + source: source, + previewableViewController: dependency + ) + + let imageView = previewContext.imageView + mediaPreviewTransitionItem.initialFrame = imageView.superview?.convert(imageView.frame, to: nil) + mediaPreviewTransitionItem.image = thumbnail + mediaPreviewTransitionItem.aspectRatio = thumbnail?.size ?? CGSize(width: 100, height: 100) + mediaPreviewTransitionItem.sourceImageViewCornerRadius = { switch previewContext.containerView { - case .profileAvatar(let view): return .profileAvatar(view) - case .profileBanner(let view): return .profileBanner(view) - } - }() - - let mediaPreviewTransitionItem: MediaPreviewTransitionItem = { - let item = MediaPreviewTransitionItem( - source: source, - previewableViewController: dependency - ) - - let imageView = previewContext.imageView - item.initialFrame = { - let initialFrame = imageView.superview!.convert(imageView.frame, to: nil) - assert(initialFrame != .zero) - return initialFrame - }() - - item.image = thumbnail - - item.aspectRatio = { - if let thumbnail = thumbnail { - return thumbnail.size - } - return CGSize(width: 100, height: 100) - }() - - item.sourceImageViewCornerRadius = { - switch previewContext.containerView { case .profileAvatar: return ProfileHeaderView.avatarImageViewCornerRadius case .profileBanner: return 0 - } - }() - - return item + } }() - - - let mediaPreviewItem: MediaPreviewViewModel.PreviewItem = { - switch previewContext.containerView { + + let mediaPreviewItem: MediaPreviewViewModel.PreviewItem + switch previewContext.containerView { case .profileAvatar: - return .profileAvatar(.init( - assetURL: _avatarAssetURL, + mediaPreviewItem = .profileAvatar(.init( + assetURL: avatarAssetURL, thumbnail: thumbnail )) case .profileBanner: - return .profileBanner(.init( - assetURL: _headerAssetURL, + mediaPreviewItem = .profileBanner(.init( + assetURL: headerAssetURL, thumbnail: thumbnail )) - } - }() - + } + guard mediaPreviewItem.isAssetURLValid else { return } diff --git a/Mastodon/Scene/MediaPreview/MediaPreviewViewModel.swift b/Mastodon/Scene/MediaPreview/MediaPreviewViewModel.swift index a6b604d6f..9a3f5ed90 100644 --- a/Mastodon/Scene/MediaPreview/MediaPreviewViewModel.swift +++ b/Mastodon/Scene/MediaPreview/MediaPreviewViewModel.swift @@ -151,8 +151,8 @@ extension MediaPreviewViewModel { return true // default valid case .profileBanner(let item): guard let assertURL = item.assetURL else { return false } - guard !assertURL.hasSuffix("missing.png") else { return false } - return true + + return assertURL.hasSuffix("missing.png") == false } } } diff --git a/Mastodon/Scene/Profile/Header/ProfileHeaderViewController.swift b/Mastodon/Scene/Profile/Header/ProfileHeaderViewController.swift index a4f8af02d..6a8fceff9 100644 --- a/Mastodon/Scene/Profile/Header/ProfileHeaderViewController.swift +++ b/Mastodon/Scene/Profile/Header/ProfileHeaderViewController.swift @@ -268,43 +268,35 @@ extension ProfileHeaderViewController { profileHeaderView.avatarButton.alpha = alpha profileHeaderView.editAvatarBackgroundView.alpha = alpha } - + } // MARK: - ProfileHeaderViewDelegate extension ProfileHeaderViewController: ProfileHeaderViewDelegate { func profileHeaderView(_ profileHeaderView: ProfileHeaderView, avatarButtonDidPressed button: AvatarButton) { -#warning("TODO: Implement") -// guard let user = viewModel.user else { return } -// let record: ManagedObjectRecord = .init(objectID: user.objectID) -// -// Task { -// try await DataSourceFacade.coordinateToMediaPreviewScene( -// dependency: self, -// user: record, -// previewContext: DataSourceFacade.ImagePreviewContext( -// imageView: button.avatarImageView, -// containerView: .profileAvatar(profileHeaderView) -// ) -// ) -// } // end Task + Task { + try await DataSourceFacade.coordinateToMediaPreviewScene( + dependency: self, + account: viewModel.account, + previewContext: DataSourceFacade.ImagePreviewContext( + imageView: button.avatarImageView, + containerView: .profileAvatar(profileHeaderView) + ) + ) + } } func profileHeaderView(_ profileHeaderView: ProfileHeaderView, bannerImageViewDidPressed imageView: UIImageView) { -#warning("TODO: Implement") -// guard let account = viewModel.account else { return } -// let record: ManagedObjectRecord = .init(objectID: user.objectID) -// -// Task { -// try await DataSourceFacade.coordinateToMediaPreviewScene( -// dependency: self, -// user: record, -// previewContext: DataSourceFacade.ImagePreviewContext( -// imageView: imageView, -// containerView: .profileBanner(profileHeaderView) -// ) -// ) -// } // end Task + Task { + try await DataSourceFacade.coordinateToMediaPreviewScene( + dependency: self, + account: viewModel.account, + previewContext: DataSourceFacade.ImagePreviewContext( + imageView: imageView, + containerView: .profileBanner(profileHeaderView) + ) + ) + } } func profileHeaderView(