Skip to content

Commit 56275b5

Browse files
LoadableViewObservable
1 parent 3413e0b commit 56275b5

3 files changed

Lines changed: 67 additions & 9 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Created by Axel Ancona Esselmann on 10/31/24.
2+
//
3+
4+
import Foundation
5+
import Combine
6+
7+
public extension BaseLoadableViewModel {
8+
9+
func refresh() {
10+
self.refresh(showLoading: false)
11+
}
12+
13+
func refresh(with item: Element) {
14+
update(with: item)
15+
refresh()
16+
}
17+
18+
func refresh(on changePublisher: AnyPublisher<Void, Never>, showLoading: Bool) -> AnyCancellable {
19+
changePublisher.sink { [weak self] in
20+
self?.refresh(showLoading: showLoading)
21+
}
22+
}
23+
24+
func refresh(on changePublisher: AnyPublisher<Void, Never>) -> AnyCancellable {
25+
refresh(on: changePublisher, showLoading: false)
26+
}
27+
28+
func refresh(on changePublishers: [AnyPublisher<Void, Never>], showLoading: Bool = false) -> AnyCancellable {
29+
refresh(on: Publishers.MergeMany(changePublishers).eraseToAnyPublisher(), showLoading: showLoading)
30+
}
31+
32+
func refresh(on changePublisher: AnyPublisher<Void, Never>..., showLoading: Bool = false) -> AnyCancellable {
33+
refresh(on: changePublisher, showLoading: showLoading)
34+
}
35+
36+
func observe<Observable>(
37+
_ change: Set<Observable.Change>,
38+
on observable: Observable,
39+
showLoading: Bool = false
40+
) -> AnyCancellable
41+
where Observable: LoadableViewObservable
42+
{
43+
refresh(on: observable.publisher(for: change), showLoading: showLoading)
44+
}
45+
46+
func observe<Observable>(
47+
_ change: Observable.Change...,
48+
on observable: Observable,
49+
showLoading: Bool = false
50+
) -> AnyCancellable
51+
where Observable: LoadableViewObservable
52+
{
53+
observe(Set(change), on: observable, showLoading: showLoading)
54+
}
55+
}

Sources/LoadableView/Protocols/LoadableView/BaseLoadableViewModel.swift

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public protocol BaseLoadableViewModel: ObservableObject, AnyObject {
2121

2222
// MARK: - Don't implement
2323
func refresh(showLoading: Bool)
24+
func refresh(on changePublisher: AnyPublisher<Void, Never>, showLoading: Bool) -> AnyCancellable
2425

2526
// MARK: - Optional implementation
2627
func cancel() async
@@ -86,15 +87,6 @@ public extension BaseLoadableViewModel {
8687
}
8788
}
8889

89-
func refresh() {
90-
self.refresh(showLoading: false)
91-
}
92-
93-
func refresh(with item: Element) {
94-
update(with: item)
95-
refresh()
96-
}
97-
9890
@MainActor
9991
func setLoaded(_ newValue: Element) {
10092
viewState = .loaded(newValue)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Created by Axel Ancona Esselmann on 10/31/24.
2+
//
3+
4+
import Foundation
5+
import Combine
6+
7+
public protocol LoadableViewObservable {
8+
associatedtype Change
9+
where Change: Hashable
10+
nonisolated func publisher(for observableChange: Set<Change>) -> AnyPublisher<(), Never>
11+
}

0 commit comments

Comments
 (0)