import Foundation
import ThreemaMacros
final class NotificationActionProvider {
// MARK: - Identifiers
enum Action: String {
case replyAction = "REPLY_MESSAGE"
case callBackAction = "CALLBACK"
case thumbsUpEmojiAction = "THUMBSUPEMOJI"
case thumbsDownEmojiAction = "THUMBSDOWNEMOJI"
case heartEmojiAction = "HEARTEMOJI"
case laughterEmojiAction = "LAUGHTEREMOJI"
case cryingEmojiAction = "CRYINGEMOJI"
case foldedHandsEmojiAction = "FOLDEDHANDSEMOJI"
private var title: String {
switch self {
case .replyAction:
#localize("decryption_push_reply")
case .callBackAction:
#localize("call_back")
case .thumbsUpEmojiAction:
ReactionsManager.preferredEmojiVariant(for: .thumbsUp).rawValue
case .thumbsDownEmojiAction:
ReactionsManager.preferredEmojiVariant(for: .thumbsDown).rawValue
case .heartEmojiAction:
Emoji.redHeart.rawValue
case .laughterEmojiAction:
Emoji.faceWithTearsOfJoy.rawValue
case .cryingEmojiAction:
Emoji.cryingFace.rawValue
case .foldedHandsEmojiAction:
ReactionsManager.preferredEmojiVariant(for: .foldedHands).rawValue
}
}
private var options: UNNotificationActionOptions {
switch self {
case .replyAction, .thumbsUpEmojiAction, .thumbsDownEmojiAction, .heartEmojiAction, .laughterEmojiAction,
.cryingEmojiAction, .foldedHandsEmojiAction:
.authenticationRequired
case .callBackAction:
.foreground
}
}
private var icon: UNNotificationActionIcon? {
switch self {
case .replyAction:
UNNotificationActionIcon(systemImageName: "arrowshape.turn.up.left")
case .thumbsUpEmojiAction, .thumbsDownEmojiAction, .heartEmojiAction, .laughterEmojiAction,
.cryingEmojiAction, .foldedHandsEmojiAction:
nil
case .callBackAction:
UNNotificationActionIcon(systemImageName: "phone")
}
}
var action: UNNotificationAction {
switch self {
case .replyAction:
UNTextInputNotificationAction(
identifier: rawValue,
title: title,
options: options,
icon: icon,
textInputButtonTitle: #localize("send"),
textInputPlaceholder: #localize("decryption_push_placeholder")
)
case .thumbsUpEmojiAction, .thumbsDownEmojiAction, .heartEmojiAction, .laughterEmojiAction,
.cryingEmojiAction, .foldedHandsEmojiAction, .callBackAction:
UNNotificationAction(
identifier: rawValue,
title: title,
options: options,
icon: icon
)
}
}
static func isEmojiAction(identifier: String) -> Bool {
guard let action = Action(rawValue: identifier) else {
return false
}
return switch action {
case .replyAction, .callBackAction:
false
case .thumbsUpEmojiAction, .thumbsDownEmojiAction, .heartEmojiAction, .laughterEmojiAction,
.cryingEmojiAction, .foldedHandsEmojiAction:
true
}
}
static func emoji(for identifier: String) -> EmojiVariant? {
guard let action = Action(rawValue: identifier) else {
return nil
}
switch action {
case .replyAction, .callBackAction:
return nil
case .thumbsUpEmojiAction:
return ReactionsManager.preferredEmojiVariant(for: .thumbsUp)
case .thumbsDownEmojiAction:
return ReactionsManager.preferredEmojiVariant(for: .thumbsDown)
case .heartEmojiAction:
return EmojiVariant(base: .redHeart, skintone: nil)
case .laughterEmojiAction:
return EmojiVariant(base: .faceWithTearsOfJoy, skintone: nil)
case .cryingEmojiAction:
return EmojiVariant(base: .cryingFace, skintone: nil)
case .foldedHandsEmojiAction:
return ReactionsManager.preferredEmojiVariant(for: .foldedHands)
}
}
}
enum Category: String {
case singleCategory = "SINGLE"
case groupCategory = "GROUP"
case callCategory = "CALL"
private var actions: [UNNotificationAction] {
switch self {
case .singleCategory, .groupCategory:
[
Action.replyAction.action,
Action.thumbsUpEmojiAction.action,
Action.thumbsDownEmojiAction.action,
Action.heartEmojiAction.action,
Action.laughterEmojiAction.action,
Action.cryingEmojiAction.action,
Action.foldedHandsEmojiAction.action,
]
case .callCategory:
[Action.replyAction.action, Action.callBackAction.action]
}
}
var category: UNNotificationCategory {
UNNotificationCategory(identifier: rawValue, actions: actions, intentIdentifiers: [])
}
}
lazy var defaultCategories: Set<UNNotificationCategory> = [
Category.callCategory.category,
Category.singleCategory.category,
Category.groupCategory.category,
]
}
¤ Dauer der Verarbeitung: 0.10 Sekunden
¤
*© Formatika GbR, Deutschland
|
|