iOS: accept images in NSE if enabled, reorder chats when coming from background (#800)

* ios: automatically accept images in NSE, if enabled in settings

* remove unnecessary TODOs

* reorder chat when coming from background
This commit is contained in:
Evgeny Poberezkin
2022-07-10 14:28:00 +01:00
committed by GitHub
parent 4408495cfb
commit f16d8842b2
8 changed files with 62 additions and 21 deletions

View File

@@ -58,9 +58,9 @@ final class ChatModel: ObservableObject {
chats.firstIndex(where: { $0.id == id })
}
func addChat(_ chat: Chat) {
func addChat(_ chat: Chat, at position: Int = 0) {
withAnimation {
chats.insert(chat, at: 0)
chats.insert(chat, at: position)
}
}
@@ -104,13 +104,22 @@ final class ChatModel: ObservableObject {
}
func updateChats(with newChats: [ChatData]) {
for c in newChats {
if let chat = getChat(c.id) {
for i in 0..<newChats.count {
let c = newChats[i]
if let j = getChatIndex(c.id) {
let chat = chats[j]
chat.chatInfo = c.chatInfo
chat.chatItems = c.chatItems
chat.chatStats = c.chatStats
if i != j {
if chatId != c.chatInfo.id {
popChat_(j, to: i)
} else if i == 0 {
chatToTop = c.chatInfo.id
}
}
} else {
addChat(Chat(c))
addChat(Chat(c), at: i)
}
}
}
@@ -247,9 +256,9 @@ final class ChatModel: ObservableObject {
}
}
private func popChat_(_ i: Int) {
private func popChat_(_ i: Int, to position: Int = 0) {
let chat = chats.remove(at: i)
chats.insert(chat, at: 0)
chats.insert(chat, at: position)
}
func removeChat(_ id: String) {

View File

@@ -428,7 +428,7 @@ func receiveFile(fileId: Int64) async {
func apiReceiveFile(fileId: Int64) async throws -> AChatItem {
let r = await chatSendCmd(.receiveFile(fileId: fileId))
if case .rcvFileAccepted(let chatItem) = r { return chatItem }
if case let .rcvFileAccepted(chatItem) = r { return chatItem }
throw r
}

View File

@@ -25,6 +25,7 @@ struct SimpleXApp: App {
init() {
hs_init(0, nil)
UserDefaults.standard.register(defaults: appDefaults)
setGroupDefaults()
setDbContainer()
BGManager.shared.register()
NtfManager.shared.registerCategories()

View File

@@ -59,7 +59,7 @@ struct ChatView: View {
}
markAllRead()
}
.onChange(of: chatModel.chatItems.count) { _ in
.onChange(of: chatModel.chatItems.last?.id) { _ in
scrollToBottom(proxy)
}
.onChange(of: keyboardVisible) { _ in

View File

@@ -7,6 +7,7 @@
//
import SwiftUI
import SimpleXChat
struct PrivacySettings: View {
@AppStorage(DEFAULT_PRIVACY_ACCEPT_IMAGES) private var autoAcceptImages = true
@@ -21,6 +22,7 @@ struct PrivacySettings: View {
Section("Chats") {
settingsRow("photo") {
Toggle("Auto-accept images", isOn: $autoAcceptImages)
.onChange(of: autoAcceptImages) { privacyAcceptImagesGroupDefault.set($0) }
}
settingsRow("network") {
Toggle("Send link previews", isOn: $useLinkPreviews)

View File

@@ -43,6 +43,10 @@ private var indent: CGFloat = 36
let chatArchiveTimeDefault = DateDefault(defaults: UserDefaults.standard, forKey: DEFAULT_CHAT_ARCHIVE_TIME)
func setGroupDefaults() {
privacyAcceptImagesGroupDefault.set(UserDefaults.standard.bool(forKey: DEFAULT_PRIVACY_ACCEPT_IMAGES))
}
struct SettingsView: View {
@Environment(\.colorScheme) var colorScheme
@EnvironmentObject var chatModel: ChatModel

View File

@@ -111,27 +111,23 @@ func receiveMessageForNotification() -> UNNotificationContent? {
if let res = recvSimpleXMsg() {
logger.debug("NotificationService receiveMessages: \(res.responseType)")
switch res {
// case let .newContactConnection(connection):
// case let .contactConnectionDeleted(connection):
case let .contactConnected(contact):
return createContactConnectedNtf(contact)
// case let .contactConnecting(contact):
// TODO profile update
case let .receivedContactRequest(contactRequest):
return createContactRequestNtf(contactRequest)
// case let .contactUpdated(toContact):
// TODO profile updated
case let .newChatItem(aChatItem):
let cInfo = aChatItem.chatInfo
let cItem = aChatItem.chatItem
var cItem = aChatItem.chatItem
if case .image = cItem.content.msgContent {
if let file = cItem.file,
file.fileSize <= maxImageSize,
privacyAcceptImagesGroupDefault.get() {
cItem = apiReceiveFile(fileId: file.fileId)?.chatItem ?? cItem
}
}
return createMessageReceivedNtf(cInfo, cItem)
// case let .chatItemUpdated(aChatItem):
// TODO message updated
// let cInfo = aChatItem.chatInfo
// let cItem = aChatItem.chatItem
// NtfManager.shared.notifyMessageReceived(cInfo, cItem)
// case let .chatItemDeleted(_, toChatItem):
// TODO message updated
// case let .rcvFileComplete(aChatItem):
// TODO file received?
// let cInfo = aChatItem.chatInfo
@@ -183,6 +179,13 @@ func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
return nil
}
func apiReceiveFile(fileId: Int64) -> AChatItem? {
let r = sendSimpleXCmd(.receiveFile(fileId: fileId))
if case let .rcvFileAccepted(chatItem) = r { return chatItem }
logger.error("receiveFile error: \(responseError(r))")
return nil
}
struct NtfMessages {
var connEntity: ConnectionEntity?
var msgTs: Date?

View File

@@ -13,6 +13,7 @@ let GROUP_DEFAULT_APP_STATE = "appState"
let GROUP_DEFAULT_DB_CONTAINER = "dbContainer"
public let GROUP_DEFAULT_CHAT_LAST_START = "chatLastStart"
let GROUP_DEFAULT_NTF_PREVIEW_MODE = "ntfPreviewMode"
let GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES = "privacyAcceptImages"
let APP_GROUP_NAME = "group.chat.simplex.app"
@@ -59,6 +60,8 @@ public let ntfPreviewModeGroupDefault = EnumDefault<NotificationPreviewMode>(
withDefault: .message
)
public let privacyAcceptImagesGroupDefault = BoolDefault(defaults: groupDefaults, forKey: GROUP_DEFAULT_PRIVACY_ACCEPT_IMAGES)
public class DateDefault {
var defaults: UserDefaults
var key: String
@@ -103,3 +106,22 @@ public class EnumDefault<T: RawRepresentable> where T.RawValue == String {
defaults.synchronize()
}
}
public class BoolDefault {
var defaults: UserDefaults
var key: String
public init(defaults: UserDefaults = UserDefaults.standard, forKey: String) {
self.defaults = defaults
self.key = forKey
}
public func get() -> Bool {
defaults.bool(forKey: key)
}
public func set(_ value: Bool) {
defaults.set(value, forKey: key)
defaults.synchronize()
}
}