Skip to content
Snippets Groups Projects

[Messenger example] create new group

Merged Dariusz Rybicki requested to merge feature/messenger-example-groups into development
3 files
+ 79
27
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -6,23 +6,34 @@ import XXModels
@@ -6,23 +6,34 @@ import XXModels
public struct NewGroupComponent: ReducerProtocol {
public struct NewGroupComponent: ReducerProtocol {
public struct State: Equatable {
public struct State: Equatable {
 
public enum Field: String, Hashable {
 
case name
 
}
 
public init(
public init(
contacts: IdentifiedArrayOf<XXModels.Contact> = [],
contacts: IdentifiedArrayOf<XXModels.Contact> = [],
members: IdentifiedArrayOf<XXModels.Contact> = []
members: IdentifiedArrayOf<XXModels.Contact> = [],
 
name: String = "",
 
focusedField: Field? = nil
) {
) {
self.contacts = contacts
self.contacts = contacts
self.members = members
self.members = members
 
self.name = name
 
self.focusedField = focusedField
}
}
public var contacts: IdentifiedArrayOf<XXModels.Contact>
public var contacts: IdentifiedArrayOf<XXModels.Contact>
public var members: IdentifiedArrayOf<XXModels.Contact>
public var members: IdentifiedArrayOf<XXModels.Contact>
 
@BindableState public var name: String
 
@BindableState public var focusedField: Field?
}
}
public enum Action: Equatable {
public enum Action: Equatable, BindableAction {
case start
case start
case didFetchContacts([XXModels.Contact])
case didFetchContacts([XXModels.Contact])
case didSelectContact(XXModels.Contact)
case didSelectContact(XXModels.Contact)
case didFinish
case didFinish
 
case binding(BindingAction<State>)
}
}
public init() {}
public init() {}
@@ -32,34 +43,40 @@ public struct NewGroupComponent: ReducerProtocol {
@@ -32,34 +43,40 @@ public struct NewGroupComponent: ReducerProtocol {
@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>
public func reduce(into state: inout State, action: Action) -> EffectTask<Action> {
public var body: some ReducerProtocol<State, Action> {
switch action {
BindingReducer()
case .start:
Reduce { state, action in
let myId = try? messenger.e2e.tryGet().getContact().getId()
switch action {
return Effect
case .start:
.catching { try db() }
let myId = try? messenger.e2e.tryGet().getContact().getId()
.flatMap { $0.fetchContactsPublisher(.init()) }
return Effect
.assertNoFailure()
.catching { try db() }
.map { $0.filter { $0.id != myId } }
.flatMap { $0.fetchContactsPublisher(.init()) }
.map(Action.didFetchContacts)
.assertNoFailure()
.subscribe(on: bgQueue)
.map { $0.filter { $0.id != myId } }
.receive(on: mainQueue)
.map(Action.didFetchContacts)
.eraseToEffect()
.subscribe(on: bgQueue)
 
.receive(on: mainQueue)
 
.eraseToEffect()
case .didFetchContacts(let contacts):
case .didFetchContacts(let contacts):
state.contacts = IdentifiedArray(uniqueElements: contacts)
state.contacts = IdentifiedArray(uniqueElements: contacts)
return .none
return .none
case .didSelectContact(let contact):
case .didSelectContact(let contact):
if state.members.contains(contact) {
if state.members.contains(contact) {
state.members.remove(contact)
state.members.remove(contact)
} else {
} else {
state.members.append(contact)
state.members.append(contact)
}
}
return .none
return .none
case .didFinish:
case .didFinish:
return .none
return .none
 
 
case .binding(_):
 
return .none
 
}
}
}
}
}
}
}
Loading