-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGroupModerationsView.swift
125 lines (107 loc) · 4.09 KB
/
GroupModerationsView.swift
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//
// GroupModerationsView.swift
// SendbirdSwiftUI
//
// Copyright © 2024 Sendbird, Inc. All rights reserved.
//
import SwiftUI
import SendbirdChatSDK
/// A view that displays a GroupModerations
public struct GroupModerationsView: View {
// MARK: - Properties
@Environment(\.dismiss)
private var dismiss
var configurations: [(SBUModerationsViewController) -> Void] = []
// Non-optional since `channelURL` is required.
@ObservedObject private var provider: GroupModerationsViewProvider
init(provider: GroupModerationsViewProvider) {
self.provider = provider
}
public var body: some View {
SBUViewControllerSet.GroupModerationsViewController
.swiftUI {
createViewController()
}
.injectData { viewController in
if self.shouldUpdateData(viewController: viewController) {
// Inject data into view model and load
viewController.viewModel?.initializeAndLoad(
channelURL: self.provider.channelURL
)
}
}
.configure { viewController in
viewController.dismissAction = {
dismiss()
}
// Used in SubViewBuilder
configurations.forEach { config in
config(viewController)
}
// Apply viewUpdateHandlers recursively
viewConverter.applyViewUpdates(to: viewController)
}
.switchUIKitNavigationBar()
.onDisappear {
if GlobalOptions.enableViewAdaptorAutoReset {
SBViewConverterSet.GroupModerations = GroupModerationsViewConverter()
}
}
}
// MARK: - Methods
private func createViewController() -> SBUModerationsViewController {
let viewController = SBUViewControllerSet.GroupModerationsViewController.init(
channelURL: self.provider.channelURL,
channelType: .group
)
// hook up VC, VM into provider
self.provider.bind(viewController: viewController)
return viewController
}
private func shouldUpdateData(viewController: SBUModerationsViewController) -> Bool {
let shouldUpdateChannelURL = viewController.viewModel?.channelURL == "" && self.provider.channelURL != ""
return shouldUpdateChannelURL
}
}
// MARK: - Initializers
/// GroupModerationsView initializers
public extension GroupModerationsView {
// MARK: - typealias
// typealias ListContent = GroupModerationsViewConverter.List
init(
provider: GroupModerationsViewProvider,
headerItem: (() -> GroupModerationsType.HeaderItem)? = nil
) {
self.provider = provider
if let headerItem { _ = headerItem() }
// if let listItem { _ = listItem() }
// Apply view converter in viewConverterSet.
self.applyViewConverterSet()
}
// TODO: After entire content is implemented
// internal init<Content: View>(
// channelListQuery: GroupChannelListQuery? = nil,
// headerItem: (() -> Sendbird.View.GroupChannel.ChannelList.HeaderItem)? = nil,
// list: @escaping (ListContent.ViewConfig) -> Content
// ) {
// self.init(channelListQuery: channelListQuery, headerItem: headerItem, listItem: nil)
//
// typealias ViewConverterType = ViewConverter<ListContent.ViewConfig>
// let listViewConverter: ViewConverterType = ViewConverter { listConfig in
// UIHostingController(rootView: list(listConfig)).view
// }
//
// self.viewConverter.list.entireContent = listViewConverter
// self.viewConverter.list.viewUpdateHandlers[.entireContent] = { vc in
// vc.listComponent?.reloadTableView()
// }
//
// // Apply view converter in viewConverterSet.
// self.applyViewConverterSet()
// }
}
#Preview {
NavigationView {
GroupModerationsView(provider: .init(channelURL: ""))
}
}