Skip to content

Commit aa50e12

Browse files
committed
add builder for MessageView.Model based on resultBuilder
1 parent c9e9325 commit aa50e12

File tree

3 files changed

+227
-74
lines changed

3 files changed

+227
-74
lines changed

Components/Sources/Common/Views/LabelView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ extension LabelView: ConfigurableItem {
2525

2626
public struct Model: AlignmentProvider {
2727

28+
// MARK: - Editor
29+
2830
public struct Property: Editor {
2931
public typealias Model = LabelView.Model
3032

@@ -34,7 +36,7 @@ extension LabelView: ConfigurableItem {
3436
self.closure = closure
3537
}
3638

37-
public func edit(_ model: LabelView.Model) -> LabelView.Model {
39+
public func edit(_ model: Model) -> Model {
3840
return closure(model)
3941
}
4042

@@ -87,6 +89,8 @@ extension LabelView: ConfigurableItem {
8789
private(set) public var alignment: Alignment = .all(.zero)
8890
private(set) public var textAlignment: NSTextAlignment = .left
8991

92+
// MARK: - Mutation
93+
9094
mutating func set(text: TextValue) {
9195
self.text = text
9296
}
@@ -107,6 +111,8 @@ extension LabelView: ConfigurableItem {
107111
self.textAlignment = textAlignment
108112
}
109113

114+
// MARK: - Builder
115+
110116
public static func build(@EditorBuilder<Property> content: () -> [Property]) -> Self {
111117
return content().reduce(.init(), { model, editor in
112118
editor.edit(model)

Components/Sources/Common/Views/MessageView.swift

Lines changed: 157 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,157 @@ extension MessageView: ConfigurableItem {
2525

2626
public struct Model: Equatable, AlignmentProvider {
2727

28+
// MARK: - Editor
29+
30+
public struct Property: Editor {
31+
public typealias Model = MessageView.Model
32+
33+
private let closure: (Model) -> Model
34+
35+
public init(closure: @escaping (Model) -> Model) {
36+
self.closure = closure
37+
}
38+
39+
public func edit(_ model: Model) -> Model {
40+
return closure(model)
41+
}
42+
43+
public static func text(_ value: TextValue) -> Property {
44+
.init(closure: { model in
45+
var model = model
46+
model.set(text: value)
47+
return model
48+
})
49+
}
50+
51+
public static func style(_ value: TextStyle) -> Property {
52+
.init(closure: { model in
53+
var model = model
54+
model.set(style: value)
55+
return model
56+
})
57+
}
58+
59+
public static func layout(_ value: TextLayout) -> Property {
60+
.init(closure: { model in
61+
var model = model
62+
model.set(layout: value)
63+
return model
64+
})
65+
}
66+
67+
public static func alignment(_ value: Alignment) -> Property {
68+
.init(closure: { model in
69+
var model = model
70+
model.set(alignment: value)
71+
return model
72+
})
73+
}
74+
75+
public static func textAlignment(_ value: NSTextAlignment) -> Property {
76+
.init(closure: { model in
77+
var model = model
78+
model.set(textAlignment: value)
79+
return model
80+
})
81+
}
82+
83+
public static func insets(_ value: UIEdgeInsets) -> Property {
84+
.init(closure: { model in
85+
var model = model
86+
model.set(insets: value)
87+
return model
88+
})
89+
}
90+
91+
public static func background(_ value: BackgroundStyle) -> Property {
92+
.init(closure: { model in
93+
var model = model
94+
model.set(background: value)
95+
return model
96+
})
97+
}
98+
99+
public static func border(_ value: BorderStyle) -> Property {
100+
.init(closure: { model in
101+
var model = model
102+
model.set(border: value)
103+
return model
104+
})
105+
}
106+
}
107+
28108
// MARK: - Public properties
29109

30-
public let text: TextValue = .string("")
31-
public let textStyle: TextStyle = .init()
32-
public let textLayout: TextLayout = .init()
33-
public let backgroundStyle: BackgroundStyle = .solid(.clear)
34-
public var alignment: Alignment
35-
public let internalEdgeInsets: UIEdgeInsets = .zero
36-
public let borderStyle: BorderStyle
110+
private(set) public var text: TextValue = .string("")
111+
private(set) public var textStyle: TextStyle = .init()
112+
private(set) public var textLayout: TextLayout = .init()
113+
private(set) public var textAlignment: NSTextAlignment = .left
114+
private(set) public var backgroundStyle: BackgroundStyle = .solid(.clear)
115+
private(set) public var alignment: Alignment = .all(.zero)
116+
private(set) public var internalEdgeInsets: UIEdgeInsets = .zero
117+
private(set) public var borderStyle: BorderStyle? = nil
118+
119+
// MARK: - Mutation
120+
121+
mutating func set(text: TextValue) {
122+
self.text = text
123+
}
124+
125+
mutating func set(style: TextStyle) {
126+
self.textStyle = style
127+
}
128+
129+
mutating func set(layout: TextLayout) {
130+
self.textLayout = layout
131+
}
132+
133+
mutating func set(alignment: Alignment) {
134+
self.alignment = alignment
135+
}
136+
137+
mutating func set(textAlignment: NSTextAlignment) {
138+
self.textAlignment = textAlignment
139+
}
140+
141+
mutating func set(insets: UIEdgeInsets) {
142+
self.internalEdgeInsets = insets
143+
}
144+
145+
mutating func set(background: BackgroundStyle) {
146+
self.backgroundStyle = background
147+
}
148+
149+
mutating func set(border: BorderStyle) {
150+
self.borderStyle = border
151+
}
152+
153+
// MARK: - Builder
154+
155+
public static func build(@EditorBuilder<Property> content: () -> [Property]) -> Self {
156+
return content().reduce(.init(), { model, editor in
157+
editor.edit(model)
158+
})
159+
}
37160

38161
}
39162

40163
// MARK: - Methods
41164

42165
public func configure(with model: Model) {
43-
// self.backgroundColor = model.style.backgroundColor
44-
//
45-
// textView.backgroundColor = .clear
46-
// textView.isEditable = false
47-
// textView.isScrollEnabled = false
48-
// configureTextView(textView, with: model)
49-
// textView.textColor = model.style.textColor
50-
// textView.font = model.style.font
51-
// textView.textAlignment = model.textAlignment
166+
167+
textView.backgroundColor = .clear
168+
textView.isEditable = false
169+
textView.isScrollEnabled = false
170+
configureTextView(textView, with: model)
171+
textView.textColor = model.textStyle.color
172+
textView.font = model.textStyle.font
173+
textView.textAlignment = model.textAlignment
52174

53175
wrap(subview: textView, with: model.internalEdgeInsets)
54176

55-
layer.cornerRadius = model.borderStyle.cornerRadius
56-
layer.borderColor = model.borderStyle.borderColor
57-
layer.borderWidth = model.borderStyle.borderWidth
58-
layer.maskedCorners = model.borderStyle.maskedCorners
177+
applyBackground(style: model.backgroundStyle)
178+
applyBorder(style: model.borderStyle)
59179

60180
layoutIfNeeded()
61181
}
@@ -75,5 +195,22 @@ private extension MessageView {
75195
}
76196
}
77197

198+
func applyBackground(style: BackgroundStyle) {
199+
switch style {
200+
case .solid(let color):
201+
backgroundColor = color
202+
}
203+
}
204+
205+
func applyBorder(style: BorderStyle?) {
206+
guard let borderStyle = style else {
207+
return
208+
}
209+
layer.cornerRadius = borderStyle.cornerRadius
210+
layer.borderColor = borderStyle.borderColor
211+
layer.borderWidth = borderStyle.borderWidth
212+
layer.maskedCorners = borderStyle.maskedCorners
213+
}
214+
78215
}
79216
#endif

Example/ReactiveDataDisplayManager/Table/ComponentsOverviewTableViewController/ComponentsOverviewTableViewController.swift

Lines changed: 63 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -79,44 +79,54 @@ final class ComponentsOverviewTableViewController: UIViewController {
7979
private lazy var dateGenerator = LabelView.rddm.tableGenerator(with: dateModel, and: .class)
8080

8181
// Sent message
82-
// private let sentMessageStyle = MessageStyle(textColor: .white,
83-
// font: .systemFont(ofSize: 16, weight: .regular),
84-
// backgroundColor: .systemBlue)
85-
// private let sentMessageBorderStyle = MessageBorderStyle(cornerRadius: 9,
86-
// maskedCorners: [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner])
87-
// private lazy var sentMessageModel: MessageModel = .init(text: .string("Lorem"),
88-
// style: sentMessageStyle,
89-
// textAlignment: .right,
90-
// viewAlignment: .trailing(UIEdgeInsets(top: 12,
91-
// left: UIScreen.main.bounds.width / 2,
92-
// bottom: 12,
93-
// right: 16)
94-
// ),
95-
// internalEdgeInsets: UIEdgeInsets(top: 3, left: 5, bottom: 3, right: 5),
96-
// borderStyle: sentMessageBorderStyle)
97-
//
98-
// private lazy var sentMessageGenerator = MessageView.rddm.tableGenerator(with: sentMessageModel, and: .class)
82+
private let sentMessageStyle = TextStyle(color: .white,
83+
font: .systemFont(ofSize: 16, weight: .regular))
84+
private let sentMessageBorderStyle = BorderStyle(cornerRadius: 9,
85+
maskedCorners: [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner])
86+
private lazy var sentMessageModel: MessageView.Model = .build {
87+
MessageView.Model.Property.background(.solid(.systemBlue))
88+
MessageView.Model.Property.border(sentMessageBorderStyle)
89+
MessageView.Model.Property.style(sentMessageStyle)
90+
MessageView.Model.Property.textAlignment(.right)
91+
MessageView.Model.Property.alignment(.trailing(UIEdgeInsets(top: 12,
92+
left: UIScreen.main.bounds.width / 2,
93+
bottom: 12,
94+
right: 16)
95+
))
96+
MessageView.Model.Property.insets(UIEdgeInsets(top: 3,
97+
left: 5,
98+
bottom: 3,
99+
right: 5))
100+
MessageView.Model.Property.text(.string("Lorem"))
101+
}
102+
103+
private lazy var sentMessageGenerator = MessageView.rddm.tableGenerator(with: sentMessageModel, and: .class)
99104

100105
// Recieved message
101-
// private let recievedMessageStyle = MessageStyle(textColor: .black, font: .systemFont(ofSize: 16, weight: .regular))
102-
// private let recievedMessageBorderStyle = MessageBorderStyle(cornerRadius: 9,
103-
// maskedCorners: [
104-
// .layerMinXMinYCorner,
105-
// .layerMaxXMaxYCorner,
106-
// .layerMaxXMinYCorner
107-
// ],
108-
// borderWidth: 1,
109-
// borderColor: UIColor.black.cgColor)
110-
// private lazy var recievedMessageModel = MessageModel(text: .string("Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet"),
111-
// style: recievedMessageStyle,
112-
// textAlignment: .left,
113-
// viewAlignment: .leading(UIEdgeInsets(top: 12,
114-
// left: 16,
115-
// bottom: 12,
116-
// right: UIScreen.main.bounds.width / 2)),
117-
// internalEdgeInsets: UIEdgeInsets(top: 3, left: 5, bottom: 3, right: 5),
118-
// borderStyle: recievedMessageBorderStyle)
119-
// private lazy var recievedMessageGenerator = MessageView.rddm.tableGenerator(with: recievedMessageModel, and: .class)
106+
private let recievedMessageStyle = TextStyle(color: .black, font: .systemFont(ofSize: 16, weight: .regular))
107+
private let recievedMessageBorderStyle = BorderStyle(cornerRadius: 9,
108+
maskedCorners: [
109+
.layerMinXMinYCorner,
110+
.layerMaxXMaxYCorner,
111+
.layerMaxXMinYCorner
112+
],
113+
borderWidth: 1,
114+
borderColor: UIColor.black.cgColor)
115+
private lazy var recievedMessageModel: MessageView.Model = .build {
116+
MessageView.Model.Property.border(recievedMessageBorderStyle)
117+
MessageView.Model.Property.style(recievedMessageStyle)
118+
MessageView.Model.Property.alignment(.leading(UIEdgeInsets(top: 12,
119+
left: 16,
120+
bottom: 12,
121+
right: UIScreen.main.bounds.width / 2)))
122+
MessageView.Model.Property.insets(UIEdgeInsets(top: 3,
123+
left: 5,
124+
bottom: 3,
125+
right: 5))
126+
MessageView.Model.Property.text(.string("Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet"))
127+
}
128+
129+
private lazy var recievedMessageGenerator = MessageView.rddm.tableGenerator(with: recievedMessageModel, and: .class)
120130

121131
// Separator
122132

@@ -143,31 +153,31 @@ private extension ComponentsOverviewTableViewController {
143153

144154
adapter += TableGenerators {
145155
dateGenerator
146-
// generateSentMessages()
156+
generateSentMessages()
147157
sentMessageTimeGenerator
148158
separatorGenerator
149-
// generateRecievedMessages()
159+
generateRecievedMessages()
150160
recievedMessageTimeGenerator
151161
}
152162

153163
// Tell adapter that we've changed generators
154164
adapter => .reload
155165
}
156166

157-
// func generateSentMessages() -> [TableCellGenerator] {
158-
// var generators = [TableCellGenerator]()
159-
// for _ in 0..<20 {
160-
// generators.append(sentMessageGenerator)
161-
// }
162-
// return generators
163-
// }
164-
//
165-
// func generateRecievedMessages() -> [TableCellGenerator] {
166-
// var generators = [TableCellGenerator]()
167-
// for _ in 0..<30 {
168-
// generators.append(recievedMessageGenerator)
169-
// }
170-
// return generators
171-
// }
167+
func generateSentMessages() -> [TableCellGenerator] {
168+
var generators = [TableCellGenerator]()
169+
for _ in 0..<20 {
170+
generators.append(sentMessageGenerator)
171+
}
172+
return generators
173+
}
174+
175+
func generateRecievedMessages() -> [TableCellGenerator] {
176+
var generators = [TableCellGenerator]()
177+
for _ in 0..<30 {
178+
generators.append(recievedMessageGenerator)
179+
}
180+
return generators
181+
}
172182

173183
}

0 commit comments

Comments
 (0)