remove last change timestamp in local database

pull/731/head
Ryan ZHAO 1 year ago
parent 978ec30074
commit 362dcd3528

@ -32,7 +32,7 @@ final class InfoMessageCell: MessageCell {
private lazy var label: UILabel = {
let result: UILabel = UILabel()
result.font = .boldSystemFont(ofSize: Values.verySmallFontSize)
result.font = .systemFont(ofSize: Values.verySmallFontSize)
result.themeTextColor = .textSecondary
result.textAlignment = .center
result.lineBreakMode = .byWordWrapping
@ -115,16 +115,42 @@ final class InfoMessageCell: MessageCell {
iconImageView.themeTintColor = .textSecondary
}
self.label.text = cellViewModel.body
self.label.themeTextColor = (cellViewModel.variant == .infoClosedGroupCurrentUserErrorLeaving) ? .danger : .textSecondary
if cellViewModel.variant == .infoDisappearingMessagesUpdate && cellViewModel.canDoFollowingSetting() {
self.actionLabel.isHidden = false
self.actionLabel.text = "FOLLOW_SETTING_TITLE".localized()
if cellViewModel.variant == .infoDisappearingMessagesUpdate, let body: String = cellViewModel.body {
self.label.attributedText = NSAttributedString(string: body)
.adding(
attributes: [ .font: UIFont.boldSystemFont(ofSize: Values.verySmallFontSize) ],
range: (body as NSString).range(of: cellViewModel.authorName)
)
.adding(
attributes: [ .font: UIFont.boldSystemFont(ofSize: Values.verySmallFontSize) ],
range: (body as NSString).range(of: "vc_path_device_row_title".localized())
)
.adding(
attributes: [ .font: UIFont.boldSystemFont(ofSize: Values.verySmallFontSize) ],
range: (body as NSString).range(of: floor(cellViewModel.threadExpirationTimer ?? 0).formatted(format: .long))
)
.adding(
attributes: [ .font: UIFont.boldSystemFont(ofSize: Values.verySmallFontSize) ],
range: (body as NSString).range(of: (cellViewModel.threadExpirationType == .disappearAfterRead ? "DISAPPEARING_MESSAGE_STATE_READ".localized() : "DISAPPEARING_MESSAGE_STATE_SENT".localized()))
)
.adding(
attributes: [ .font: UIFont.boldSystemFont(ofSize: Values.verySmallFontSize) ],
range: (body as NSString).range(of: "DISAPPEARING_MESSAGES_OFF".localized().lowercased())
)
if cellViewModel.canDoFollowingSetting() {
self.actionLabel.isHidden = false
self.actionLabel.text = "FOLLOW_SETTING_TITLE".localized()
} else {
self.actionLabel.isHidden = true
self.actionLabel.text = nil
}
} else {
self.actionLabel.isHidden = true
self.label.text = cellViewModel.body
}
self.label.themeTextColor = (cellViewModel.variant == .infoClosedGroupCurrentUserErrorLeaving) ? .danger : .textSecondary
let shouldShowIcon: Bool = (icon != nil) || ((cellViewModel.expiresInSeconds ?? 0) > 0)
iconContainerViewWidthConstraint.constant = shouldShowIcon ? InfoMessageCell.iconSize : 0

@ -143,8 +143,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
let updatedConfig: DisappearingMessagesConfiguration = currentSelection
.with(
isEnabled: false,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds
)
self?.shouldShowConfirmButton.send(updatedConfig != config)
self?.currentSelection.send(updatedConfig)
@ -170,8 +169,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
.with(
isEnabled: true,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.legacy.seconds,
type: .disappearAfterRead, // Default for 1-1
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
type: .disappearAfterRead // Default for 1-1
)
}()
self?.shouldShowConfirmButton.send(updatedConfig != config)
@ -210,8 +208,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
.with(
isEnabled: true,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.disappearAfterRead.seconds,
type: .disappearAfterRead,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
type: .disappearAfterRead
)
}()
self?.shouldShowConfirmButton.send(updatedConfig != config)
@ -249,8 +246,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
.with(
isEnabled: true,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.disappearAfterSend.seconds,
type: .disappearAfterSend,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
type: .disappearAfterSend
)
}()
self?.shouldShowConfirmButton.send(updatedConfig != config)
@ -291,8 +287,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
onTap: {
let updatedConfig: DisappearingMessagesConfiguration = currentSelection
.with(
durationSeconds: duration,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
durationSeconds: duration
)
self?.shouldShowConfirmButton.send(updatedConfig != config)
self?.currentSelection.send(updatedConfig)
@ -327,8 +322,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
let updatedConfig: DisappearingMessagesConfiguration = currentSelection
.with(
isEnabled: false,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds
)
self?.shouldShowConfirmButton.send(updatedConfig != config)
self?.currentSelection.send(updatedConfig)
@ -357,8 +351,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
.with(
isEnabled: true,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.legacy.seconds,
type: .disappearAfterSend, // Default for closed group & note to self
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
type: .disappearAfterSend // Default for closed group & note to self
)
}()
self?.shouldShowConfirmButton.send(updatedConfig != config)
@ -408,8 +401,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
let updatedConfig: DisappearingMessagesConfiguration = currentSelection
.with(
isEnabled: false,
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds,
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
durationSeconds: DisappearingMessagesConfiguration.DefaultDuration.off.seconds
)
self?.shouldShowConfirmButton.send(updatedConfig != config)
self?.currentSelection.send(updatedConfig)
@ -456,8 +448,7 @@ class ThreadDisappearingMessagesSettingsViewModel: SessionTableViewModel, Naviga
type: (Features.useNewDisappearingMessagesConfig ?
.disappearAfterSend :
nil
),
lastChangeTimestampMs: SnodeAPI.currentOffsetTimestampMs()
)
)
self?.shouldShowConfirmButton.send(updatedConfig != config)
self?.currentSelection.send(updatedConfig)

@ -597,8 +597,7 @@ enum _003_YDBToGRDBMigration: Migration {
try DisappearingMessagesConfiguration(
threadId: threadId,
isEnabled: config.isEnabled,
durationSeconds: TimeInterval(config.durationSeconds),
lastChangeTimestampMs: 0
durationSeconds: TimeInterval(config.durationSeconds)
).migrationSafeInsert(db)
}
else {

@ -20,8 +20,6 @@ enum _017_DisappearingMessagesConfiguration: Migration {
static func migrate(_ db: GRDB.Database) throws {
try db.alter(table: DisappearingMessagesConfiguration.self) { t in
t.add(.type, .integer)
t.add(.lastChangeTimestampMs, .integer)
.defaults(to: 0)
}
try db.alter(table: Contact.self) { t in

@ -17,7 +17,6 @@ public struct DisappearingMessagesConfiguration: Codable, Identifiable, Equatabl
case isEnabled
case durationSeconds
case type
case lastChangeTimestampMs
}
public enum DefaultDuration {
@ -81,7 +80,6 @@ public struct DisappearingMessagesConfiguration: Codable, Identifiable, Equatabl
public let isEnabled: Bool
public let durationSeconds: TimeInterval
public var type: DisappearingMessageType?
public let lastChangeTimestampMs: Int64?
// MARK: - Relationships
@ -98,23 +96,20 @@ public extension DisappearingMessagesConfiguration {
threadId: threadId,
isEnabled: false,
durationSeconds: 0,
type: .unknown,
lastChangeTimestampMs: 0
type: .unknown
)
}
func with(
isEnabled: Bool? = nil,
durationSeconds: TimeInterval? = nil,
type: DisappearingMessageType? = nil,
lastChangeTimestampMs: Int64? = nil
type: DisappearingMessageType? = nil
) -> DisappearingMessagesConfiguration {
return DisappearingMessagesConfiguration(
threadId: threadId,
isEnabled: (isEnabled ?? self.isEnabled),
durationSeconds: (durationSeconds ?? self.durationSeconds),
type: (isEnabled == false) ? .unknown : (type ?? self.type),
lastChangeTimestampMs: (lastChangeTimestampMs ?? self.lastChangeTimestampMs)
type: (isEnabled == false) ? .unknown : (type ?? self.type)
)
}
}

@ -179,22 +179,16 @@ internal extension SessionUtil {
.fetchOne(db, id: sessionId)
.defaulting(to: DisappearingMessagesConfiguration.defaultWith(sessionId))
if
let remoteLastChangeTimestampMs = data.config.lastChangeTimestampMs,
let localLastChangeTimestampMs = localConfig.lastChangeTimestampMs,
remoteLastChangeTimestampMs > localLastChangeTimestampMs
{
if data.config != localConfig {
_ = try localConfig.with(
isEnabled: data.config.isEnabled,
durationSeconds: data.config.durationSeconds,
type: data.config.type,
lastChangeTimestampMs: data.config.lastChangeTimestampMs
type: data.config.type
).save(db)
_ = try Interaction
.filter(Interaction.Columns.threadId == sessionId)
.filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate)
.filter(Interaction.Columns.timestampMs <= (remoteLastChangeTimestampMs - Int64(data.config.durationSeconds * 1000)))
.deleteAll(db)
}
}
@ -704,8 +698,7 @@ private extension SessionUtil {
threadId: contactId,
isEnabled: contact.exp_seconds > 0,
durationSeconds: TimeInterval(contact.exp_seconds),
type: DisappearingMessagesConfiguration.DisappearingMessageType(sessionUtilType: contact.exp_mode),
lastChangeTimestampMs: latestConfigSentTimestampMs
type: DisappearingMessagesConfiguration.DisappearingMessageType(sessionUtilType: contact.exp_mode)
)
result[contactId] = ContactData(

@ -89,8 +89,7 @@ internal extension SessionUtil {
.with(
isEnabled: (legacyGroup.disappearing_timer > 0),
durationSeconds: TimeInterval(legacyGroup.disappearing_timer),
type: .disappearAfterSend,
lastChangeTimestampMs: latestConfigSentTimestampMs
type: .disappearAfterSend
),
groupMembers: members
.filter { _, isAdmin in !isAdmin }
@ -278,23 +277,16 @@ internal extension SessionUtil {
.fetchOne(db, id: group.id)
.defaulting(to: DisappearingMessagesConfiguration.defaultWith(group.id))
if
let remoteConfig = group.disappearingConfig,
let remoteLastChangeTimestampMs = remoteConfig.lastChangeTimestampMs,
let localLastChangeTimestampMs = localConfig.lastChangeTimestampMs,
remoteLastChangeTimestampMs > localLastChangeTimestampMs
{
if let remoteConfig = group.disappearingConfig {
_ = try localConfig.with(
isEnabled: remoteConfig.isEnabled,
durationSeconds: remoteConfig.durationSeconds,
type: remoteConfig.type,
lastChangeTimestampMs: remoteConfig.lastChangeTimestampMs
type: remoteConfig.type
).save(db)
_ = try Interaction
.filter(Interaction.Columns.threadId == group.id)
.filter(Interaction.Columns.variant == Interaction.Variant.infoDisappearingMessagesUpdate)
.filter(Interaction.Columns.timestampMs <= (remoteLastChangeTimestampMs - Int64(remoteConfig.durationSeconds * 1000)))
.deleteAll(db)
}

@ -126,23 +126,17 @@ internal extension SessionUtil {
threadId: userPublicKey,
isEnabled: targetIsEnable,
durationSeconds: TimeInterval(targetExpiry),
type: targetIsEnable ? .disappearAfterSend : .unknown,
lastChangeTimestampMs: latestConfigSentTimestampMs
type: targetIsEnable ? .disappearAfterSend : .unknown
)
let localConfig: DisappearingMessagesConfiguration = try DisappearingMessagesConfiguration
.fetchOne(db, id: userPublicKey)
.defaulting(to: DisappearingMessagesConfiguration.defaultWith(userPublicKey))
if
let remoteLastChangeTimestampMs = targetConfig.lastChangeTimestampMs,
let localLastChangeTimestampMs = localConfig.lastChangeTimestampMs,
remoteLastChangeTimestampMs > localLastChangeTimestampMs
{
if targetConfig != localConfig {
_ = try localConfig.with(
isEnabled: targetConfig.isEnabled,
durationSeconds: targetConfig.durationSeconds,
type: targetConfig.type,
lastChangeTimestampMs: targetConfig.lastChangeTimestampMs
type: targetConfig.type
).save(db)
}

@ -499,8 +499,7 @@ public extension MessageViewModel {
.with(
isEnabled: (self.expiresInSeconds ?? 0) > 0,
durationSeconds: self.expiresInSeconds,
type: (Int64(self.expiresStartedAtMs ?? 0) == self.timestampMs ? .disappearAfterSend : .disappearAfterRead ),
lastChangeTimestampMs: nil
type: (Int64(self.expiresStartedAtMs ?? 0) == self.timestampMs ? .disappearAfterSend : .disappearAfterRead )
)
}
@ -510,12 +509,12 @@ public extension MessageViewModel {
.with(
isEnabled: (self.threadExpirationTimer ?? 0) > 0,
durationSeconds: self.threadExpirationTimer,
type: self.threadExpirationType,
lastChangeTimestampMs: nil
type: self.threadExpirationType
)
}
func canDoFollowingSetting() -> Bool {
guard self.authorId != self.currentUserPublicKey else { return false }
return self.messageDisappearingConfiguration() != self.threadDisappearingConfiguration()
}
}

Loading…
Cancel
Save