mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
[WIP] Topics
This commit is contained in:
@@ -19,6 +19,7 @@ import ChatListSearchItemHeader
|
||||
import ChatListUI
|
||||
import ItemListPeerActionItem
|
||||
import TelegramStringFormatting
|
||||
import NotificationPeerExceptionController
|
||||
|
||||
private final class NotificationExceptionState : Equatable {
|
||||
let mode: NotificationExceptionMode
|
||||
@@ -66,227 +67,6 @@ private final class NotificationExceptionState : Equatable {
|
||||
}
|
||||
}
|
||||
|
||||
public struct NotificationExceptionWrapper : Equatable {
|
||||
let settings: TelegramPeerNotificationSettings
|
||||
let date: TimeInterval?
|
||||
let peer: Peer
|
||||
init(settings: TelegramPeerNotificationSettings, peer: Peer, date: TimeInterval? = nil) {
|
||||
self.settings = settings
|
||||
self.date = date
|
||||
self.peer = peer
|
||||
}
|
||||
|
||||
public static func ==(lhs: NotificationExceptionWrapper, rhs: NotificationExceptionWrapper) -> Bool {
|
||||
return lhs.settings == rhs.settings && lhs.date == rhs.date
|
||||
}
|
||||
|
||||
func withUpdatedSettings(_ settings: TelegramPeerNotificationSettings) -> NotificationExceptionWrapper {
|
||||
return NotificationExceptionWrapper(settings: settings, peer: self.peer, date: self.date)
|
||||
}
|
||||
|
||||
func updateSettings(_ f: (TelegramPeerNotificationSettings) -> TelegramPeerNotificationSettings) -> NotificationExceptionWrapper {
|
||||
return NotificationExceptionWrapper(settings: f(self.settings), peer: self.peer, date: self.date)
|
||||
}
|
||||
|
||||
|
||||
func withUpdatedDate(_ date: TimeInterval) -> NotificationExceptionWrapper {
|
||||
return NotificationExceptionWrapper(settings: self.settings, peer: self.peer, date: date)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public enum NotificationExceptionMode : Equatable {
|
||||
fileprivate enum Mode {
|
||||
case users
|
||||
case groups
|
||||
case channels
|
||||
}
|
||||
|
||||
public static func == (lhs: NotificationExceptionMode, rhs: NotificationExceptionMode) -> Bool {
|
||||
switch lhs {
|
||||
case let .users(lhsValue):
|
||||
if case let .users(rhsValue) = rhs {
|
||||
return lhsValue == rhsValue
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .groups(lhsValue):
|
||||
if case let .groups(rhsValue) = rhs {
|
||||
return lhsValue == rhsValue
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .channels(lhsValue):
|
||||
if case let .channels(rhsValue) = rhs {
|
||||
return lhsValue == rhsValue
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate var mode: Mode {
|
||||
switch self {
|
||||
case .users:
|
||||
return .users
|
||||
case .groups:
|
||||
return .groups
|
||||
case .channels:
|
||||
return .channels
|
||||
}
|
||||
}
|
||||
|
||||
var isEmpty: Bool {
|
||||
switch self {
|
||||
case let .users(value), let .groups(value), let .channels(value):
|
||||
return value.isEmpty
|
||||
}
|
||||
}
|
||||
|
||||
case users([PeerId : NotificationExceptionWrapper])
|
||||
case groups([PeerId : NotificationExceptionWrapper])
|
||||
case channels([PeerId : NotificationExceptionWrapper])
|
||||
|
||||
func withUpdatedPeerSound(_ peer: Peer, _ sound: PeerMessageSound) -> NotificationExceptionMode {
|
||||
let apply:([PeerId : NotificationExceptionWrapper], PeerId, PeerMessageSound) -> [PeerId : NotificationExceptionWrapper] = { values, peerId, sound in
|
||||
var values = values
|
||||
if let value = values[peerId] {
|
||||
switch sound {
|
||||
case .default:
|
||||
switch value.settings.muteState {
|
||||
case .default:
|
||||
values.removeValue(forKey: peerId)
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedMessageSound(sound)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedMessageSound(sound)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
} else {
|
||||
switch sound {
|
||||
case .default:
|
||||
break
|
||||
default:
|
||||
values[peerId] = NotificationExceptionWrapper(settings: TelegramPeerNotificationSettings(muteState: .default, messageSound: sound, displayPreviews: .default), peer: peer, date: Date().timeIntervalSince1970)
|
||||
}
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
switch self {
|
||||
case let .groups(values):
|
||||
return .groups(apply(values, peer.id, sound))
|
||||
case let .users(values):
|
||||
return .users(apply(values, peer.id, sound))
|
||||
case let .channels(values):
|
||||
return .channels(apply(values, peer.id, sound))
|
||||
}
|
||||
}
|
||||
|
||||
func withUpdatedPeerMuteInterval(_ peer: Peer, _ muteInterval: Int32?) -> NotificationExceptionMode {
|
||||
let apply:([PeerId : NotificationExceptionWrapper], PeerId, PeerMuteState) -> [PeerId : NotificationExceptionWrapper] = { values, peerId, muteState in
|
||||
var values = values
|
||||
if let value = values[peerId] {
|
||||
switch muteState {
|
||||
case .default:
|
||||
switch value.settings.messageSound {
|
||||
case .default:
|
||||
values.removeValue(forKey: peerId)
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedMuteState(muteState)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedMuteState(muteState)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
} else {
|
||||
switch muteState {
|
||||
case .default:
|
||||
break
|
||||
default:
|
||||
values[peerId] = NotificationExceptionWrapper(settings: TelegramPeerNotificationSettings(muteState: muteState, messageSound: .default, displayPreviews: .default), peer: peer, date: Date().timeIntervalSince1970)
|
||||
}
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
let muteState: PeerMuteState
|
||||
if let muteInterval = muteInterval {
|
||||
if muteInterval == 0 {
|
||||
muteState = .unmuted
|
||||
} else {
|
||||
let absoluteUntil: Int32
|
||||
if muteInterval == Int32.max {
|
||||
absoluteUntil = Int32.max
|
||||
} else {
|
||||
absoluteUntil = muteInterval
|
||||
}
|
||||
muteState = .muted(until: absoluteUntil)
|
||||
}
|
||||
} else {
|
||||
muteState = .default
|
||||
}
|
||||
switch self {
|
||||
case let .groups(values):
|
||||
return .groups(apply(values, peer.id, muteState))
|
||||
case let .users(values):
|
||||
return .users(apply(values, peer.id, muteState))
|
||||
case let .channels(values):
|
||||
return .channels(apply(values, peer.id, muteState))
|
||||
}
|
||||
}
|
||||
|
||||
func withUpdatedPeerDisplayPreviews(_ peer: Peer, _ displayPreviews: PeerNotificationDisplayPreviews) -> NotificationExceptionMode {
|
||||
let apply:([PeerId : NotificationExceptionWrapper], PeerId, PeerNotificationDisplayPreviews) -> [PeerId : NotificationExceptionWrapper] = { values, peerId, displayPreviews in
|
||||
var values = values
|
||||
if let value = values[peerId] {
|
||||
switch displayPreviews {
|
||||
case .default:
|
||||
switch value.settings.displayPreviews {
|
||||
case .default:
|
||||
values.removeValue(forKey: peerId)
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedDisplayPreviews(displayPreviews)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
default:
|
||||
values[peerId] = value.updateSettings({$0.withUpdatedDisplayPreviews(displayPreviews)}).withUpdatedDate(Date().timeIntervalSince1970)
|
||||
}
|
||||
} else {
|
||||
switch displayPreviews {
|
||||
case .default:
|
||||
break
|
||||
default:
|
||||
values[peerId] = NotificationExceptionWrapper(settings: TelegramPeerNotificationSettings(muteState: .unmuted, messageSound: .default, displayPreviews: displayPreviews), peer: peer, date: Date().timeIntervalSince1970)
|
||||
}
|
||||
}
|
||||
return values
|
||||
}
|
||||
|
||||
switch self {
|
||||
case let .groups(values):
|
||||
return .groups(apply(values, peer.id, displayPreviews))
|
||||
case let .users(values):
|
||||
return .users(apply(values, peer.id, displayPreviews))
|
||||
case let .channels(values):
|
||||
return .channels(apply(values, peer.id, displayPreviews))
|
||||
}
|
||||
}
|
||||
|
||||
var peerIds: [PeerId] {
|
||||
switch self {
|
||||
case let .users(settings), let .groups(settings), let .channels(settings):
|
||||
return settings.map {$0.key}
|
||||
}
|
||||
}
|
||||
|
||||
var settings: [PeerId : NotificationExceptionWrapper] {
|
||||
switch self {
|
||||
case let .users(settings), let .groups(settings), let .channels(settings):
|
||||
return settings
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func notificationsExceptionEntries(presentationData: PresentationData, notificationSoundList: NotificationSoundList?, state: NotificationExceptionState, query: String? = nil, foundPeers: [RenderedPeer] = []) -> [NotificationExceptionEntry] {
|
||||
var entries: [NotificationExceptionEntry] = []
|
||||
|
||||
|
||||
Reference in New Issue
Block a user