mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 22:25:57 +00:00
Experimental widget settings
This commit is contained in:
@@ -7,6 +7,7 @@ import WidgetItems
|
||||
import TelegramPresentationData
|
||||
import NotificationsPresentationData
|
||||
import WidgetKit
|
||||
import TelegramUIPreferences
|
||||
|
||||
final class WidgetDataContext {
|
||||
private var currentAccount: Account?
|
||||
@@ -24,7 +25,7 @@ final class WidgetDataContext {
|
||||
return .single(.notAuthorized)
|
||||
}
|
||||
|
||||
enum RecentPeers {
|
||||
enum CombinedRecentPeers {
|
||||
struct Unread {
|
||||
var count: Int32
|
||||
var isMuted: Bool
|
||||
@@ -34,19 +35,47 @@ final class WidgetDataContext {
|
||||
case peers(peers: [Peer], unread: [PeerId: Unread])
|
||||
}
|
||||
|
||||
let recent: Signal<RecentPeers, NoError> = recentPeers(account: account)
|
||||
|> mapToSignal { recent -> Signal<RecentPeers, NoError> in
|
||||
let preferencesKey: PostboxViewKey = .preferences(keys: Set([
|
||||
ApplicationSpecificPreferencesKeys.widgetSettings
|
||||
]))
|
||||
let sourcePeers: Signal<RecentPeers, NoError> = account.postbox.combinedView(keys: [
|
||||
preferencesKey
|
||||
])
|
||||
|> mapToSignal { views -> Signal<RecentPeers, NoError> in
|
||||
let widgetSettings: WidgetSettings
|
||||
if let view = views.views[preferencesKey] as? PreferencesView, let value = view.values[ApplicationSpecificPreferencesKeys.widgetSettings] as? WidgetSettings {
|
||||
widgetSettings = value
|
||||
} else {
|
||||
widgetSettings = .default
|
||||
}
|
||||
|
||||
if widgetSettings.useHints {
|
||||
return recentPeers(account: account)
|
||||
} else {
|
||||
return account.postbox.transaction { transaction -> RecentPeers in
|
||||
return .peers(widgetSettings.peers.compactMap { peerId -> Peer? in
|
||||
guard let peer = transaction.getPeer(peerId) else {
|
||||
return nil
|
||||
}
|
||||
return peer
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let recent: Signal<CombinedRecentPeers, NoError> = sourcePeers
|
||||
|> mapToSignal { recent -> Signal<CombinedRecentPeers, NoError> in
|
||||
switch recent {
|
||||
case .disabled:
|
||||
return .single(.disabled)
|
||||
case let .peers(peers):
|
||||
return combineLatest(queue: .mainQueue(), peers.filter { !$0.isDeleted }.map { account.postbox.peerView(id: $0.id)}) |> mapToSignal { peerViews -> Signal<RecentPeers, NoError> in
|
||||
return combineLatest(queue: .mainQueue(), peers.filter { !$0.isDeleted }.map { account.postbox.peerView(id: $0.id)}) |> mapToSignal { peerViews -> Signal<CombinedRecentPeers, NoError> in
|
||||
return account.postbox.unreadMessageCountsView(items: peerViews.map {
|
||||
.peer($0.peerId)
|
||||
})
|
||||
|> map { values -> RecentPeers in
|
||||
|> map { values -> CombinedRecentPeers in
|
||||
var peers: [Peer] = []
|
||||
var unread: [PeerId: RecentPeers.Unread] = [:]
|
||||
var unread: [PeerId: CombinedRecentPeers.Unread] = [:]
|
||||
for peerView in peerViews {
|
||||
if let peer = peerViewMainPeer(peerView) {
|
||||
var isMuted: Bool = false
|
||||
@@ -61,7 +90,7 @@ final class WidgetDataContext {
|
||||
|
||||
let unreadCount = values.count(for: .peer(peerView.peerId))
|
||||
if let unreadCount = unreadCount, unreadCount > 0 {
|
||||
unread[peerView.peerId] = RecentPeers.Unread(count: Int32(unreadCount), isMuted: isMuted)
|
||||
unread[peerView.peerId] = CombinedRecentPeers.Unread(count: Int32(unreadCount), isMuted: isMuted)
|
||||
}
|
||||
|
||||
peers.append(peer)
|
||||
@@ -80,20 +109,20 @@ final class WidgetDataContext {
|
||||
return .disabled
|
||||
case let .peers(peers, unread):
|
||||
return .peers(WidgetDataPeers(accountPeerId: account.peerId.toInt64(), peers: peers.compactMap { peer -> WidgetDataPeer? in
|
||||
guard let user = peer as? TelegramUser else {
|
||||
return nil
|
||||
}
|
||||
|
||||
var name: String = ""
|
||||
var lastName: String?
|
||||
|
||||
if let firstName = user.firstName {
|
||||
name = firstName
|
||||
lastName = user.lastName
|
||||
} else if let lastName = user.lastName {
|
||||
name = lastName
|
||||
} else if let phone = user.phone, !phone.isEmpty {
|
||||
name = phone
|
||||
if let user = peer as? TelegramUser {
|
||||
if let firstName = user.firstName {
|
||||
name = firstName
|
||||
lastName = user.lastName
|
||||
} else if let lastName = user.lastName {
|
||||
name = lastName
|
||||
} else if let phone = user.phone, !phone.isEmpty {
|
||||
name = phone
|
||||
}
|
||||
} else {
|
||||
name = peer.debugDisplayTitle
|
||||
}
|
||||
|
||||
var badge: WidgetDataPeer.Badge?
|
||||
@@ -104,7 +133,7 @@ final class WidgetDataContext {
|
||||
)
|
||||
}
|
||||
|
||||
return WidgetDataPeer(id: user.id.toInt64(), name: name, lastName: lastName, letters: user.displayLetters, avatarPath: smallestImageRepresentation(user.photo).flatMap { representation in
|
||||
return WidgetDataPeer(id: peer.id.toInt64(), name: name, lastName: lastName, letters: peer.displayLetters, avatarPath: smallestImageRepresentation(peer.profileImageRepresentations).flatMap { representation in
|
||||
return account.postbox.mediaBox.resourcePath(representation.resource)
|
||||
}, badge: badge)
|
||||
}))
|
||||
|
||||
Reference in New Issue
Block a user