Merge pull request #135 from tootsuite/feature/visibility

Feature/visibility
This commit is contained in:
sxiaojian88 2021-05-11 09:52:20 +08:00 committed by GitHub
commit eed01c4ebb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 65 additions and 26 deletions

View File

@ -8,7 +8,7 @@
import Foundation
import CoreData
public protocol Managed: class, NSFetchRequestResult {
public protocol Managed: AnyObject, NSFetchRequestResult {
static var entityName: String { get }
static var defaultSortDescriptors: [NSSortDescriptor] { get }
}

View File

@ -7,7 +7,7 @@
import UIKit
protocol NeedsDependency: class {
protocol NeedsDependency: AnyObject {
var context: AppContext! { get set }
var coordinator: SceneCoordinator! { get set }
}

View File

@ -50,7 +50,7 @@ extension ComposeStatusItem {
}
}
protocol ComposePollAttributeDelegate: class {
protocol ComposePollAttributeDelegate: AnyObject {
func composePollAttribute(_ attribute: ComposeStatusItem.ComposePollOptionAttribute, pollOptionDidChange: String?)
}

View File

@ -197,6 +197,20 @@ extension StatusSection {
emojiDict: (status.reblog ?? status).emojiDict
)
// set visibility
if let visibility = (status.reblog ?? status).visibility {
cell.statusView.updateVisibility(visibility: visibility)
cell.statusView.revealContentWarningButton.publisher(for: \.isHidden)
.receive(on: DispatchQueue.main)
.sink { [weak cell] isHidden in
cell?.statusView.visibilityImageView.isHidden = !isHidden
}
.store(in: &cell.disposeBag)
} else {
cell.statusView.visibilityImageView.isHidden = true
}
// prepare media attachments
let mediaAttachments = Array((status.reblog ?? status).mediaAttachments ?? []).sorted { $0.index.compare($1.index) == .orderedAscending }

View File

@ -7,7 +7,7 @@
import UIKit
protocol ContentOffsetAdjustableTimelineViewControllerDelegate: class {
protocol ContentOffsetAdjustableTimelineViewControllerDelegate: AnyObject {
func navigationBar() -> UINavigationBar?
}

View File

@ -8,6 +8,6 @@
import Foundation
import Combine
protocol DisposeBagCollectable: class {
protocol DisposeBagCollectable: AnyObject {
var disposeBag: Set<AnyCancellable> { get set }
}

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import Combine
protocol ComposeStatusAttachmentCollectionViewCellDelegate: class {
protocol ComposeStatusAttachmentCollectionViewCellDelegate: AnyObject {
func composeStatusAttachmentCollectionViewCell(_ cell: ComposeStatusAttachmentCollectionViewCell, removeButtonDidPressed button: UIButton)
}

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import Combine
protocol ComposeStatusPollExpiresOptionCollectionViewCellDelegate: class {
protocol ComposeStatusPollExpiresOptionCollectionViewCellDelegate: AnyObject {
func composeStatusPollExpiresOptionCollectionViewCell(_ cell: ComposeStatusPollExpiresOptionCollectionViewCell, didSelectExpiresOption expiresOption: ComposeStatusItem.ComposePollExpiresOptionAttribute.ExpiresOption)
}

View File

@ -8,7 +8,7 @@
import os.log
import UIKit
protocol ComposeStatusPollOptionAppendEntryCollectionViewCellDelegate: class {
protocol ComposeStatusPollOptionAppendEntryCollectionViewCellDelegate: AnyObject {
func composeStatusPollOptionAppendEntryCollectionViewCellDidPressed(_ cell: ComposeStatusPollOptionAppendEntryCollectionViewCell)
}

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import Combine
protocol ComposeStatusPollOptionCollectionViewCellDelegate: class {
protocol ComposeStatusPollOptionCollectionViewCellDelegate: AnyObject {
func composeStatusPollOptionCollectionViewCell(_ cell: ComposeStatusPollOptionCollectionViewCell, textFieldDidBeginEditing textField: UITextField)
func composeStatusPollOptionCollectionViewCell(_ cell: ComposeStatusPollOptionCollectionViewCell, textBeforeDeleteBackward text: String?)
func composeStatusPollOptionCollectionViewCell(_ cell: ComposeStatusPollOptionCollectionViewCell, pollOptionTextFieldDidReturn: UITextField)

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import MastodonSDK
protocol ComposeToolbarViewDelegate: class {
protocol ComposeToolbarViewDelegate: AnyObject {
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, cameraButtonDidPressed sender: UIButton, mediaSelectionType type: ComposeToolbarView.MediaSelectionType)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, pollButtonDidPressed sender: UIButton)
func composeToolbarView(_ composeToolbarView: ComposeToolbarView, emojiButtonDidPressed sender: UIButton)
@ -181,6 +181,15 @@ extension ComposeToolbarView {
}
}
func imageNameForTimeline() -> String {
switch self {
case .public: return "person.3"
case .unlisted: return "eye.slash"
case .private: return "person.crop.circle.badge.plus"
case .direct: return "at"
}
}
var visibility: Mastodon.Entity.Status.Visibility {
switch self {
case .public: return .public

View File

@ -8,7 +8,7 @@
import os.log
import UIKit
protocol HomeTimelineNavigationBarTitleViewDelegate: class {
protocol HomeTimelineNavigationBarTitleViewDelegate: AnyObject {
func homeTimelineNavigationBarTitleView(_ titleView: HomeTimelineNavigationBarTitleView, buttonDidPressed sender: UIButton)
}

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import MastodonSDK
protocol PickServerCategoriesCellDelegate: class {
protocol PickServerCategoriesCellDelegate: AnyObject {
func pickServerCategoriesCell(_ cell: PickServerCategoriesCell, collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
}

View File

@ -12,7 +12,7 @@ import MastodonSDK
import AlamofireImage
import Kanna
protocol PickServerCellDelegate: class {
protocol PickServerCellDelegate: AnyObject {
func pickServerCell(_ cell: PickServerCell, expandButtonPressed button: UIButton)
}

View File

@ -7,7 +7,7 @@
import UIKit
protocol PickServerSearchCellDelegate: class {
protocol PickServerSearchCellDelegate: AnyObject {
func pickServerSearchCell(_ cell: PickServerSearchCell, searchTextDidChange searchText: String?)
}

View File

@ -13,7 +13,7 @@ import AlamofireImage
import CropViewController
import TwitterTextEditor
protocol ProfileHeaderViewControllerDelegate: class {
protocol ProfileHeaderViewControllerDelegate: AnyObject {
func profileHeaderViewController(_ viewController: ProfileHeaderViewController, viewLayoutDidUpdate view: UIView)
func profileHeaderViewController(_ viewController: ProfileHeaderViewController, pageSegmentedControlValueChanged segmentedControl: UISegmentedControl, selectedSegmentIndex index: Int)
}

View File

@ -8,7 +8,7 @@
import os.log
import UIKit
protocol ProfileStatusDashboardViewDelegate: class {
protocol ProfileStatusDashboardViewDelegate: AnyObject {
func profileStatusDashboardView(_ dashboardView: ProfileStatusDashboardView, postDashboardMeterViewDidPressed dashboardMeterView: ProfileStatusDashboardMeterView)
func profileStatusDashboardView(_ dashboardView: ProfileStatusDashboardView, followingDashboardMeterViewDidPressed dashboardMeterView: ProfileStatusDashboardMeterView)
func profileStatusDashboardView(_ dashboardView: ProfileStatusDashboardView, followersDashboardMeterViewDidPressed dashboardMeterView: ProfileStatusDashboardMeterView)

View File

@ -10,7 +10,7 @@ import UIKit
import Pageboy
import Tabman
protocol ProfilePagingViewControllerDelegate: class {
protocol ProfilePagingViewControllerDelegate: AnyObject {
func profilePagingViewController(_ viewController: ProfilePagingViewController, didScrollToPostCustomScrollViewContainerController customScrollViewContainerController: ScrollViewContainer, atIndex index: Int)
}

View File

@ -8,7 +8,7 @@
import UIKit
import Combine
protocol SettingsAppearanceTableViewCellDelegate: class {
protocol SettingsAppearanceTableViewCellDelegate: AnyObject {
func settingsAppearanceCell(_ cell: SettingsAppearanceTableViewCell, didSelectAppearanceMode appearanceMode: SettingsItem.AppearanceMode)
}

View File

@ -8,7 +8,7 @@
import UIKit
import Combine
protocol SettingsToggleCellDelegate: class {
protocol SettingsToggleCellDelegate: AnyObject {
func settingsToggleCell(_ cell: SettingsToggleTableViewCell, switchValueDidChange switch: UISwitch)
}

View File

@ -9,7 +9,7 @@ import os.log
import AVKit
import UIKit
protocol PlayerContainerViewDelegate: class {
protocol PlayerContainerViewDelegate: AnyObject {
func playerContainerView(_ playerContainerView: PlayerContainerView, contentWarningOverlayViewDidPressed contentWarningOverlayView: ContentWarningOverlayView)
}

View File

@ -9,7 +9,7 @@ import os.log
import Foundation
import UIKit
protocol ContentWarningOverlayViewDelegate: class {
protocol ContentWarningOverlayViewDelegate: AnyObject {
func contentWarningOverlayViewDidPressed(_ contentWarningOverlayView: ContentWarningOverlayView)
}

View File

@ -122,6 +122,13 @@ final class StatusView: UIView {
return button
}()
let visibilityImageView: UIImageView = {
let imageView = UIImageView()
imageView.tintColor = Asset.Colors.Label.secondary.color
imageView.contentMode = .scaleAspectFit
return imageView
}()
let statusContainerStackView = UIStackView()
let statusMosaicImageViewContainer = MosaicImageViewContainer()
@ -317,6 +324,10 @@ extension StatusView {
authorContainerStackView.addArrangedSubview(revealContentWarningButton)
revealContentWarningButton.setContentHuggingPriority(.required - 2, for: .horizontal)
// visibility ImageView
authorContainerStackView.addArrangedSubview(visibilityImageView)
visibilityImageView.setContentHuggingPriority(.required - 2, for: .horizontal)
authorContainerStackView.translatesAutoresizingMaskIntoConstraints = false
authorContainerView.addSubview(authorContainerStackView)
NSLayoutConstraint.activate([
@ -479,6 +490,11 @@ extension StatusView {
// TODO: a11y
}
func updateVisibility(visibility: String) {
guard let visibility = ComposeToolbarView.VisibilitySelectionType(rawValue: visibility) else { return }
visibilityImageView.image = UIImage(systemName: visibility.imageNameForTimeline(), withConfiguration: UIImage.SymbolConfiguration(pointSize: 13, weight: .regular))
}
}
extension StatusView {

View File

@ -9,7 +9,7 @@ import os.log
import UIKit
import Combine
protocol ThreadReplyLoaderTableViewCellDelegate: class {
protocol ThreadReplyLoaderTableViewCellDelegate: AnyObject {
func threadReplyLoaderTableViewCell(_ cell: ThreadReplyLoaderTableViewCell, loadMoreButtonDidPressed button: UIButton)
}

View File

@ -10,7 +10,7 @@ import CoreData
import os.log
import UIKit
protocol TimelineMiddleLoaderTableViewCellDelegate: class {
protocol TimelineMiddleLoaderTableViewCellDelegate: AnyObject {
func configure(cell: TimelineMiddleLoaderTableViewCell, upperTimelineStatusID: String?, timelineIndexobjectID:NSManagedObjectID?)
func timelineMiddleLoaderTableViewCell(_ cell: TimelineMiddleLoaderTableViewCell, loadMoreButtonDidPressed button: UIButton)
}

View File

@ -7,7 +7,7 @@
import UIKit
protocol DeleteBackwardResponseTextFieldDelegate: class {
protocol DeleteBackwardResponseTextFieldDelegate: AnyObject {
func deleteBackwardResponseTextField(_ textField: DeleteBackwardResponseTextField, textBeforeDelete: String?)
}

View File

@ -8,7 +8,7 @@
import os.log
import UIKit
protocol ActionToolbarContainerDelegate: class {
protocol ActionToolbarContainerDelegate: AnyObject {
func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, replayButtonDidPressed sender: UIButton)
func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, reblogButtonDidPressed sender: UIButton)
func actionToolbarContainer(_ actionToolbarContainer: ActionToolbarContainer, starButtonDidPressed sender: UIButton)

View File

@ -12,7 +12,7 @@ import Kingfisher
import GameplayKit
import MastodonSDK
protocol MastodonAttachmentServiceDelegate: class {
protocol MastodonAttachmentServiceDelegate: AnyObject {
func mastodonAttachmentService(_ service: MastodonAttachmentService, uploadStateDidChange state: MastodonAttachmentService.UploadState?)
}