Skip to content

Instantly share code, notes, and snippets.

@KhayalSuleymani
Last active October 24, 2024 16:14
Show Gist options
  • Save KhayalSuleymani/271d5313723327a50f8ea6af77f47a1e to your computer and use it in GitHub Desktop.
Save KhayalSuleymani/271d5313723327a50f8ea6af77f47a1e to your computer and use it in GitHub Desktop.
EVENT DRIVEN MVVM
import Common
// HOME MODEL
class HomeViewItem: ViewItem<HomeResponse> {
// #MARK: Configurate Bar Button items...
override var bars: Bars {
[
.left(items: [
.style(.image(.add, weakify(self) {
$0.move(by: .test($0.data))
}))
]),
.title(text: "\(data.name)"),
.right(items: [
.style(.image(.checkmark, weakify(self, {
$0.move(by: .test(id: $0.data.id))
}))),
.style(.image(.remove, weakify(self, {
$0.move(by: .test(id: $0.data.id))
}))),
]),
]
}
// #MARK: Configurate Table or Collection Sections ...
override var sections: Sections {
let s1 = Section(items: [
ImageLabelItem(v1: .add,
v2: data.name)
.onSelect { element in
}.isHidden { element in
element.isHidden
},
LoadingItem(active: data.cards.isEmpty)
.isHidden { element in
return element.isHidden
},
GridItem(items: data.cards.map { card in
card
.map()
.onSelect { element in
self.move(by: .card(card))
}.isHidden { element in
element.isHidden
}
}),
])
let s2 = Section (items: [
LoadingItem(active: data.templates.isEmpty)
.isHidden { element in
return element.isHidden
},
GridItem(items: data.templates.map { template in
template
.map()
.onSelect { element in
self.move(by: .template(template))
}.isHidden { element in
element.isHidden
}
}),
])
return [ s1, s2 ]
}
// #MARK: Configurate bottom action items...
override var buttons: Buttons {
[
.style(.fillPrimary("Enter as \(data.name)", {
print("selection event here...")
})),
.style(.fillSecondary("Register", {
print("selection event here...")
}))
]
}
}
import Common
// HOME VIEW
class HomeCollectionView: CollectionViewType<HomeViewItem> {
override func render(state: ViewState<HomeViewItem>) -> Self {
switch state {
case let .loaded(model):
super.render(state: state)
print("/*****")
print(model.data.name)
print("*****/")
case _:
super.render(state: state)
}
return self
}
}
import Common
// HOME VIEW MODEL
class HomeViewModel: ViewModel<HomeViewItem> {
@discardableResult
override func requestUser(_ completion: @escaping Completion<HomeResponse> = { _ in }) -> Self {
onViewDidLoad { v in
super.requestUser(weakify(self) {
$0.render(state: $1)
})
}.onViewDidAppear { v in
/// customize view here, or do what you wanna do...
v.view.backgroundColor = .red // ->>>> example
}.onViewWillAppear { v in
/// customize view here, or do what you wanna do...
}.onViewDidLayoutSubviews { v in
/// customize view here, or do what you wanna do...
}
}
}
import Common
// MVVM USAGE...
extension HomeView {
static var view: HomeView {
let m = HomeViewItem() // ---> m
let v = HomeView() // ---> v
let _ = HomeViewModel(m) // ---> vm
.subscribe(v: v)
.requestUser()
return v
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment