Last active
October 24, 2024 16:14
-
-
Save KhayalSuleymani/271d5313723327a50f8ea6af77f47a1e to your computer and use it in GitHub Desktop.
EVENT DRIVEN MVVM
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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...") | |
})) | |
] | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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... | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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