diff --git a/Code.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Code.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 9d08e0d1b..5b6a5f3ee 100644 --- a/Code.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Code.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/code-payments/flipcash2-client-protocol", "state" : { - "revision" : "9f6e3805672e955863dc91302bc60e27b7f03977", - "version" : "0.2.0" + "revision" : "27e3f09a82f6fbd41c03026ee738f943f4ed465e", + "version" : "0.4.0" } }, { @@ -212,8 +212,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/code-payments/ocp-client-protocol", "state" : { - "revision" : "b08adb951fcaaa463da21a4dfaa775577254d052", - "version" : "0.2.0" + "revision" : "7c37ecc098d682ccf7ac95e5bd48ef770dbc7962", + "version" : "0.3.0" } }, { diff --git a/FlipcashAPI/Package.swift b/FlipcashAPI/Package.swift index b9d2ebbc5..9babd2a7a 100644 --- a/FlipcashAPI/Package.swift +++ b/FlipcashAPI/Package.swift @@ -34,8 +34,8 @@ let contractDependencies: [Package.Dependency] = protoLocalRoot.map { root in .package(path: "\(root)/flipcash2-client-protocol"), ] } ?? [ - .package(url: "https://github.com/code-payments/ocp-client-protocol", exact: "0.2.0"), - .package(url: "https://github.com/code-payments/flipcash2-client-protocol", exact: "0.2.0"), + .package(url: "https://github.com/code-payments/ocp-client-protocol", exact: "0.3.0"), + .package(url: "https://github.com/code-payments/flipcash2-client-protocol", exact: "0.4.0"), ] let package = Package( diff --git a/FlipcashCore/Sources/FlipcashCore/Models/UserFlags.swift b/FlipcashCore/Sources/FlipcashCore/Models/UserFlags.swift index a0f2db378..987c969ef 100644 --- a/FlipcashCore/Sources/FlipcashCore/Models/UserFlags.swift +++ b/FlipcashCore/Sources/FlipcashCore/Models/UserFlags.swift @@ -46,6 +46,14 @@ public struct UserFlags: Codable, Sendable { /// Server-defined tip amounts per fiat currency, in major units. public let tipPresets: [TipPresets] + /// Duration after message creation when a message can be edited, or `nil` when the + /// server did not send a window. + public let messageEditWindow: TimeInterval? + + /// Duration after message creation when a message can be deleted, or `nil` when the + /// server did not send a window. + public let messageDeleteWindow: TimeInterval? + /// Returns the tip presets for a currency, falling back to the USD row — /// mirroring the server's minimum-enforcement fallback — or `nil` when the /// server provided no presets at all. @@ -147,7 +155,9 @@ extension UserFlags { enablePhoneNumberSend: proto.enablePhoneNumberSend, requireCoinbaseEmailVerification: proto.requireCoinbaseEmailVerification, preferredOnrampUsdcLiquidityPool: UsdcLiquidityPool(proto.preferredOnRampUsdcLiquidityPool), - tipPresets: proto.tipPresets.compactMap { TipPresets($0) } + tipPresets: proto.tipPresets.compactMap { TipPresets($0) }, + messageEditWindow: proto.hasMessageEditWindow ? TimeInterval(proto.messageEditWindow.seconds) : nil, + messageDeleteWindow: proto.hasMessageDeleteWindow ? TimeInterval(proto.messageDeleteWindow.seconds) : nil ) } } diff --git a/FlipcashTests/Database/Database+ProfileTests.swift b/FlipcashTests/Database/Database+ProfileTests.swift index c586565bb..e10a4c311 100644 --- a/FlipcashTests/Database/Database+ProfileTests.swift +++ b/FlipcashTests/Database/Database+ProfileTests.swift @@ -29,7 +29,9 @@ struct DatabaseProfileTests { tipPresets: [ UserFlags.TipPresets(currency: .usd, minimum: 1, low: 5, medium: 10, high: 20), UserFlags.TipPresets(currency: .cad, minimum: 2, low: 5, medium: 10, high: 25), - ] + ], + messageEditWindow: 900, + messageDeleteWindow: 300 ) /// Restricted account: no onramp providers, unset timeout, zero fees. @@ -48,7 +50,9 @@ struct DatabaseProfileTests { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: false, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: [] + tipPresets: [], + messageEditWindow: nil, + messageDeleteWindow: nil ) // MARK: - Empty (fresh install) - diff --git a/FlipcashTests/SessionTests.swift b/FlipcashTests/SessionTests.swift index 6eb6d69c0..2871661a8 100644 --- a/FlipcashTests/SessionTests.swift +++ b/FlipcashTests/SessionTests.swift @@ -707,7 +707,9 @@ struct SessionOfflineCacheTests { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: false, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: [] + tipPresets: [], + messageEditWindow: nil, + messageDeleteWindow: nil ) } diff --git a/FlipcashTests/TestSupport/UserFlags+Fixtures.swift b/FlipcashTests/TestSupport/UserFlags+Fixtures.swift index 0c0b7daaa..900255913 100644 --- a/FlipcashTests/TestSupport/UserFlags+Fixtures.swift +++ b/FlipcashTests/TestSupport/UserFlags+Fixtures.swift @@ -28,7 +28,9 @@ extension UserFlags { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: requireCoinbaseEmailVerification, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: tipPresets + tipPresets: tipPresets, + messageEditWindow: nil, + messageDeleteWindow: nil ) } } diff --git a/FlipcashTests/TestSupport/WithdrawViewModel+TestSupport.swift b/FlipcashTests/TestSupport/WithdrawViewModel+TestSupport.swift index 145ab5551..39345f207 100644 --- a/FlipcashTests/TestSupport/WithdrawViewModel+TestSupport.swift +++ b/FlipcashTests/TestSupport/WithdrawViewModel+TestSupport.swift @@ -44,7 +44,9 @@ enum WithdrawViewModelTestHelpers { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: false, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: [] + tipPresets: [], + messageEditWindow: nil, + messageDeleteWindow: nil ) return WithdrawViewModel( @@ -139,7 +141,9 @@ enum WithdrawViewModelTestHelpers { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: false, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: [] + tipPresets: [], + messageEditWindow: nil, + messageDeleteWindow: nil ) } let stored = try #require(container.session.balance(for: .usdf)) diff --git a/FlipcashTests/WithdrawViewModelTests.swift b/FlipcashTests/WithdrawViewModelTests.swift index c666a0af3..5cf92f135 100644 --- a/FlipcashTests/WithdrawViewModelTests.swift +++ b/FlipcashTests/WithdrawViewModelTests.swift @@ -332,7 +332,9 @@ struct WithdrawViewModelTests { enablePhoneNumberSend: false, requireCoinbaseEmailVerification: false, preferredOnrampUsdcLiquidityPool: .unknown, - tipPresets: [] + tipPresets: [], + messageEditWindow: nil, + messageDeleteWindow: nil ) } let stored = try #require(container.session.balance(for: mint))