feature: add follow request notification

This commit is contained in:
sunxiaojian 2021-04-27 14:27:27 +08:00
parent 14da561781
commit 42f63808df
8 changed files with 58 additions and 11 deletions

View File

@ -347,7 +347,8 @@
"favourite": "favorited your post", "favourite": "favorited your post",
"reblog": "rebloged your post", "reblog": "rebloged your post",
"poll": "Your poll has ended", "poll": "Your poll has ended",
"mention": "mentioned you" "mention": "mentioned you",
"follow_request": "request to follow you"
}, },
}, },
"thread": { "thread": {

View File

@ -51,7 +51,7 @@
"repositoryURL": "https://github.com/onevcat/Kingfisher.git", "repositoryURL": "https://github.com/onevcat/Kingfisher.git",
"state": { "state": {
"branch": null, "branch": null,
"revision": "bbc4bc4def7eb05a7ba8e1219f80ee9be327334e", "revision": "15d199e84677303a7004ed2c5ecaa1a90f3863f8",
"version": "6.2.1" "version": "6.2.1"
} }
}, },

View File

@ -108,6 +108,7 @@ extension NotificationSection {
if let actionImage = UIImage(systemName: actionImageName, withConfiguration: UIImage.SymbolConfiguration(pointSize: 12, weight: .semibold))?.withRenderingMode(.alwaysTemplate) { if let actionImage = UIImage(systemName: actionImageName, withConfiguration: UIImage.SymbolConfiguration(pointSize: 12, weight: .semibold))?.withRenderingMode(.alwaysTemplate) {
cell.actionImageView.image = actionImage cell.actionImageView.image = actionImage
} }
cell.buttonStackView.isHidden = (type != .followRequest)
return cell return cell
} }
case .bottomLoader: case .bottomLoader:

View File

@ -24,6 +24,8 @@ extension Mastodon.Entity.Notification.NotificationType {
color = Asset.Colors.Notification.mention.color color = Asset.Colors.Notification.mention.color
case .poll: case .poll:
color = Asset.Colors.brandBlue.color color = Asset.Colors.brandBlue.color
case .followRequest:
color = Asset.Colors.brandBlue.color
default: default:
color = .clear color = .clear
} }
@ -45,6 +47,8 @@ extension Mastodon.Entity.Notification.NotificationType {
actionText = L10n.Scene.Notification.Action.mention actionText = L10n.Scene.Notification.Action.mention
case .poll: case .poll:
actionText = L10n.Scene.Notification.Action.poll actionText = L10n.Scene.Notification.Action.poll
case .followRequest:
actionText = L10n.Scene.Notification.Action.followRequest
default: default:
actionText = "" actionText = ""
} }
@ -66,6 +70,8 @@ extension Mastodon.Entity.Notification.NotificationType {
actionImageName = "at" actionImageName = "at"
case .poll: case .poll:
actionImageName = "list.bullet" actionImageName = "list.bullet"
case .followRequest:
actionImageName = "person.crop.circle"
default: default:
actionImageName = "" actionImageName = ""
} }

View File

@ -371,6 +371,8 @@ internal enum L10n {
internal static let favourite = L10n.tr("Localizable", "Scene.Notification.Action.Favourite") internal static let favourite = L10n.tr("Localizable", "Scene.Notification.Action.Favourite")
/// followed you /// followed you
internal static let follow = L10n.tr("Localizable", "Scene.Notification.Action.Follow") internal static let follow = L10n.tr("Localizable", "Scene.Notification.Action.Follow")
/// request to follow you
internal static let followRequest = L10n.tr("Localizable", "Scene.Notification.Action.FollowRequest")
/// mentioned you /// mentioned you
internal static let mention = L10n.tr("Localizable", "Scene.Notification.Action.Mention") internal static let mention = L10n.tr("Localizable", "Scene.Notification.Action.Mention")
/// Your poll has ended /// Your poll has ended

View File

@ -125,6 +125,7 @@ tap the link to confirm your account.";
"Scene.HomeTimeline.Title" = "Home"; "Scene.HomeTimeline.Title" = "Home";
"Scene.Notification.Action.Favourite" = "favorited your post"; "Scene.Notification.Action.Favourite" = "favorited your post";
"Scene.Notification.Action.Follow" = "followed you"; "Scene.Notification.Action.Follow" = "followed you";
"Scene.Notification.Action.FollowRequest" = "request to follow you";
"Scene.Notification.Action.Mention" = "mentioned you"; "Scene.Notification.Action.Mention" = "mentioned you";
"Scene.Notification.Action.Poll" = "Your poll has ended"; "Scene.Notification.Action.Poll" = "Your poll has ended";
"Scene.Notification.Action.Reblog" = "rebloged your post"; "Scene.Notification.Action.Reblog" = "rebloged your post";

View File

@ -53,7 +53,7 @@ extension NotificationViewModel.LoadLatestState {
sinceID: nil, sinceID: nil,
minID: nil, minID: nil,
limit: nil, limit: nil,
excludeTypes: [.followRequest], excludeTypes: [],
accountID: nil accountID: nil
) )
viewModel.context.apiService.allNotifications( viewModel.context.apiService.allNotifications(

View File

@ -21,6 +21,10 @@ protocol NotificationTableViewCellDelegate: AnyObject {
func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, statusView: StatusView, contentWarningOverlayViewDidPressed contentWarningOverlayView: ContentWarningOverlayView) func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, statusView: StatusView, contentWarningOverlayViewDidPressed contentWarningOverlayView: ContentWarningOverlayView)
func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, statusView: StatusView, playerContainerView: PlayerContainerView, contentWarningOverlayViewDidPressed contentWarningOverlayView: ContentWarningOverlayView) func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, statusView: StatusView, playerContainerView: PlayerContainerView, contentWarningOverlayViewDidPressed contentWarningOverlayView: ContentWarningOverlayView)
// func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, notification: MastodonNotification, acceptButtonDidPressed button: UIButton)
//
// func notificationStatusTableViewCell(_ cell: NotificationStatusTableViewCell, notification: MastodonNotification, denyButtonDidPressed button: UIButton)
} }
final class NotificationTableViewCell: UITableViewCell { final class NotificationTableViewCell: UITableViewCell {
@ -76,6 +80,24 @@ final class NotificationTableViewCell: UITableViewCell {
return label return label
}() }()
let acceptButton: UIButton = {
let button = UIButton(type: .custom)
let actionImage = UIImage(systemName: "checkmark.circle.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 28, weight: .semibold))?.withRenderingMode(.alwaysTemplate)
button.setImage(actionImage, for: .normal)
button.tintColor = Asset.Colors.Label.secondary.color
return button
}()
let rejectButton: UIButton = {
let button = UIButton(type: .custom)
let actionImage = UIImage(systemName: "xmark.circle.fill", withConfiguration: UIImage.SymbolConfiguration(pointSize: 28, weight: .semibold))?.withRenderingMode(.alwaysTemplate)
button.setImage(actionImage, for: .normal)
button.tintColor = Asset.Colors.Label.secondary.color
return button
}()
let buttonStackView = UIStackView()
override func prepareForReuse() { override func prepareForReuse() {
super.prepareForReuse() super.prepareForReuse()
avatatImageView.af.cancelImageRequest() avatatImageView.af.cancelImageRequest()
@ -97,9 +119,8 @@ extension NotificationTableViewCell {
func configure() { func configure() {
let containerStackView = UIStackView() let containerStackView = UIStackView()
containerStackView.axis = .horizontal containerStackView.axis = .vertical
containerStackView.alignment = .center containerStackView.alignment = .fill
containerStackView.spacing = 4
containerStackView.layoutMargins = UIEdgeInsets(top: 14, left: 0, bottom: 12, right: 0) containerStackView.layoutMargins = UIEdgeInsets(top: 14, left: 0, bottom: 12, right: 0)
containerStackView.isLayoutMarginsRelativeArrangement = true containerStackView.isLayoutMarginsRelativeArrangement = true
containerStackView.translatesAutoresizingMaskIntoConstraints = false containerStackView.translatesAutoresizingMaskIntoConstraints = false
@ -110,8 +131,13 @@ extension NotificationTableViewCell {
contentView.readableContentGuide.trailingAnchor.constraint(equalTo: containerStackView.trailingAnchor), contentView.readableContentGuide.trailingAnchor.constraint(equalTo: containerStackView.trailingAnchor),
contentView.bottomAnchor.constraint(equalTo: containerStackView.bottomAnchor), contentView.bottomAnchor.constraint(equalTo: containerStackView.bottomAnchor),
]) ])
let horizontalStackView = UIStackView()
horizontalStackView.translatesAutoresizingMaskIntoConstraints = false
horizontalStackView.axis = .horizontal
horizontalStackView.spacing = 6
containerStackView.addArrangedSubview(avatarContainer) horizontalStackView.addArrangedSubview(avatarContainer)
avatarContainer.translatesAutoresizingMaskIntoConstraints = false avatarContainer.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([ NSLayoutConstraint.activate([
avatarContainer.heightAnchor.constraint(equalToConstant: 47).priority(.required - 1), avatarContainer.heightAnchor.constraint(equalToConstant: 47).priority(.required - 1),
@ -144,13 +170,23 @@ extension NotificationTableViewCell {
]) ])
nameLabel.translatesAutoresizingMaskIntoConstraints = false nameLabel.translatesAutoresizingMaskIntoConstraints = false
containerStackView.addArrangedSubview(nameLabel) horizontalStackView.addArrangedSubview(nameLabel)
actionLabel.translatesAutoresizingMaskIntoConstraints = false actionLabel.translatesAutoresizingMaskIntoConstraints = false
containerStackView.addArrangedSubview(actionLabel) horizontalStackView.addArrangedSubview(actionLabel)
nameLabel.setContentCompressionResistancePriority(.required - 1, for: .vertical) nameLabel.setContentCompressionResistancePriority(.required - 1, for: .horizontal)
nameLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal) nameLabel.setContentHuggingPriority(.required - 1, for: .horizontal)
actionLabel.setContentHuggingPriority(.defaultLow, for: .horizontal) actionLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
containerStackView.addArrangedSubview(horizontalStackView)
buttonStackView.translatesAutoresizingMaskIntoConstraints = false
buttonStackView.axis = .horizontal
buttonStackView.distribution = .fillEqually
acceptButton.translatesAutoresizingMaskIntoConstraints = false
denyButton.translatesAutoresizingMaskIntoConstraints = false
buttonStackView.addArrangedSubview(acceptButton)
buttonStackView.addArrangedSubview(rejectButton)
containerStackView.addArrangedSubview(buttonStackView)
} }
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {