Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import Shared
import Combine
import AppCore
import XXModels
import InputField
import AppResources
import Dependencies
import Foundation // ?
struct CreateGroupViewModel {
struct ViewState {
var welcome: String?
var groupName: String = ""
var status: InputField.ValidationStatus = .unknown(nil)
var shouldDismiss: Bool = false
}
@Dependency(\.app.bgQueue) var bgQueue
@Dependency(\.app.dbManager) var dbManager
@Dependency(\.app.messenger) var messenger
@Dependency(\.groupManager) var groupManager
@Dependency(\.app.hudManager) var hudManager
var statePublisher: AnyPublisher<ViewState, Never> {
stateSubject.eraseToAnyPublisher()
}
private let stateSubject = CurrentValueSubject<ViewState, Never>(.init())
func didInput(_ string: String) {
stateSubject.value.groupName = string
validate()
}
func didOtherInput(_ string: String) {
stateSubject.value.welcome = string
}
func didTapCreate(_ members: [Contact]) {
hudManager.show()
let welcome = stateSubject.value.welcome
let name = stateSubject.value.groupName.trimmingCharacters(in: .whitespacesAndNewlines)
bgQueue.schedule {
do {
guard let manager = groupManager.get() else {
fatalError("Can't create a group w/out a manager")
}
let report = try manager.makeGroup(
membership: members.map(\.id),
message: welcome?.data(using: .utf8),
name: name.data(using: .utf8)
)
let group = Group(
id: report.id,
name: name,
leaderId: try messenger.e2e.get()!.getContact().getId(),
createdAt: Date(),
authStatus: .participating,
serialized: try report.encode()
)
try dbManager.getDB().saveGroup(group)
if let welcome {
try dbManager.getDB().saveMessage(.init(
senderId: try messenger.e2e.get()!.getContact().getId(),
recipientId: nil,
groupId: group.id,
date: group.createdAt,
status: .sent,
isUnread: false,
text: welcome
))
}
try members.map {
GroupMember(groupId: group.id, contactId: $0.id)
}.forEach {
try dbManager.getDB().saveGroupMember($0)
}
_ = try dbManager.getDB().fetchGroupInfos(
.init(groupId: group.id)
).first
hudManager.hide()
stateSubject.value.shouldDismiss = true
} catch {
hudManager.show(.init(error: error))
}
}
}
private func validate() {
let value = stateSubject.value.groupName.trimmingCharacters(in: .whitespacesAndNewlines)
guard value.count >= 4 else {
stateSubject.value.status = .invalid(Localized.CreateGroup.Drawer.minimum)
return
}
guard value.count < 21 else {
stateSubject.value.status = .invalid(Localized.CreateGroup.Drawer.maximum)
return
}
stateSubject.value.status = .valid(nil)
}
}