Skip to content
Snippets Groups Projects

[Messenger example] join group

Merged Dariusz Rybicki requested to merge feature/messenger-example-join-group into development
3 files
+ 150
1
Compare changes
  • Side-by-side
  • Inline
Files
3
import AppCore
import AppCore
import ComposableArchitecture
import ComposableArchitecture
import Foundation
import Foundation
 
import XXMessengerClient
import XXModels
import XXModels
public struct GroupComponent: ReducerProtocol {
public struct GroupComponent: ReducerProtocol {
public struct State: Equatable {
public struct State: Equatable {
public init(
public init(
groupId: XXModels.Group.ID,
groupId: XXModels.Group.ID,
groupInfo: XXModels.GroupInfo? = nil
groupInfo: XXModels.GroupInfo? = nil,
 
isJoining: Bool = false,
 
joinFailure: String? = nil
) {
) {
self.groupId = groupId
self.groupId = groupId
self.groupInfo = groupInfo
self.groupInfo = groupInfo
 
self.isJoining = isJoining
 
self.joinFailure = joinFailure
}
}
public var groupId: XXModels.Group.ID
public var groupId: XXModels.Group.ID
public var groupInfo: XXModels.GroupInfo?
public var groupInfo: XXModels.GroupInfo?
 
public var isJoining: Bool
 
public var joinFailure: String?
}
}
public enum Action: Equatable {
public enum Action: Equatable {
case start
case start
case didFetchGroupInfo(XXModels.GroupInfo?)
case didFetchGroupInfo(XXModels.GroupInfo?)
 
case joinButtonTapped
 
case didJoin
 
case didFailToJoin(String)
}
}
public init() {}
public init() {}
 
@Dependency(\.app.messenger) var messenger: Messenger
@Dependency(\.app.dbManager.getDB) var db: DBManagerGetDB
@Dependency(\.app.dbManager.getDB) var db: DBManagerGetDB
@Dependency(\.app.mainQueue) var mainQueue: AnySchedulerOf<DispatchQueue>
@Dependency(\.app.mainQueue) var mainQueue: AnySchedulerOf<DispatchQueue>
@Dependency(\.app.bgQueue) var bgQueue: AnySchedulerOf<DispatchQueue>
@Dependency(\.app.bgQueue) var bgQueue: AnySchedulerOf<DispatchQueue>
@@ -47,6 +58,36 @@ public struct GroupComponent: ReducerProtocol {
@@ -47,6 +58,36 @@ public struct GroupComponent: ReducerProtocol {
case .didFetchGroupInfo(let groupInfo):
case .didFetchGroupInfo(let groupInfo):
state.groupInfo = groupInfo
state.groupInfo = groupInfo
return .none
return .none
 
 
case .joinButtonTapped:
 
guard let info = state.groupInfo else { return .none }
 
state.isJoining = true
 
state.joinFailure = nil
 
return Effect.result {
 
do {
 
let groupChat = try messenger.groupChat.tryGet()
 
try groupChat.joinGroup(serializedGroupData: info.group.serialized)
 
var group = info.group
 
group.authStatus = .participating
 
try db().saveGroup(group)
 
return .success(.didJoin)
 
} catch {
 
return .success(.didFailToJoin(error.localizedDescription))
 
}
 
}
 
.subscribe(on: bgQueue)
 
.receive(on: mainQueue)
 
.eraseToEffect()
 
 
case .didJoin:
 
state.isJoining = false
 
state.joinFailure = nil
 
return .none
 
 
case .didFailToJoin(let failure):
 
state.isJoining = false
 
state.joinFailure = failure
 
return .none
}
}
}
}
}
}
Loading