core, ui: chat banner (#6089)

* core: create banner item

* filter deletions

* fix query

* ios

* fixes

* remove comment

* revert diff

* refactor

* fix most tests

* fix tests

* spacer

* plans

* create banner for 1-time link initiator

* style in progress

* change background

* ui

* remove bio length limit

* ui

* create banner for client chat

* rename

* more contexts

* fix tests

* move

* fixed image size

* plans

* remove diff

* kotlin

* copy

* paddings

* paddings

* comment

* layout, messages

* fonts

* texts, icons

* kotlin refactor

* kotlin texts

* fix date

* Revert "fix date"

This reverts commit abbd48b334.

* date

* fix texts

* kotlin date

* color and corners

* kotlin

* color

* update banner, context menu in ios

* update texts, do not show epoch timestamp for banner

* fix texts

---------

Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com>
This commit is contained in:
spaced4ndy
2025-07-21 18:07:21 +00:00
committed by GitHub
parent ec061bcbb9
commit 68b7f09c8f
42 changed files with 1280 additions and 206 deletions
+1 -1
View File
@@ -316,7 +316,7 @@ func apiDeleteUser(_ userId: Int64, _ delSMPQueues: Bool, viewPwd: String?) asyn
}
func apiStartChat(ctrl: chat_ctrl? = nil) throws -> Bool {
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true, largeLinkData: false), ctrl: ctrl)
let r: ChatResponse0 = try chatSendCmdSync(.startChat(mainApp: true, enableSndFiles: true, largeLinkData: true), ctrl: ctrl)
switch r {
case .chatStarted: return true
case .chatRunning: return false
@@ -172,6 +172,7 @@ struct ChatItemContentView<Content: View>: View {
case let .rcvDirectE2EEInfo(e2eeInfo): CIEventView(eventText: directE2EEInfoText(e2eeInfo))
case .sndGroupE2EEInfo: CIEventView(eventText: e2eeInfoNoPQText())
case .rcvGroupE2EEInfo: CIEventView(eventText: e2eeInfoNoPQText())
case .chatBanner: EmptyView()
case let .invalidJSON(json): CIInvalidJSONView(json: json)
}
}
+175 -28
View File
@@ -730,33 +730,48 @@ struct ChatView: View {
case let .single(item, _, _): item.item
case let .grouped(items, _, _, _, _, _, _, _): items.boxedValue.last!.item
}
let voiceNoFrame = voiceWithoutFrame(ci)
let maxWidth = cInfo.chatType == .group
? voiceNoFrame
? (g.size.width - 28) - 42
: (g.size.width - 28) * 0.84 - 42
: voiceNoFrame
? (g.size.width - 32)
: (g.size.width - 32) * 0.84
return ChatItemWithMenu(
im: im,
chat: $chat,
index: index,
isLastItem: index == mergedItems.boxedValue.items.count - 1,
chatItem: ci,
scrollToItem: scrollToItem,
scrollToItemId: $scrollToItemId,
merged: mergedItem,
maxWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
showChatInfoSheet: $showChatInfoSheet,
revealedItems: $revealedItems,
selectedChatItems: $selectedChatItems,
forwardedChatItems: $forwardedChatItems,
searchText: $searchText,
closeKeyboardAndRun: closeKeyboardAndRun
)
return Group {
if case .chatBanner = ci.content {
VStack {
ChatBannerView(chat: chat)
.padding(.bottom, 90)
.padding(.top, 8)
let listItem = mergedItem.newest()
if let prevItem = listItem.prevItem {
DateSeparator(date: prevItem.meta.itemTs).padding(8)
}
}
} else {
let voiceNoFrame = voiceWithoutFrame(ci)
let maxWidth = cInfo.chatType == .group
? voiceNoFrame
? (g.size.width - 28) - 42
: (g.size.width - 28) * 0.84 - 42
: voiceNoFrame
? (g.size.width - 32)
: (g.size.width - 32) * 0.84
ChatItemWithMenu(
im: im,
chat: $chat,
index: index,
isLastItem: index == mergedItems.boxedValue.items.count - 1,
chatItem: ci,
scrollToItem: scrollToItem,
scrollToItemId: $scrollToItemId,
merged: mergedItem,
maxWidth: maxWidth,
composeState: $composeState,
selectedMember: $selectedMember,
showChatInfoSheet: $showChatInfoSheet,
revealedItems: $revealedItems,
selectedChatItems: $selectedChatItems,
forwardedChatItems: $forwardedChatItems,
searchText: $searchText,
closeKeyboardAndRun: closeKeyboardAndRun
)
}
}
// crashes on Cell size calculation without this line
.environmentObject(ChatModel.shared)
.environmentObject(theme) // crashes without this line when scrolling to the first unread in EndlessScrollVIew
@@ -804,6 +819,138 @@ struct ChatView: View {
}
}
struct ChatBannerView: View {
@EnvironmentObject var theme: AppTheme
@AppStorage(DEFAULT_CHAT_ITEM_ROUNDNESS) private var roundness = defaultChatItemRoundness
@ObservedObject var chat: Chat
var body: some View {
let v = VStack(spacing: 8) {
ChatInfoImage(chat: chat, size: alertProfileImageSize)
Text(chat.chatInfo.displayName)
.font(.title3)
.multilineTextAlignment(.center)
.lineLimit(2)
.fixedSize(horizontal: false, vertical: true)
.frame(maxWidth: 240)
let fullName = chat.chatInfo.fullName.trimmingCharacters(in: .whitespacesAndNewlines)
if fullName != "" && fullName != chat.chatInfo.displayName && fullName != chat.chatInfo.displayName.trimmingCharacters(in: .whitespacesAndNewlines) {
Text(chat.chatInfo.fullName)
.font(.subheadline)
.multilineTextAlignment(.center)
.lineLimit(3)
.fixedSize(horizontal: false, vertical: true)
.frame(maxWidth: 260)
}
if let shortDescr = chat.chatInfo.shortDescr {
Text(shortDescr)
.font(.subheadline)
.multilineTextAlignment(.center)
.lineLimit(4)
.fixedSize(horizontal: false, vertical: true)
.padding(.horizontal)
}
if let chatContext {
Text(chatContext)
.font(.callout)
.foregroundColor(theme.colors.secondary)
.padding(.top, 8)
}
}
.frame(maxWidth: .infinity)
.padding()
.background(theme.appColors.receivedMessage)
.clipShape(RoundedRectangle(cornerRadius: msgRectMaxRadius * roundness))
if let (label, connLink) = chatAddress() {
v.contextMenu {
Button {
let shareItems: [Any] = [connLink]
showShareSheet(items: shareItems)
} label: {
Label(label, systemImage: "square.and.arrow.up")
}
}
.padding(.horizontal)
} else {
v.padding(.horizontal)
}
}
func chatAddress() -> (label: LocalizedStringKey, connLink: String)? {
switch chat.chatInfo {
case let .direct(contact):
if !contact.nextConnectPrepared && !contact.nextAcceptContactRequest {
let connLink: String? = if let pct = contact.preparedContact, case .con = pct.uiConnLinkType {
pct.connLinkToConnect.simplexChatUri()
} else {
contact.profile.contactLink
}
if let connLink {
return ("SimpleX address", connLink)
}
}
case let .group(groupInfo, _):
if !groupInfo.nextConnectPrepared {
if let pg = groupInfo.preparedGroup {
let connLink = pg.connLinkToConnect.simplexChatUri()
switch groupInfo.businessChat?.chatType {
case .none: return ("Group link", connLink)
case .business: return ("Business address", connLink)
default: ()
}
}
}
default: ()
}
return nil
}
var chatContext: LocalizedStringKey? {
switch chat.chatInfo {
case let .direct(contact):
if contact.nextConnectPrepared, let linkType = contact.preparedContact?.uiConnLinkType {
switch linkType {
case .inv:
"Tap Connect to chat"
case .con:
"Tap Connect to send request"
}
} else if contact.nextAcceptContactRequest {
"Accept contact request"
} else {
"Your contact"
}
case let .group(groupInfo, _):
switch groupInfo.businessChat?.chatType {
case .none:
if groupInfo.nextConnectPrepared {
"Tap Join group"
} else {
switch (groupInfo.membership.memberStatus) {
case .memInvited: "Join group"
case .memCreator: "Your group"
default: "Group"
}
}
case .business:
if groupInfo.nextConnectPrepared {
"Tap Connect to chat"
} else {
"Business connection"
}
case .customer:
"Your business contact"
}
default: nil
}
}
}
private var connectingText: LocalizedStringKey? {
switch (chat.chatInfo) {
case let .direct(contact):
@@ -879,7 +1026,7 @@ struct ChatView: View {
var body: some View {
ZStack(alignment: .top) {
if let date = model.date {
if let date = model.date, date.timeIntervalSince1970 > 0 {
DateSeparator(date: date)
.padding(.vertical, 4).padding(.horizontal, 8)
.background(.thinMaterial)
@@ -364,7 +364,11 @@ struct ChatPreviewView: View {
}
case let .group(groupInfo, _):
if groupInfo.nextConnectPrepared {
Text("Open to join")
if groupInfo.businessChat?.chatType == .business {
Text("Open to connect")
} else {
Text("Open to join")
}
} else {
switch (groupInfo.membership.memberStatus) {
case .memRejected: Text("rejected")
@@ -76,7 +76,7 @@ struct ChatTailPadding: ViewModifier {
}
}
private let msgRectMaxRadius: Double = 18
let msgRectMaxRadius: Double = 18
private let msgBubbleMaxRadius: Double = msgRectMaxRadius * 1.2
private let msgTailWidth: Double = 9
private let msgTailMinHeight: Double = msgTailWidth * 1.254 // ~56deg
@@ -28,7 +28,11 @@ struct ProfileImage: View {
.resizable()
.foregroundColor(c)
.frame(width: size, height: size)
.background(Circle().fill(backgroundColor != nil ? backgroundColor! : .clear))
.background(
Circle()
.fill(backgroundColor != nil ? backgroundColor! : .clear)
.frame(width: size - 2, height: size - 2) // less than size of Image to avoid slightly visible border
)
}
}
}
@@ -1221,6 +1221,14 @@ swipe action</note>
<target>Подобрен интерфейс</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Черна</target>
@@ -1311,6 +1319,10 @@ swipe action</note>
<target>Бизнес чатове</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<note>No comment provided by engineer.</note>
@@ -2524,6 +2536,10 @@ swipe action</note>
<target>Описание</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Адрес на настолно устройство</target>
@@ -6758,10 +6774,6 @@ chat item action</note>
<source>Sent reply</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<note>No comment provided by engineer.</note>
@@ -6990,6 +7002,10 @@ chat item action</note>
<target>Сподели с контактите</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7367,10 +7383,22 @@ report reason</note>
<target>Направи снимка</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Докосни бутона </target>
@@ -8685,6 +8713,10 @@ Repeat connection request?</source>
<target>Вашият адрес в SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Вашите обаждания</target>
@@ -8717,6 +8749,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@).</target>
@@ -8746,6 +8782,10 @@ Repeat connection request?</source>
<target>Вашият текущ профил</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Вашите настройки</target>
@@ -1167,6 +1167,14 @@ swipe action</note>
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1245,6 +1253,10 @@ swipe action</note>
<source>Business chats</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<note>No comment provided by engineer.</note>
@@ -2420,6 +2432,10 @@ swipe action</note>
<target>Popis</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<note>No comment provided by engineer.</note>
@@ -6533,10 +6549,6 @@ chat item action</note>
<source>Sent reply</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<note>No comment provided by engineer.</note>
@@ -6761,6 +6773,10 @@ chat item action</note>
<target>Sdílet s kontakty</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7130,10 +7146,22 @@ report reason</note>
<target>Vyfotit</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Klepněte na tlačítko </target>
@@ -8393,6 +8421,10 @@ Repeat connection request?</source>
<target>Vaše SimpleX adresa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Vaše hovory</target>
@@ -8425,6 +8457,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@).</target>
@@ -8454,6 +8490,10 @@ Repeat connection request?</source>
<target>Váš současný profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Vaše preference</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Verbesserte Nutzer-Erfahrung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Schwarz</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>Geschäftliche Chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Unternehmen</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Beschreibung</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Desktop-Adresse</target>
@@ -7183,11 +7199,6 @@ chat item action</note>
<target>Gesendete Antwort</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Wird nach der Verbindung an Ihren Kontakt gesendet.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Summe aller gesendeten Nachrichten</target>
@@ -7444,6 +7455,10 @@ chat item action</note>
<target>Mit Kontakten teilen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Verkürzter Link</target>
@@ -7852,11 +7867,23 @@ report reason</note>
<target>Machen Sie ein Foto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Tippen Sie im Menü auf SimpleX-Adresse erstellen, um sie später zu erstellen.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Schaltfläche antippen </target>
@@ -9247,6 +9274,10 @@ Verbindungsanfrage wiederholen?</target>
<target>Ihre SimpleX-Adresse</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Anrufe</target>
@@ -9282,6 +9313,10 @@ Verbindungsanfrage wiederholen?</target>
<target>Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@).</target>
@@ -9312,6 +9347,10 @@ Verbindungsanfrage wiederholen?</target>
<target>Mein aktuelles Chat-Profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Ihre Präferenzen</target>
@@ -1257,6 +1257,16 @@ swipe action</note>
<target>Better user experience</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<target>Bio</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<target>Bio too large</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Black</target>
@@ -1347,6 +1357,11 @@ swipe action</note>
<target>Business chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<target>Business connection</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Businesses</target>
@@ -2649,6 +2664,11 @@ swipe action</note>
<target>Description</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<target>Description too large</target>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Desktop address</target>
@@ -7183,11 +7203,6 @@ chat item action</note>
<target>Sent reply</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Sent to your contact after connection.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Sent total</target>
@@ -7444,6 +7459,11 @@ chat item action</note>
<target>Share with contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<target>Short description</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Short link</target>
@@ -7852,11 +7872,26 @@ report reason</note>
<target>Take picture</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<target>Tap Connect to chat</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<target>Tap Connect to send request</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Tap Create SimpleX address in the menu to create it later.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<target>Tap Join group</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Tap button </target>
@@ -9247,6 +9282,11 @@ Repeat connection request?</target>
<target>Your SimpleX address</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<target>Your business contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Your calls</target>
@@ -9282,6 +9322,11 @@ Repeat connection request?</target>
<target>Your connection was moved to %@ but an error happened when switching profile.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<target>Your contact</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Your contact sent a file that is larger than currently supported maximum size (%@).</target>
@@ -9312,6 +9357,11 @@ Repeat connection request?</target>
<target>Your current profile</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<target>Your group</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Your preferences</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Experiencia de usuario mejorada</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Negro</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>Chats empresariales</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Empresas</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Descripción</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Dirección ordenador</target>
@@ -7183,11 +7199,6 @@ chat item action</note>
<target>Respuesta enviada</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Enviado a tu contacto tras la conexión.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Total enviados</target>
@@ -7444,6 +7455,10 @@ chat item action</note>
<target>Compartir con contactos</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Enlace corto</target>
@@ -7852,11 +7867,23 @@ report reason</note>
<target>Tomar foto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Pulsa Crear dirección SimpleX en el menú para crearla más tarde.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Pulsa el botón </target>
@@ -9247,6 +9274,10 @@ Repeat connection request?</source>
<target>Mi dirección SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Llamadas</target>
@@ -9282,6 +9313,10 @@ Repeat connection request?</source>
<target>Tu conexión ha sido trasladada a %@ pero ha ocurrido un error inesperado al redirigirte al perfil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>El contacto ha enviado un archivo mayor al máximo admitido (%@).</target>
@@ -9312,6 +9347,10 @@ Repeat connection request?</source>
<target>Tu perfil actual</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Mis preferencias</target>
@@ -1147,6 +1147,14 @@ swipe action</note>
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1224,6 +1232,10 @@ swipe action</note>
<source>Business chats</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<note>No comment provided by engineer.</note>
@@ -2399,6 +2411,10 @@ swipe action</note>
<target>Kuvaus</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<note>No comment provided by engineer.</note>
@@ -6506,10 +6522,6 @@ chat item action</note>
<source>Sent reply</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<note>No comment provided by engineer.</note>
@@ -6734,6 +6746,10 @@ chat item action</note>
<target>Jaa kontaktien kanssa</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7102,10 +7118,22 @@ report reason</note>
<target>Ota kuva</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Napauta painiketta </target>
@@ -8364,6 +8392,10 @@ Repeat connection request?</source>
<target>SimpleX-osoitteesi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Puhelusi</target>
@@ -8396,6 +8428,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@).</target>
@@ -8425,6 +8461,10 @@ Repeat connection request?</source>
<target>Nykyinen profiilisi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Asetuksesi</target>
@@ -1249,6 +1249,14 @@ swipe action</note>
<target>Une meilleure expérience pour l'utilisateur</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Noir</target>
@@ -1339,6 +1347,10 @@ swipe action</note>
<target>Discussions professionnelles</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Entreprises</target>
@@ -2634,6 +2646,10 @@ swipe action</note>
<target>Description</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Adresse de bureau</target>
@@ -7070,10 +7086,6 @@ chat item action</note>
<target>Réponse envoyée</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Total envoyé</target>
@@ -7325,6 +7337,10 @@ chat item action</note>
<target>Partager avec vos contacts</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7727,11 +7743,23 @@ report reason</note>
<target>Prendre une photo</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Appuyez sur Créer une adresse SimpleX dans le menu pour la créer ultérieurement.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Appuyez sur le bouton </target>
@@ -9108,6 +9136,10 @@ Répéter la demande de connexion ?</target>
<target>Votre adresse SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Vos appels</target>
@@ -9142,6 +9174,10 @@ Répéter la demande de connexion ?</target>
<target>Votre connexion a été déplacée vers %@ mais une erreur inattendue s'est produite lors de la redirection vers le profil.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@).</target>
@@ -9172,6 +9208,10 @@ Répéter la demande de connexion ?</target>
<target>Votre profil actuel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Vos préférences</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Továbbfejlesztett felhasználói élmény</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Fekete</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>Üzleti csevegések</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Üzleti</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Leírás</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Számítógép címe</target>
@@ -7183,11 +7199,6 @@ chat item action</note>
<target>Válaszüzenet-buborék színe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Elküldés a partnernek a kapcsolódást követően.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Összes elküldött üzenet</target>
@@ -7444,6 +7455,10 @@ chat item action</note>
<target>Megosztás a partnerekkel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Rövid hivatkozás</target>
@@ -7852,11 +7867,23 @@ report reason</note>
<target>Kép készítése</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Koppintson a SimpleX-cím létrehozása menüpontra a későbbi létrehozáshoz.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Koppintson a </target>
@@ -9247,6 +9274,10 @@ Repeat connection request?</source>
<target>Profil SimpleX-címe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Hívások</target>
@@ -9282,6 +9313,10 @@ Repeat connection request?</source>
<target>A kapcsolata át lett helyezve ide: %@, de egy váratlan hiba történt a profilra való átirányításkor.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>A partnere a jelenleg megengedett maximális méretű (%@) fájlnál nagyobbat küldött.</target>
@@ -9312,6 +9347,10 @@ Repeat connection request?</source>
<target>Jelenlegi profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Beállítások</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Esperienza utente migliorata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Nero</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>Chat di lavoro</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Lavorative</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Descrizione</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Indirizzo desktop</target>
@@ -7183,11 +7199,6 @@ chat item action</note>
<target>Risposta inviata</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Inviato al tuo contatto dopo la connessione.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Totale inviato</target>
@@ -7444,6 +7455,10 @@ chat item action</note>
<target>Condividi con i contatti</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Link breve</target>
@@ -7852,11 +7867,23 @@ report reason</note>
<target>Scatta foto</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Tocca Crea indirizzo SimpleX nel menu per crearlo più tardi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Tocca il pulsante </target>
@@ -9247,6 +9274,10 @@ Ripetere la richiesta di connessione?</target>
<target>Il tuo indirizzo SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Le tue chiamate</target>
@@ -9282,6 +9313,10 @@ Ripetere la richiesta di connessione?</target>
<target>La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@).</target>
@@ -9312,6 +9347,10 @@ Ripetere la richiesta di connessione?</target>
<target>Il tuo profilo attuale</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Le tue preferenze</target>
@@ -1196,6 +1196,14 @@ swipe action</note>
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1274,6 +1282,10 @@ swipe action</note>
<source>Business chats</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<note>No comment provided by engineer.</note>
@@ -2469,6 +2481,10 @@ swipe action</note>
<target>説明</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<note>No comment provided by engineer.</note>
@@ -6576,10 +6592,6 @@ chat item action</note>
<source>Sent reply</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<note>No comment provided by engineer.</note>
@@ -6804,6 +6816,10 @@ chat item action</note>
<target>連絡先と共有する</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7173,10 +7189,22 @@ report reason</note>
<target>写真を撮影</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>ボタンをタップ </target>
@@ -8435,6 +8463,10 @@ Repeat connection request?</source>
<target>あなたのSimpleXアドレス</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>あなたの通話</target>
@@ -8467,6 +8499,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。</target>
@@ -8496,6 +8532,10 @@ Repeat connection request?</source>
<target>現在のプロフィール</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>あなたの設定</target>
@@ -1254,6 +1254,14 @@ swipe action</note>
<target>Betere gebruikerservaring</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Zwart</target>
@@ -1344,6 +1352,10 @@ swipe action</note>
<target>Zakelijke chats</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>bedrijven</target>
@@ -2643,6 +2655,10 @@ swipe action</note>
<target>Beschrijving</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Desktop adres</target>
@@ -7149,10 +7165,6 @@ chat item action</note>
<target>Antwoord verzonden</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Totaal verzonden</target>
@@ -7407,6 +7419,10 @@ chat item action</note>
<target>Delen met contacten</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Korte link</target>
@@ -7814,11 +7830,23 @@ report reason</note>
<target>Foto nemen</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Tik op SimpleX-adres maken in het menu om het later te maken.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Tik op de knop </target>
@@ -9207,6 +9235,10 @@ Verbindingsverzoek herhalen?</target>
<target>Uw SimpleX adres</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Uw oproepen</target>
@@ -9241,6 +9273,10 @@ Verbindingsverzoek herhalen?</target>
<target>Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@).</target>
@@ -9271,6 +9307,10 @@ Verbindingsverzoek herhalen?</target>
<target>Je huidige profiel</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Jouw voorkeuren</target>
@@ -1248,6 +1248,14 @@ swipe action</note>
<target>Lepszy interfejs użytkownika</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Czarny</target>
@@ -1338,6 +1346,10 @@ swipe action</note>
<target>Czaty biznesowe</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Firmy</target>
@@ -2603,6 +2615,10 @@ swipe action</note>
<target>Opis</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Adres komputera</target>
@@ -6975,10 +6991,6 @@ chat item action</note>
<target>Wyślij odpowiedź</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Wysłano łącznie</target>
@@ -7223,6 +7235,10 @@ chat item action</note>
<target>Udostępnij kontaktom</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7617,10 +7633,22 @@ report reason</note>
<target>Zrób zdjęcie</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Naciśnij przycisk </target>
@@ -8975,6 +9003,10 @@ Powtórzyć prośbę połączenia?</target>
<target>Twój adres SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Twoje połączenia</target>
@@ -9009,6 +9041,10 @@ Powtórzyć prośbę połączenia?</target>
<target>Twoje połączenie zostało przeniesione do %@, ale podczas przekierowywania do profilu wystąpił nieoczekiwany błąd.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Twój kontakt wysłał plik, który jest większy niż obecnie obsługiwany maksymalny rozmiar (%@).</target>
@@ -9039,6 +9075,10 @@ Powtórzyć prośbę połączenia?</target>
<target>Twój obecny profil</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Twoje preferencje</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Улучшенный интерфейс</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Черная</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>Бизнес разговоры</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Бизнесы</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Описание</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Адрес компьютера</target>
@@ -7181,11 +7197,6 @@ chat item action</note>
<target>Отправленный ответ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Отправляется Вашему контакту после соединения.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Всего отправлено</target>
@@ -7442,6 +7453,10 @@ chat item action</note>
<target>Поделиться с контактами</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Короткая ссылка</target>
@@ -7850,11 +7865,23 @@ report reason</note>
<target>Сделать фото</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Нажмите Создать адрес SimpleX в меню, чтобы создать его позже.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Нажмите кнопку </target>
@@ -9245,6 +9272,10 @@ Repeat connection request?</source>
<target>Ваш адрес SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Ваши звонки</target>
@@ -9279,6 +9310,10 @@ Repeat connection request?</source>
<target>Соединение было перемещено на %@, но при смене профиля произошла неожиданная ошибка.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Ваш контакт отправил файл, размер которого превышает максимальный размер (%@).</target>
@@ -9309,6 +9344,10 @@ Repeat connection request?</source>
<target>Ваш активный профиль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Ваши предпочтения</target>
@@ -1139,6 +1139,14 @@ swipe action</note>
<source>Better user experience</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<note>No comment provided by engineer.</note>
@@ -1216,6 +1224,10 @@ swipe action</note>
<source>Business chats</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<note>No comment provided by engineer.</note>
@@ -2387,6 +2399,10 @@ swipe action</note>
<target>คำอธิบาย</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<note>No comment provided by engineer.</note>
@@ -6481,10 +6497,6 @@ chat item action</note>
<source>Sent reply</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<note>No comment provided by engineer.</note>
@@ -6709,6 +6721,10 @@ chat item action</note>
<target>แชร์กับผู้ติดต่อ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7075,10 +7091,22 @@ report reason</note>
<target>ถ่ายภาพ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>แตะปุ่ม </target>
@@ -8333,6 +8361,10 @@ Repeat connection request?</source>
<target>ที่อยู่ SimpleX ของคุณ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>การโทรของคุณ</target>
@@ -8365,6 +8397,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@)</target>
@@ -8394,6 +8430,10 @@ Repeat connection request?</source>
<target>โปรไฟล์ปัจจุบันของคุณ</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>การตั้งค่าของคุณ</target>
@@ -1257,6 +1257,14 @@ swipe action</note>
<target>Daha iyi kullanıcı deneyimi</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Siyah</target>
@@ -1347,6 +1355,10 @@ swipe action</note>
<target>İş konuşmaları</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>İşletmeler</target>
@@ -2649,6 +2661,10 @@ swipe action</note>
<target>Açıklama</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Bilgisayar adresi</target>
@@ -7183,11 +7199,6 @@ chat item action</note>
<target>Gönderilen cevap</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<target>Bağlantıdan sonra kişinize gönderildi.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Gönderilen tüm mesajların toplamı</target>
@@ -7444,6 +7455,10 @@ chat item action</note>
<target>Kişilerle paylaş</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<target>Kısa bağlantı</target>
@@ -7852,11 +7867,23 @@ report reason</note>
<target>Fotoğraf çek</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Daha sonra oluşturmak için menüden BasitX adresi oluştur'a dokunun.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Tuşa bas </target>
@@ -9247,6 +9274,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>SimpleX adresin</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Aramaların</target>
@@ -9282,6 +9313,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>Bağlantınız %@ adresine taşındı ancak sizi profile yönlendirirken beklenmedik bir hata oluştu.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi.</target>
@@ -9312,6 +9347,10 @@ Bağlantı isteği tekrarlansın mı?</target>
<target>Mevcut profiliniz</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Tercihleriniz</target>
@@ -1254,6 +1254,14 @@ swipe action</note>
<target>Покращений користувацький досвід</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>Чорний</target>
@@ -1344,6 +1352,10 @@ swipe action</note>
<target>Ділові чати</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>Бізнеси</target>
@@ -2643,6 +2655,10 @@ swipe action</note>
<target>Опис</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>Адреса робочого столу</target>
@@ -7094,10 +7110,6 @@ chat item action</note>
<target>Надіслано відповідь</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>Відправлено всього</target>
@@ -7349,6 +7361,10 @@ chat item action</note>
<target>Поділіться з контактами</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7751,11 +7767,23 @@ report reason</note>
<target>Сфотографуйте</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<target>Натисніть «Створити адресу SimpleX» у меню, щоб створити її пізніше.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>Натисніть кнопку </target>
@@ -9132,6 +9160,10 @@ Repeat connection request?</source>
<target>Ваша адреса SimpleX</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>Твої дзвінки</target>
@@ -9166,6 +9198,10 @@ Repeat connection request?</source>
<target>Ваше з'єднання було переміщено на %@, але під час перенаправлення на профіль сталася несподівана помилка.</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>Ваш контакт надіслав файл, розмір якого перевищує підтримуваний на цей момент максимальний розмір (%@).</target>
@@ -9196,6 +9232,10 @@ Repeat connection request?</source>
<target>Ваш поточний профіль</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>Ваші уподобання</target>
@@ -1251,6 +1251,14 @@ swipe action</note>
<target>更佳的使用体验</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio" xml:space="preserve">
<source>Bio</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Bio too large" xml:space="preserve">
<source>Bio too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Black" xml:space="preserve">
<source>Black</source>
<target>黑色</target>
@@ -1341,6 +1349,10 @@ swipe action</note>
<target>企业聊天</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Business connection" xml:space="preserve">
<source>Business connection</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Businesses" xml:space="preserve">
<source>Businesses</source>
<target>企业</target>
@@ -2635,6 +2647,10 @@ swipe action</note>
<target>描述</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Description too large" xml:space="preserve">
<source>Description too large</source>
<note>alert title</note>
</trans-unit>
<trans-unit id="Desktop address" xml:space="preserve">
<source>Desktop address</source>
<target>桌面地址</target>
@@ -7099,10 +7115,6 @@ chat item action</note>
<target>已发送回复</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent to your contact after connection." xml:space="preserve">
<source>Sent to your contact after connection.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Sent total" xml:space="preserve">
<source>Sent total</source>
<target>发送总数</target>
@@ -7344,6 +7356,10 @@ chat item action</note>
<target>与联系人分享</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short description" xml:space="preserve">
<source>Short description</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Short link" xml:space="preserve">
<source>Short link</source>
<note>No comment provided by engineer.</note>
@@ -7742,10 +7758,22 @@ report reason</note>
<target>拍照</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to chat" xml:space="preserve">
<source>Tap Connect to chat</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Connect to send request" xml:space="preserve">
<source>Tap Connect to send request</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Create SimpleX address in the menu to create it later." xml:space="preserve">
<source>Tap Create SimpleX address in the menu to create it later.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap Join group" xml:space="preserve">
<source>Tap Join group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Tap button " xml:space="preserve">
<source>Tap button </source>
<target>点击按钮 </target>
@@ -9095,6 +9123,10 @@ Repeat connection request?</source>
<target>您的 SimpleX 地址</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your business contact" xml:space="preserve">
<source>Your business contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your calls" xml:space="preserve">
<source>Your calls</source>
<target>您的通话</target>
@@ -9127,6 +9159,10 @@ Repeat connection request?</source>
<source>Your connection was moved to %@ but an error happened when switching profile.</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact" xml:space="preserve">
<source>Your contact</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
<target>您的联系人发送的文件大于当前支持的最大大小 (%@)。</target>
@@ -9156,6 +9192,10 @@ Repeat connection request?</source>
<target>您当前的资料</target>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your group" xml:space="preserve">
<source>Your group</source>
<note>No comment provided by engineer.</note>
</trans-unit>
<trans-unit id="Your preferences" xml:space="preserve">
<source>Your preferences</source>
<target>您的偏好设置</target>
+4
View File
@@ -2929,6 +2929,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
case .rcvDirectE2EEInfo: return false
case .sndGroupE2EEInfo: return false
case .rcvGroupE2EEInfo: return false
case .chatBanner: return false
case .invalidJSON: return false
}
}
@@ -2996,6 +2997,7 @@ public struct ChatItem: Identifiable, Decodable, Hashable {
case .rcvDirectE2EEInfo: return false
case .sndGroupE2EEInfo: return false
case .rcvGroupE2EEInfo: return false
case .chatBanner: return false
default: return true
}
}
@@ -3656,6 +3658,7 @@ public enum CIContent: Decodable, ItemContent, Hashable {
case rcvDirectE2EEInfo(e2eeInfo: E2EEInfo)
case sndGroupE2EEInfo(e2eeInfo: E2EEInfo)
case rcvGroupE2EEInfo(e2eeInfo: E2EEInfo)
case chatBanner
case invalidJSON(json: Data?)
public var text: String {
@@ -3691,6 +3694,7 @@ public enum CIContent: Decodable, ItemContent, Hashable {
case let .rcvDirectE2EEInfo(e2eeInfo): return directE2EEInfoStr(e2eeInfo)
case .sndGroupE2EEInfo: return e2eeInfoNoPQStr
case .rcvGroupE2EEInfo: return e2eeInfoNoPQStr
case .chatBanner: return ""
case .invalidJSON: return NSLocalizedString("invalid data", comment: "invalid chat item")
}
}
@@ -2813,6 +2813,7 @@ data class ChatItem (
is CIContent.RcvDirectE2EEInfo -> false
is CIContent.SndGroupE2EEInfo -> false
is CIContent.RcvGroupE2EEInfo -> false
is CIContent.ChatBanner -> false
else -> true
}
@@ -2879,6 +2880,7 @@ data class ChatItem (
is CIContent.RcvDirectE2EEInfo -> false
is CIContent.SndGroupE2EEInfo -> false
is CIContent.RcvGroupE2EEInfo -> false
is CIContent.ChatBanner -> false
is CIContent.InvalidJSON -> false
}
@@ -3549,6 +3551,7 @@ sealed class CIContent: ItemContent {
@Serializable @SerialName("rcvDirectE2EEInfo") class RcvDirectE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("sndGroupE2EEInfo") class SndGroupE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("rcvGroupE2EEInfo") class RcvGroupE2EEInfo(val e2eeInfo: E2EEInfo): CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("chatBanner") object ChatBanner: CIContent() { override val msgContent: MsgContent? get() = null }
@Serializable @SerialName("invalidJSON") data class InvalidJSON(val json: String): CIContent() { override val msgContent: MsgContent? get() = null }
override val text: String get() = when (this) {
@@ -3582,6 +3585,7 @@ sealed class CIContent: ItemContent {
is RcvDirectE2EEInfo -> directE2EEInfoStr(e2eeInfo)
is SndGroupE2EEInfo -> e2eeInfoNoPQStr
is RcvGroupE2EEInfo -> e2eeInfoNoPQStr
is ChatBanner -> ""
is InvalidJSON -> "invalid data"
}
@@ -883,7 +883,7 @@ object ChatController {
}
suspend fun apiStartChat(ctrl: ChatCtrl? = null): Boolean {
val r = sendCmd(null, CC.StartChat(mainApp = true, largeLinkData = false), ctrl)
val r = sendCmd(null, CC.StartChat(mainApp = true, largeLinkData = true), ctrl)
when (r.result) {
is CR.ChatStarted -> return true
is CR.ChatRunning -> return false
@@ -42,7 +42,9 @@ import chat.simplex.common.model.GroupInfo
import chat.simplex.common.platform.*
import chat.simplex.common.platform.AudioPlayer
import chat.simplex.common.views.newchat.ContactConnectionInfoView
import chat.simplex.common.views.newchat.alertProfileImageSize
import chat.simplex.res.MR
import dev.icerock.moko.resources.ImageResource
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import kotlinx.datetime.*
@@ -1754,6 +1756,127 @@ fun BoxScope.ChatItemsList(
ChatItemView(cItem, range, itemSeparation, previousItemSeparationLargeGap)
}
}
@Composable
fun ChatBannerView() {
fun chatContext(): String? {
return when (chatInfo) {
is ChatInfo.Direct -> {
val contact = chatInfo.contact
val preparedLinkType = contact.preparedContact?.uiConnLinkType
if (contact.nextConnectPrepared && preparedLinkType != null) {
when (preparedLinkType) {
ConnectionMode.Inv -> generalGetString(MR.strings.chat_banner_connect_to_chat)
ConnectionMode.Con -> generalGetString(MR.strings.chat_banner_send_request_to_connect)
}
} else if (contact.nextAcceptContactRequest) {
generalGetString(MR.strings.chat_banner_accept_contact_request)
} else {
generalGetString(MR.strings.chat_banner_your_contact)
}
}
is ChatInfo.Group -> {
val groupInfo = chatInfo.groupInfo
when (groupInfo.businessChat?.chatType) {
null -> {
if (groupInfo.nextConnectPrepared) {
generalGetString(MR.strings.chat_banner_join_group)
} else {
when (groupInfo.membership.memberStatus) {
GroupMemberStatus.MemInvited -> generalGetString(MR.strings.chat_banner_join_group)
GroupMemberStatus.MemCreator -> generalGetString(MR.strings.chat_banner_your_group)
else -> generalGetString(MR.strings.chat_banner_group)
}
}
}
BusinessChatType.Business ->
if (groupInfo.nextConnectPrepared) {
generalGetString(MR.strings.chat_banner_connect_to_chat)
} else {
generalGetString(MR.strings.chat_banner_business_connection)
}
BusinessChatType.Customer ->
generalGetString(MR.strings.chat_banner_your_business_contact)
}
}
else -> null
}
}
Box(
Modifier
.clipChatItem()
.background(MaterialTheme.appColors.receivedMessage)
) {
val bannerModifier = if (appPlatform.isDesktop) Modifier.width(400.dp) else Modifier.fillMaxWidth()
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = bannerModifier
.padding(horizontal = DEFAULT_PADDING)
.padding(bottom = DEFAULT_PADDING)
// ChatInfoImage has its own padding somewhere,
// also not doing verticalArrangement = Arrangement.spacedBy(DEFAULT_PADDING_HALF) because of it
.padding(top = DEFAULT_PADDING_HALF)
.background(MaterialTheme.appColors.receivedMessage)
) {
ChatInfoImage(chatInfo, size = alertProfileImageSize, iconColor = MaterialTheme.colors.secondaryVariant.mixWith(MaterialTheme.colors.onBackground, 0.97f))
Text(
chatInfo.displayName,
style = MaterialTheme.typography.h3,
color = MaterialTheme.colors.onBackground,
textAlign = TextAlign.Center,
maxLines = 2,
overflow = TextOverflow.Ellipsis,
modifier = Modifier
.widthIn(max = 240.dp)
)
val fullName = chatInfo.fullName.trim()
if (fullName.isNotEmpty() && fullName != chatInfo.displayName && fullName != chatInfo.displayName.trim()) {
Text(
fullName,
style = MaterialTheme.typography.h4,
color = MaterialTheme.colors.onBackground,
textAlign = TextAlign.Center,
maxLines = 3,
overflow = TextOverflow.Ellipsis,
modifier = Modifier
.widthIn(max = 260.dp)
.padding(top = DEFAULT_PADDING_HALF)
)
}
val descr = chatInfo.shortDescr?.trim()
if (descr != null && descr != "") {
Text(
descr,
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.onBackground,
textAlign = TextAlign.Center,
maxLines = 4,
overflow = TextOverflow.Ellipsis,
lineHeight = 21.sp,
modifier = Modifier
.padding(top = DEFAULT_PADDING_HALF)
)
}
val contextStr = chatContext()
if (contextStr != null) {
Text(
contextStr,
style = MaterialTheme.typography.body2,
color = MaterialTheme.colors.secondary,
modifier = Modifier.padding(top = DEFAULT_PADDING)
)
}
}
}
}
LazyColumnWithScrollBar(
Modifier.align(Alignment.BottomCenter),
state = listState.value,
@@ -1768,42 +1891,62 @@ fun BoxScope.ChatItemsList(
) {
val mergedItemsValue = mergedItems.value
itemsIndexed(mergedItemsValue.items, key = { _, merged -> keyForItem(merged.newest().item) }) { index, merged ->
val isLastItem = index == mergedItemsValue.items.lastIndex
val last = if (isLastItem) reversedChatItems.value.lastOrNull() else null
val listItem = merged.newest()
val item = listItem.item
val range = if (merged is MergedItem.Grouped) {
merged.rangeInReversed.value
} else {
null
}
val showAvatar = shouldShowAvatar(item, merged.oldest().nextItem)
val isRevealed = remember { derivedStateOf { revealedItems.value.contains(item.id) } }
val itemSeparation: ItemSeparation
val prevItemSeparationLargeGap: Boolean
if (merged is MergedItem.Single || isRevealed.value) {
val prev = listItem.prevItem
itemSeparation = getItemSeparation(item, prev)
val nextForGap = if ((item.mergeCategory != null && item.mergeCategory == prev?.mergeCategory) || isLastItem) null else listItem.nextItem
prevItemSeparationLargeGap = if (nextForGap == null) false else getItemSeparationLargeGap(nextForGap, item)
} else {
itemSeparation = getItemSeparation(item, null)
prevItemSeparationLargeGap = false
}
ChatViewListItem(index == 0, rememberUpdatedState(range), showAvatar, item, itemSeparation, prevItemSeparationLargeGap, isRevealed) {
if (merged is MergedItem.Grouped) merged.reveal(it, revealedItems)
}
if (last != null) {
// no using separate item(){} block in order to have total number of items in LazyColumn match number of merged items
DateSeparator(last.meta.itemTs)
}
if (item.isRcvNew) {
val itemIds = when (merged) {
is MergedItem.Single -> listOf(merged.item.item.id)
is MergedItem.Grouped -> merged.items.map { it.item.id }
if (item.content is CIContent.ChatBanner) {
Column {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.fillMaxSize()
.padding(horizontal = DEFAULT_PADDING)
.padding(bottom = 90.dp, top = DEFAULT_PADDING)
) {
ChatBannerView()
}
val prevItem = listItem.prevItem
if (prevItem != null) {
DateSeparator(prevItem.meta.itemTs)
}
}
} else {
val isLastItem = index == mergedItemsValue.items.lastIndex
val last = if (isLastItem) reversedChatItems.value.lastOrNull() else null
val range = if (merged is MergedItem.Grouped) {
merged.rangeInReversed.value
} else {
null
}
val showAvatar = shouldShowAvatar(item, merged.oldest().nextItem)
val isRevealed = remember { derivedStateOf { revealedItems.value.contains(item.id) } }
val itemSeparation: ItemSeparation
val prevItemSeparationLargeGap: Boolean
if (merged is MergedItem.Single || isRevealed.value) {
val prev = listItem.prevItem
itemSeparation = getItemSeparation(item, prev)
val nextForGap = if ((item.mergeCategory != null && item.mergeCategory == prev?.mergeCategory) || isLastItem) null else listItem.nextItem
prevItemSeparationLargeGap = if (nextForGap == null) false else getItemSeparationLargeGap(nextForGap, item)
} else {
itemSeparation = getItemSeparation(item, null)
prevItemSeparationLargeGap = false
}
ChatViewListItem(index == 0, rememberUpdatedState(range), showAvatar, item, itemSeparation, prevItemSeparationLargeGap, isRevealed) {
if (merged is MergedItem.Grouped) merged.reveal(it, revealedItems)
}
if (last != null) {
// no using separate item(){} block in order to have total number of items in LazyColumn match number of merged items
DateSeparator(last.meta.itemTs)
}
if (item.isRcvNew) {
val itemIds = when (merged) {
is MergedItem.Single -> listOf(merged.item.item.id)
is MergedItem.Grouped -> merged.items.map { it.item.id }
}
MarkItemsReadAfterDelay(keyForItem(item), itemIds, finishedInitialComposition, chatInfo.id, listState, markItemsRead)
}
MarkItemsReadAfterDelay(keyForItem(item), itemIds, finishedInitialComposition, chatInfo.id, listState, markItemsRead)
}
}
}
@@ -2256,7 +2399,12 @@ private fun FloatingDate(
if (listState.value.layoutInfo.visibleItemsInfo.lastIndex >= 0) {
val lastVisibleChatItem = lastFullyVisibleIemInListState(topPaddingToContentPx, density, fontSizeSqrtMultiplier, mergedItems, listState)
val timeZone = TimeZone.currentSystemDefault()
lastVisibleChatItem?.meta?.itemTs?.toLocalDateTime(timeZone)?.date?.atStartOfDayIn(timeZone)
val itemTs = lastVisibleChatItem?.meta?.itemTs
if (itemTs != null && itemTs.epochSeconds > 0) {
itemTs.toLocalDateTime(timeZone).date.atStartOfDayIn(timeZone)
} else {
null
}
} else {
null
}
@@ -787,6 +787,7 @@ fun ChatItemView(
is CIContent.RcvDirectE2EEInfo -> DirectE2EEInfoText(c.e2eeInfo)
is CIContent.SndGroupE2EEInfo -> E2EEInfoNoPQText()
is CIContent.RcvGroupE2EEInfo -> E2EEInfoNoPQText()
is CIContent.ChatBanner -> Spacer(modifier = Modifier.size(0.dp))
is CIContent.InvalidJSON -> {
CIInvalidJSONView(c.json)
DeleteItemMenu()
@@ -192,7 +192,10 @@ fun ChatPreviewView(
is ChatInfo.Group ->
if (cInfo.groupInfo.nextConnectPrepared) {
stringResource(MR.strings.group_preview_open_to_join) to Color.Unspecified
stringResource(
if (cInfo.groupInfo.businessChat?.chatType == BusinessChatType.Business) MR.strings.open_to_connect
else MR.strings.group_preview_open_to_join
) to Color.Unspecified
} else {
when (cInfo.groupInfo.membership.memberStatus) {
GroupMemberStatus.MemRejected -> stringResource(MR.strings.group_preview_rejected) to Color.Unspecified
@@ -485,6 +485,17 @@
<string name="group_new_support_chat_one">1 chat with a member</string>
<string name="group_new_support_chats_short">%d chat(s)</string>
<!-- ChatBannerView -->
<string name="chat_banner_connect_to_chat">Tap Connect to chat</string>
<string name="chat_banner_send_request_to_connect">Tap Connect to send request</string>
<string name="chat_banner_accept_contact_request">Accept contact request</string>
<string name="chat_banner_your_contact">Your contact</string>
<string name="chat_banner_join_group">Tap Join group</string>
<string name="chat_banner_your_group">Your group</string>
<string name="chat_banner_group">Group</string>
<string name="chat_banner_business_connection">Business connection</string>
<string name="chat_banner_your_business_contact">Your business contact</string>
<!-- ShareListView.kt -->
<string name="share_message">Share message…</string>
<string name="share_image">Share media…</string>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="22" viewBox="0 -960 960 960" width="22" fill="#1f1f1f"><path d="M515-451.5 460-396q-9 8.5-9 19.75t9 20.25q9 9 20.25 9t20.2-9L604-459.95q8.5-8.37 8.5-20 0-11.64-8.5-20.55l-104-104q-8.5-8.5-19.75-8.5T460-604.25q-9 8.75-9 20t9 20.25l55 55H360q-12.5 0-20.5 8.25t-8 20.75q0 12.5 8 20.5t20.5 8h155ZM480.06-85q-80.97 0-153.13-31.26-72.15-31.27-125.79-85Q147.5-255 116.25-327.02 85-399.05 85-479.94q0-81.97 31.26-154.13 31.27-72.15 85-125.54Q255-813 327.02-844q72.03-31 152.92-31 81.97 0 154.13 31.13 72.17 31.13 125.55 84.5Q813-706 844-633.98q31 72.03 31 153.92 0 80.97-31.01 153.13-31.02 72.15-84.5 125.79Q706-147.5 633.98-116.25 561.95-85 480.06-85Zm-.09-57.5q140.53 0 239.03-98.97 98.5-98.96 98.5-238.5 0-140.53-98.47-239.03-98.46-98.5-239-98.5-139.53 0-238.53 98.47-99 98.46-99 239 0 139.53 98.97 238.53 98.96 99 238.5 99ZM480-480Z"/></svg>

After

Width:  |  Height:  |  Size: 885 B

+7 -1
View File
@@ -1766,6 +1766,7 @@ processChatCommand vr nm = \case
groupPreferences = maybe defaultBusinessGroupPrefs businessGroupPrefs preferences
groupProfile = businessGroupProfile profile groupPreferences
(gInfo, hostMember) <- withStore $ \db -> createPreparedGroup db vr user groupProfile True ccLink welcomeSharedMsgId
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
let cd = CDGroupRcv gInfo Nothing hostMember
createItem sharedMsgId content = createChatItem user cd True content sharedMsgId Nothing
cInfo = GroupChat gInfo Nothing
@@ -1777,7 +1778,9 @@ processChatCommand vr nm = \case
pure $ CRNewPreparedChat user $ AChat SCTGroup chat
ACCL _ (CCLink cReq _) -> do
ct <- withStore $ \db -> createPreparedContact db user profile accLink welcomeSharedMsgId
let createItem sharedMsgId content = createChatItem user (CDDirectRcv ct) False content sharedMsgId Nothing
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
let cd = CDDirectRcv ct
createItem sharedMsgId content = createChatItem user cd False content sharedMsgId Nothing
cInfo = DirectChat ct
void $ createItem Nothing $ CIRcvDirectE2EEInfo $ E2EInfo $ connRequestPQEncryption cReq
void $ createFeatureEnabledItems_ user ct
@@ -1790,6 +1793,7 @@ processChatCommand vr nm = \case
let GroupShortLinkData {groupProfile = gp@GroupProfile {description}} = groupSLinkData
welcomeSharedMsgId <- forM description $ \_ -> getSharedMsgId
(gInfo, hostMember) <- withStore $ \db -> createPreparedGroup db vr user gp False ccLink welcomeSharedMsgId
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
let cd = CDGroupRcv gInfo Nothing hostMember
cInfo = GroupChat gInfo Nothing
void $ createGroupFeatureItems_ user cd True CIRcvGroupFeature gInfo
@@ -2111,6 +2115,7 @@ processChatCommand vr nm = \case
incognitoProfile <- if incognito then Just <$> liftIO generateRandomProfile else pure Nothing
gInfo <- withFastStore $ \db -> createNewGroup db vr gVar user gProfile incognitoProfile
let cd = CDGroupSnd gInfo Nothing
createInternalChatItem user cd CIChatBanner (Just epochStart)
createInternalChatItem user cd (CISndGroupE2EEInfo E2EInfo {pqEnabled = Just PQEncOff}) Nothing
createGroupFeatureItems user cd CISndGroupFeature gInfo
pure $ CRGroupCreated user gInfo
@@ -2565,6 +2570,7 @@ processChatCommand vr nm = \case
(connId, (CCLink cReq _, _serviceId)) <- withAgent $ \a -> createConnection a nm (aUserId user) True SCMInvitation Nothing Nothing IKPQOff subMode
-- [incognito] reuse membership incognito profile
ct <- withFastStore' $ \db -> createMemberContact db user connId cReq g m mConn subMode
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
-- TODO not sure it is correct to set connections status here?
lift $ setContactNetworkStatus ct NSConnected
pure $ CRNewMemberContact user ct g m
+5 -1
View File
@@ -48,7 +48,8 @@ import Data.Text (Text)
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import Data.Time (addUTCTime)
import Data.Time.Clock (UTCTime, diffUTCTime, getCurrentTime, nominalDiffTimeToSeconds)
import Data.Time.Calendar (fromGregorian)
import Data.Time.Clock (UTCTime (..), diffUTCTime, getCurrentTime, nominalDiffTimeToSeconds, secondsToDiffTime)
import Simplex.Chat.Call
import Simplex.Chat.Controller
import Simplex.Chat.Files
@@ -2529,3 +2530,6 @@ timeItToView s action = do
let diff = diffToMilliseconds $ diffUTCTime t2 t1
toView' $ CEvtTimedAction s diff
pure a
epochStart :: UTCTime
epochStart = UTCTime (fromGregorian 1970 1 1) (secondsToDiffTime 0)
+5
View File
@@ -577,6 +577,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
-- TODO [short links] get contact request by contactRequestId, check encryption (UserContactRequest.pqSupport)?
when (directOrUsed ct') $ case (preparedContact ct', contactRequestId' ct') of
(Nothing, Nothing) -> do
createInternalChatItem user (CDDirectSnd ct') CIChatBanner (Just epochStart)
createE2EItem
createFeatureEnabledItems user ct'
(Just PreparedContact {connLinkToConnect = ACCL _ (CCLink cReq _)}, _) ->
@@ -1337,6 +1338,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
-- they will be updated after connection is accepted.
upsertDirectRequestItem cd (requestMsg_, prevSharedMsgId_)
Nothing -> do
void $ createChatItem user (CDDirectSnd ct) False CIChatBanner Nothing (Just epochStart)
let e2eContent = CIRcvDirectE2EEInfo $ E2EInfo $ Just $ CR.pqSupportToEnc $ reqPQSup
void $ createChatItem user cd False e2eContent Nothing Nothing
void $ createFeatureEnabledItems_ user ct
@@ -1366,6 +1368,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
-- they will be updated after connection is accepted.
upsertBusinessRequestItem cd (requestMsg_, prevSharedMsgId_)
Nothing -> do
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
-- TODO [short links] possibly, we can just keep them created where they are created on the business side due to auto-accept
-- let e2eContent = CIRcvGroupE2EEInfo $ E2EInfo $ Just False -- no PQ encryption in groups
-- void $ createChatItem user cd False e2eContent Nothing Nothing
@@ -2249,6 +2252,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
when (fromMemId == memId) $ throwChatError CEGroupDuplicateMemberId
-- [incognito] if direct connection with host is incognito, create membership using the same incognito profile
(gInfo@GroupInfo {groupId, localDisplayName, groupProfile, membership}, hostId) <- withStore $ \db -> createGroupInvitation db vr user ct inv customUserProfileId
void $ createChatItem user (CDGroupSnd gInfo Nothing) False CIChatBanner Nothing (Just epochStart)
let GroupMember {groupMemberId, memberId = membershipMemId} = membership
if sameGroupLinkId groupLinkId groupLinkId'
then do
@@ -3089,6 +3093,7 @@ processAgentMessageConn vr user@User {userId} corrId agentConnId agentMessage =
dm <- encodeConnInfo $ XInfo p
joinAgentConnectionAsync user True connReq dm subMode
createItems mCt' m' = do
createInternalChatItem user (CDDirectSnd mCt') CIChatBanner (Just epochStart)
(g', m'', scopeInfo) <- mkGroupChatScope g m'
createInternalChatItem user (CDGroupRcv g' scopeInfo m'') (CIRcvGroupEvent RGEMemberCreatedContact) Nothing
toView $ CEvtNewMemberContactReceivedInv user mCt' g' m''
+9
View File
@@ -165,6 +165,7 @@ data CIContent (d :: MsgDirection) where
CIRcvDirectE2EEInfo :: E2EInfo -> CIContent 'MDRcv
CISndGroupE2EEInfo :: E2EInfo -> CIContent 'MDSnd -- when new group is created
CIRcvGroupE2EEInfo :: E2EInfo -> CIContent 'MDRcv -- when enabled with some member
CIChatBanner :: CIContent 'MDSnd
CIInvalidJSON :: Text -> CIContent d -- this is also used for logical database errors, e.g. SEBadChatItem
-- ^ This type is used both in API and in DB, so we use different JSON encodings for the database and for the API
@@ -292,6 +293,7 @@ ciContentToText = \case
CIRcvDirectE2EEInfo e2eeInfo -> directE2EInfoToText e2eeInfo
CISndGroupE2EEInfo e2eeInfo -> groupE2EInfoToText e2eeInfo
CIRcvGroupE2EEInfo e2eeInfo -> groupE2EInfoToText e2eeInfo
CIChatBanner -> "chat banner"
CIInvalidJSON _ -> "invalid content JSON"
directE2EInfoToText :: E2EInfo -> Text
@@ -471,6 +473,7 @@ data JSONCIContent
| JCIRcvDirectE2EEInfo {e2eeInfo :: E2EInfo}
| JCISndGroupE2EEInfo {e2eeInfo :: E2EInfo}
| JCIRcvGroupE2EEInfo {e2eeInfo :: E2EInfo}
| JCIChatBanner
| JCIInvalidJSON {direction :: MsgDirection, json :: Text}
jsonCIContent :: forall d. MsgDirectionI d => CIContent d -> JSONCIContent
@@ -505,6 +508,7 @@ jsonCIContent = \case
CIRcvDirectE2EEInfo e2eeInfo -> JCIRcvDirectE2EEInfo e2eeInfo
CISndGroupE2EEInfo e2eeInfo -> JCISndGroupE2EEInfo e2eeInfo
CIRcvGroupE2EEInfo e2eeInfo -> JCIRcvGroupE2EEInfo e2eeInfo
CIChatBanner -> JCIChatBanner
CIInvalidJSON json -> JCIInvalidJSON (toMsgDirection $ msgDirection @d) json
aciContentJSON :: JSONCIContent -> ACIContent
@@ -539,6 +543,7 @@ aciContentJSON = \case
JCIRcvDirectE2EEInfo {e2eeInfo} -> ACIContent SMDRcv $ CIRcvDirectE2EEInfo e2eeInfo
JCISndGroupE2EEInfo {e2eeInfo} -> ACIContent SMDSnd $ CISndGroupE2EEInfo e2eeInfo
JCIRcvGroupE2EEInfo {e2eeInfo} -> ACIContent SMDRcv $ CIRcvGroupE2EEInfo e2eeInfo
JCIChatBanner -> ACIContent SMDSnd CIChatBanner
JCIInvalidJSON dir json -> case fromMsgDirection dir of
AMsgDirection d -> ACIContent d $ CIInvalidJSON json
@@ -574,6 +579,7 @@ data DBJSONCIContent
| DBJCIRcvDirectE2EEInfo {e2eeInfo :: E2EInfo}
| DBJCISndGroupE2EEInfo {e2eeInfo :: E2EInfo}
| DBJCIRcvGroupE2EEInfo {e2eeInfo :: E2EInfo}
| DBJCIChatBanner
| DBJCIInvalidJSON {direction :: MsgDirection, json :: Text}
dbJsonCIContent :: forall d. MsgDirectionI d => CIContent d -> DBJSONCIContent
@@ -608,6 +614,7 @@ dbJsonCIContent = \case
CIRcvDirectE2EEInfo e2eeInfo -> DBJCIRcvDirectE2EEInfo e2eeInfo
CISndGroupE2EEInfo e2eeInfo -> DBJCISndGroupE2EEInfo e2eeInfo
CIRcvGroupE2EEInfo e2eeInfo -> DBJCIRcvGroupE2EEInfo e2eeInfo
CIChatBanner -> DBJCIChatBanner
CIInvalidJSON json -> DBJCIInvalidJSON (toMsgDirection $ msgDirection @d) json
aciContentDBJSON :: DBJSONCIContent -> ACIContent
@@ -642,6 +649,7 @@ aciContentDBJSON = \case
DBJCIRcvDirectE2EEInfo e2eeInfo -> ACIContent SMDRcv $ CIRcvDirectE2EEInfo e2eeInfo
DBJCISndGroupE2EEInfo e2eeInfo -> ACIContent SMDSnd $ CISndGroupE2EEInfo e2eeInfo
DBJCIRcvGroupE2EEInfo e2eeInfo -> ACIContent SMDRcv $ CIRcvGroupE2EEInfo e2eeInfo
DBJCIChatBanner -> ACIContent SMDSnd CIChatBanner
DBJCIInvalidJSON dir json -> case fromMsgDirection dir of
AMsgDirection d -> ACIContent d $ CIInvalidJSON json
@@ -749,4 +757,5 @@ toCIContentTag ciContent = case ciContent of
CIRcvDirectE2EEInfo _ -> "rcvDirectE2EEInfo"
CISndGroupE2EEInfo _ -> "sndGroupE2EEInfo"
CIRcvGroupE2EEInfo _ -> "rcvGroupE2EEInfo"
CIChatBanner -> "chatBanner"
CIInvalidJSON _ -> "invalidJSON"
+4 -4
View File
@@ -191,7 +191,7 @@ deleteContactCIs db user@User {userId} ct@Contact {contactId} = do
forM_ connIds $ \connId ->
DB.execute db "DELETE FROM messages WHERE connection_id = ?" (Only connId)
DB.execute db "DELETE FROM chat_item_reactions WHERE contact_id = ?" (Only contactId)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ?" (userId, contactId)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND item_content_tag != 'chatBanner'" (userId, contactId)
getContactConnIds_ :: DB.Connection -> User -> Contact -> IO [Int64]
getContactConnIds_ db User {userId} Contact {contactId} =
@@ -212,7 +212,7 @@ deleteGroupChatItemsMessages :: DB.Connection -> User -> GroupInfo -> IO ()
deleteGroupChatItemsMessages db User {userId} GroupInfo {groupId} = do
DB.execute db "DELETE FROM messages WHERE group_id = ?" (Only groupId)
DB.execute db "DELETE FROM chat_item_reactions WHERE group_id = ?" (Only groupId)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ?" (userId, groupId)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_content_tag != 'chatBanner'" (userId, groupId)
createNewSndMessage :: MsgEncodingI e => DB.Connection -> TVar ChaChaDRG -> ConnOrGroupId -> ChatMsgEvent e -> (SharedMsgId -> EncodedChatMessage) -> ExceptT StoreError IO SndMessage
createNewSndMessage db gVar connOrGroupId chatMsgEvent encodeMessage =
@@ -3416,7 +3416,7 @@ deleteContactExpiredCIs db user@User {userId} ct@Contact {contactId} expirationD
forM_ connIds $ \connId ->
DB.execute db "DELETE FROM messages WHERE connection_id = ? AND created_at <= ?" (connId, expirationDate)
DB.execute db "DELETE FROM chat_item_reactions WHERE contact_id = ? AND created_at <= ?" (contactId, expirationDate)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ?" (userId, contactId, expirationDate)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ? AND item_content_tag != 'chatBanner'" (userId, contactId, expirationDate)
getGroupExpiredFileInfo :: DB.Connection -> User -> GroupInfo -> UTCTime -> UTCTime -> IO [CIFileInfo]
getGroupExpiredFileInfo db User {userId} GroupInfo {groupId} expirationDate createdAtCutoff =
@@ -3430,7 +3430,7 @@ deleteGroupExpiredCIs :: DB.Connection -> User -> GroupInfo -> UTCTime -> UTCTim
deleteGroupExpiredCIs db User {userId} GroupInfo {groupId} expirationDate createdAtCutoff = do
DB.execute db "DELETE FROM messages WHERE group_id = ? AND created_at <= ?" (groupId, min expirationDate createdAtCutoff)
DB.execute db "DELETE FROM chat_item_reactions WHERE group_id = ? AND reaction_ts <= ? AND created_at <= ?" (groupId, expirationDate, createdAtCutoff)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_ts <= ? AND created_at <= ?" (userId, groupId, expirationDate, createdAtCutoff)
DB.execute db "DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_ts <= ? AND created_at <= ? AND item_content_tag != 'chatBanner'" (userId, groupId, expirationDate, createdAtCutoff)
createCIModeration :: DB.Connection -> GroupInfo -> GroupMember -> MemberId -> SharedMsgId -> MessageId -> UTCTime -> IO ()
createCIModeration db GroupInfo {groupId} moderatorMember itemMemberId itemSharedMId msgId moderatedAtTs =
@@ -555,8 +555,9 @@ Query:
INSERT INTO rcv_queues
( host, port, rcv_id, conn_id, rcv_private_key, rcv_dh_secret, e2e_priv_key, e2e_dh_secret,
snd_id, queue_mode, status, rcv_queue_id, rcv_primary, replace_rcv_queue_id, smp_client_version, server_key_hash,
link_id, link_key, link_priv_sig_key, link_enc_fixed_data
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
link_id, link_key, link_priv_sig_key, link_enc_fixed_data,
ntf_public_key, ntf_private_key, ntf_id, rcv_ntf_dh_secret
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);
Plan:
@@ -951,6 +952,10 @@ Plan:
Query: INSERT INTO xftp_servers (xftp_host, xftp_port, xftp_key_hash) VALUES (?,?,?)
Plan:
Query: SELECT 1 FROM connections WHERE conn_id = ? AND deleted_at_wait_delivery < ? LIMIT 1
Plan:
SEARCH connections USING PRIMARY KEY (conn_id=?)
Query: SELECT 1 FROM encrypted_rcv_message_hashes WHERE conn_id = ? AND hash = ? LIMIT 1
Plan:
SEARCH encrypted_rcv_message_hashes USING COVERING INDEX idx_encrypted_rcv_message_hashes_hash (conn_id=? AND hash=?)
@@ -5358,9 +5358,21 @@ SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ?
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND created_at <= ? AND item_content_tag != 'chatBanner'
Plan:
SEARCH chat_items USING COVERING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=? AND created_at<?)
SEARCH chat_items USING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=? AND created_at<?)
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?)
SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?)
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
Query: DELETE FROM chat_items WHERE user_id = ? AND contact_id = ? AND item_content_tag != 'chatBanner'
Plan:
SEARCH chat_items USING INDEX idx_chat_items_contacts_created_at (user_id=? AND contact_id=?)
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
@@ -5394,6 +5406,18 @@ SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
Query: DELETE FROM chat_items WHERE user_id = ? AND group_id = ? AND item_content_tag != 'chatBanner'
Plan:
SEARCH chat_items USING INDEX idx_chat_items_groups_user_mention (user_id=? AND group_id=?)
SEARCH chat_item_mentions USING COVERING INDEX idx_chat_item_mentions_chat_item_id (chat_item_id=?)
SEARCH group_snd_item_statuses USING COVERING INDEX idx_group_snd_item_statuses_chat_item_id (chat_item_id=?)
SEARCH chat_item_versions USING COVERING INDEX idx_chat_item_versions_chat_item_id (chat_item_id=?)
SEARCH calls USING COVERING INDEX idx_calls_chat_item_id (chat_item_id=?)
SEARCH chat_item_messages USING COVERING INDEX sqlite_autoindex_chat_item_messages_2 (chat_item_id=?)
SEARCH chat_items USING COVERING INDEX idx_chat_items_fwd_from_chat_item_id (fwd_from_chat_item_id=?)
SEARCH files USING COVERING INDEX idx_files_chat_item_id (chat_item_id=?)
SEARCH groups USING COVERING INDEX idx_groups_chat_item_id (chat_item_id=?)
Query: DELETE FROM chat_items WHERE user_id = ? AND note_folder_id = ?
Plan:
SEARCH chat_items USING COVERING INDEX idx_chat_items_notes_created_at (user_id=? AND note_folder_id=?)
+42 -43
View File
@@ -233,10 +233,7 @@ testAddContact = versionTestMatrix2 runTestAddContact
bob #$> ("/_read chat @2", id, "ok")
alice #$> ("/read user", id, "ok")
alice #$> ("/_read user 1", id, "ok")
features =
if pqExpected
then chatFeatures
else (0, e2eeInfoNoPQStr) : tail chatFeatures
features = if pqExpected then chatFeatures else chatFeaturesNoPQ
testRetryConnecting :: HasCallStack => TestParams -> IO ()
testRetryConnecting ps = testChatCfgOpts2 cfg' opts' aliceProfile bobProfile test ps
@@ -557,9 +554,9 @@ testContactClear =
alice <##> bob
threadDelay 500000
alice #$> ("/clear bob", id, "bob: all messages are removed locally ONLY")
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
bob #$> ("/clear alice", id, "alice: all messages are removed locally ONLY")
bob #$> ("/_get chat @2 count=100", chat, [])
bob #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
testDeleteContactDeletesProfile :: HasCallStack => TestParams -> IO ()
testDeleteContactDeletesProfile =
@@ -611,7 +608,7 @@ testDeleteConversationKeepContact =
alice ##> "/_delete @2 messages"
alice <## "bob: contact is deleted"
alice @@@ [("@bob", "")] -- UI would filter
alice @@@ [("@bob", "chat banner")] -- UI would filter
bob @@@ [("@alice", "hey")]
bob #> "@alice hi"
alice <# "bob> hi"
@@ -916,13 +913,13 @@ testDirectLiveMessage =
connectUsers alice bob
-- non-empty live message is sent instantly
alice `send` "/live @bob hello"
bob <# "alice> [LIVE started] use /show [on/off/7] hello"
bob <# "alice> [LIVE started] use /show [on/off/8] hello"
alice ##> ("/_update item @2 " <> itemId 1 <> " text hello there")
alice <# "@bob [LIVE] hello there"
bob <# "alice> [LIVE ended] hello there"
-- empty live message is also sent instantly
alice `send` "/live @bob"
bob <# "alice> [LIVE started] use /show [on/off/8]"
bob <# "alice> [LIVE started] use /show [on/off/9]"
alice ##> ("/_update item @2 " <> itemId 2 <> " text hello 2")
alice <# "@bob [LIVE] hello 2"
bob <# "alice> [LIVE ended] hello 2"
@@ -2002,7 +1999,7 @@ testUsersDifferentCIExpirationTTL ps = do
-- first user messages
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
-- second user messages
alice ##> "/user alisa"
@@ -2011,7 +2008,7 @@ testUsersDifferentCIExpirationTTL ps = do
threadDelay 2000000
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
where
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
@@ -2085,7 +2082,7 @@ testUsersRestartCIExpiration ps = do
-- first user messages
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
-- second user messages
alice ##> "/user alisa"
@@ -2094,7 +2091,7 @@ testUsersRestartCIExpiration ps = do
threadDelay 4000000
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
where
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
@@ -2143,7 +2140,7 @@ testEnableCIExpirationOnlyForOneUser ps = do
-- messages are deleted for first user
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
-- messages are not deleted for second user
alice ##> "/user alisa"
@@ -2204,7 +2201,7 @@ testDisableCIExpirationOnlyForOneUser ps = do
threadDelay 2000000
-- second user messages are deleted
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
withTestChatCfg ps cfg "alice" $ \alice -> do
alice <## "1 contacts connected (use /cs for the list)"
@@ -2218,12 +2215,12 @@ testDisableCIExpirationOnlyForOneUser ps = do
bob #> "@alisa alisa 4"
alice <# "bob> alisa 4"
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
threadDelay 2000000
-- second user messages are deleted
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
where
cfg = testCfg {initialCleanupManagerDelay = 0, cleanupManagerStepDelay = 0, ciExpirationInterval = 500000}
@@ -2263,11 +2260,11 @@ testUsersTimedMessages ps = do
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [(1, "alice 1"), (0, "alice 2")])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner"), (1, "alice 1"), (0, "alice 2")])
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 1"), (0, "alisa 2")])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 1"), (0, "alisa 2")])
threadDelay 1000000
@@ -2278,11 +2275,11 @@ testUsersTimedMessages ps = do
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 1"), (0, "alisa 2")])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 1"), (0, "alisa 2")])
threadDelay 1000000
@@ -2293,7 +2290,7 @@ testUsersTimedMessages ps = do
alice ##> "/user"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
-- first user messages
alice ##> "/user alice"
@@ -2319,11 +2316,11 @@ testUsersTimedMessages ps = do
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [(1, "alice 3"), (0, "alice 4")])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner"), (1, "alice 3"), (0, "alice 4")])
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
-- messages are deleted after restart
threadDelay 1000000
@@ -2335,11 +2332,11 @@ testUsersTimedMessages ps = do
alice ##> "/user alice"
showActiveUser alice "alice (Alice)"
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1,"chat banner")])
alice ##> "/user alisa"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [(1, "alisa 3"), (0, "alisa 4")])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner"), (1, "alisa 3"), (0, "alisa 4")])
threadDelay 1000000
@@ -2350,7 +2347,7 @@ testUsersTimedMessages ps = do
alice ##> "/user"
showActiveUser alice "alisa"
alice #$> ("/_get chat @6 count=100", chat, [])
alice #$> ("/_get chat @6 count=100", chat, [(1,"chat banner")])
where
configureTimedMessages :: HasCallStack => TestCC -> TestCC -> String -> String -> IO ()
configureTimedMessages alice bob bobId ttl = do
@@ -2406,20 +2403,21 @@ testUserPrivacy =
alice <## "alice (Alice)"
alice <## "alisa (active, hidden, muted, unread: 1)"
-- hidden message is saved
alice ##> "/tail"
alice ##> "/tail 11"
alice <##? chatHistory
alice ##> "/_get items count=10"
alice ##> "/_get items count=11"
alice <##? chatHistory
alice ##> "/_get items before=13 count=10"
alice ##> "/_get items before=15 count=10"
alice
<##? [ ConsoleString ("bob> " <> e2eeInfoPQStr),
<##? [ "@bob chat banner",
ConsoleString ("bob> " <> e2eeInfoPQStr),
"bob> Disappearing messages: allowed",
"bob> Full deletion: off",
"bob> Message reactions: enabled",
"bob> Voice messages: enabled",
"bob> Audio/video calls: enabled"
]
alice ##> "/_get items around=11 count=2"
alice ##> "/_get items around=13 count=2"
alice
<##? [ "bob> Full deletion: off",
"bob> Message reactions: enabled",
@@ -2427,7 +2425,7 @@ testUserPrivacy =
"bob> Audio/video calls: enabled",
"@bob hello"
]
alice ##> "/_get items after=12 count=10"
alice ##> "/_get items after=14 count=10"
alice
<##? [ "@bob hello",
"bob> hey",
@@ -2491,7 +2489,8 @@ testUserPrivacy =
alice <## "messages are shown"
alice <## "profile is visible"
chatHistory =
[ ConsoleString ("bob> " <> e2eeInfoPQStr),
[ "@bob chat banner",
ConsoleString ("bob> " <> e2eeInfoPQStr),
"bob> Disappearing messages: allowed",
"bob> Full deletion: off",
"bob> Message reactions: enabled",
@@ -2529,7 +2528,7 @@ testSetChatItemTTL =
alice #$> ("/_get chat @2 count=100", chatF, chatFeaturesF <> [((1, "1"), Nothing), ((0, "2"), Nothing), ((1, ""), Just "test.jpg"), ((1, "3"), Nothing), ((0, "4"), Nothing)])
checkActionDeletesFile "./tests/tmp/app_files/test.jpg" $
alice #$> ("/_ttl 1 2", id, "ok")
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4")]) -- when expiration is turned on, first cycle is synchronous
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4")]) -- when expiration is turned on, first cycle is synchronous
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, ""), (0, "3"), (1, "4")])
alice #$> ("/_ttl 1", id, "old messages are set to be deleted after: 2 second(s)")
alice #$> ("/ttl week", id, "ok")
@@ -2563,7 +2562,7 @@ testSetDirectChatTTL =
alice #$> ("/_get chat @2 count=100", chatF, chatFeaturesF <> [((1, "1"), Nothing), ((0, "2"), Nothing), ((1, "3"), Nothing), ((0, "4"), Nothing)])
alice #$> ("/_ttl 1 2", id, "ok")
-- when expiration is turned on, first cycle is synchronous
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4")])
-- chat @3 doesn't expire since it was set to not expire
alice #$> ("/_get chat @3 count=100", chat, chatFeatures <> [(1, "10"), (0, "11")])
@@ -2576,14 +2575,14 @@ testSetDirectChatTTL =
bob #> "@alice 6"
alice <# "bob> 6"
alice #$> ("/_get chat @3 count=100", chat, chatFeatures <> [(1, "10"), (0, "11")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
-- set ttl for chat @3, only chat @3 is affected since global ttl is disabled
alice #$> ("/_ttl 1 @3 1", id, "ok")
alice #$> ("/ttl @cath", id, "old messages are set to be deleted after: 1 second(s)")
threadDelay 3000000
alice #$> ("/_get chat @3 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, "3"), (1, "4"), (0, "5"), (1, "6")])
-- set ttl to never expire again
@@ -2593,16 +2592,16 @@ testSetDirectChatTTL =
cath #> "@alice 13"
alice <# "cath> 13"
threadDelay 3000000
alice #$> ("/_get chat @3 count=100", chat, [(1, "12"), (0, "13")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "3"), (0, "4"), (1, "5"), (0, "6")])
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner"), (1, "12"), (0, "13")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner"), (1, "3"), (0, "4"), (1, "5"), (0, "6")])
bob #$> ("/_get chat @2 count=100", chat, chatFeatures <> [(0, "1"), (1, "2"), (0, "3"), (1, "4"), (0, "5"), (1, "6")])
-- set ttl back to default
alice #$> ("/ttl @cath default", id, "ok")
alice #$> ("/ttl @cath", id, "old messages are set to delete according to default user config")
alice #$> ("/_ttl 1 2", id, "ok")
alice #$> ("/_get chat @3 count=100", chat, [])
alice #$> ("/_get chat @2 count=100", chat, [])
alice #$> ("/_get chat @3 count=100", chat, [(1, "chat banner")])
alice #$> ("/_get chat @2 count=100", chat, [(1, "chat banner")])
alice #$> ("/ttl @cath day", id, "ok")
alice #$> ("/ttl @cath", id, "old messages are set to be deleted after: one day")
+4 -4
View File
@@ -345,11 +345,11 @@ testGroupShared alice bob cath checkMessages = do
-- test clearing chat
threadDelay 1000000
alice #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
alice #$> ("/_get chat #1 count=100", chat, [])
alice #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
bob #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
bob #$> ("/_get chat #1 count=100", chat, [])
bob #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
cath #$> ("/clear #team", id, "#team: all messages are removed locally ONLY")
cath #$> ("/_get chat #1 count=100", chat, [])
cath #$> ("/_get chat #1 count=100", chat, [(1,"chat banner")])
where
getReadChats :: HasCallStack => String -> String -> IO ()
getReadChats msgItem1 msgItem2 = do
@@ -588,7 +588,7 @@ testGroup2 =
]
dan <##> alice
-- show last messages
alice ##> "/t #club 19"
alice ##> "/t #club 20"
alice -- these strings are expected in any order because of sorting by time and rounding of time for sent
<##?
( map (ConsoleString . ("#club " <> )) groupFeatureStrs
+1 -1
View File
@@ -2220,7 +2220,7 @@ testSetContactPrefs = testChat2 aliceProfile bobProfile $
alice ##> "/_set prefs @2 {}"
alice <## "your preferences for bob did not change"
(bob </)
let startFeatures = [(0, e2eeInfoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
let startFeatures = [(1, "chat banner"), (0, e2eeInfoPQStr), (0, "Disappearing messages: allowed"), (0, "Full deletion: off"), (0, "Message reactions: enabled"), (0, "Voice messages: off"), (0, "Audio/video calls: enabled")]
alice #$> ("/_get chat @2 count=100", chat, startFeatures)
bob #$> ("/_get chat @2 count=100", chat, startFeatures)
let sendVoice = "/_send @2 json [{\"filePath\": \"test.txt\", \"msgContent\": {\"type\": \"voice\", \"text\": \"\", \"duration\": 10}}]"
+16 -6
View File
@@ -271,6 +271,11 @@ chat'' = read
chatFeatures :: [(Int, String)]
chatFeatures = map (\(a, _, _) -> a) chatFeatures''
chatFeaturesNoPQ :: [(Int, String)]
chatFeaturesNoPQ =
map (\(a, _, _) -> a) $
((1, "chat banner"), Nothing, Nothing) : ((0, e2eeInfoNoPQStr), Nothing, Nothing) : chatFeatures_
chatFeatures' :: [((Int, String), Maybe (Int, String))]
chatFeatures' = map (\(a, b, _) -> (a, b)) chatFeatures''
@@ -278,9 +283,11 @@ chatFeaturesF :: [((Int, String), Maybe String)]
chatFeaturesF = map (\(a, _, c) -> (a, c)) chatFeatures''
chatFeatures'' :: [((Int, String), Maybe (Int, String), Maybe String)]
chatFeatures'' =
[ ((0, e2eeInfoPQStr), Nothing, Nothing),
((0, "Disappearing messages: allowed"), Nothing, Nothing),
chatFeatures'' = ((1, "chat banner"), Nothing, Nothing) : ((0, e2eeInfoPQStr), Nothing, Nothing) : chatFeatures_
chatFeatures_ :: [((Int, String), Maybe (Int, String), Maybe String)]
chatFeatures_ =
[ ((0, "Disappearing messages: allowed"), Nothing, Nothing),
((0, "Full deletion: off"), Nothing, Nothing),
((0, "Message reactions: enabled"), Nothing, Nothing),
((0, "Voice messages: enabled"), Nothing, Nothing),
@@ -300,7 +307,7 @@ groupFeatures :: [(Int, String)]
groupFeatures = map (\(a, _, _) -> a) $ groupFeatures'' 0
groupFeaturesNoE2E :: [(Int, String)]
groupFeaturesNoE2E = map (\(a, _, _) -> a) $ groupFeatures_ 0
groupFeaturesNoE2E = map (\(a, _, _) -> a) $ ((1, "chat banner"), Nothing, Nothing) : groupFeatures_ 0
sndGroupFeatures :: [(Int, String)]
sndGroupFeatures = map (\(a, _, _) -> a) $ groupFeatures'' 1
@@ -309,7 +316,7 @@ groupFeatureStrs :: [String]
groupFeatureStrs = map (\(a, _, _) -> snd a) $ groupFeatures'' 0
groupFeatures'' :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
groupFeatures'' dir = ((dir, e2eeInfoNoPQStr), Nothing, Nothing) : groupFeatures_ dir
groupFeatures'' dir = ((1, "chat banner"), Nothing, Nothing) : ((dir, e2eeInfoNoPQStr), Nothing, Nothing) : groupFeatures_ dir
groupFeatures_ :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
groupFeatures_ dir =
@@ -330,7 +337,8 @@ businessGroupFeatures = map (\(a, _, _) -> a) $ businessGroupFeatures'' 0
businessGroupFeatures'' :: Int -> [((Int, String), Maybe (Int, String), Maybe String)]
businessGroupFeatures'' dir =
-- [ ((dir, e2eeInfoNoPQStr), Nothing, Nothing),
[ ((dir, "Disappearing messages: on"), Nothing, Nothing),
[ ((1, "chat banner"), Nothing, Nothing),
((dir, "Disappearing messages: on"), Nothing, Nothing),
((dir, "Direct messages: off"), Nothing, Nothing),
((dir, "Full deletion: off"), Nothing, Nothing),
((dir, "Message reactions: on"), Nothing, Nothing),
@@ -505,6 +513,8 @@ dropTime_ :: String -> Maybe String
dropTime_ msg = case splitAt 6 msg of
([m, m', ':', s, s', ' '], text) ->
if all isDigit [m, m', s, s'] then Just text else Nothing
([month, month', '-', d, d', ' '], text) ->
if all isDigit [month, month', d, d'] then Just text else Nothing
_ -> Nothing
dropStrPrefix :: HasCallStack => String -> String -> String