Skip to content

Commit a63273f

Browse files
Refactor
1 parent 1271b88 commit a63273f

4 files changed

Lines changed: 60 additions & 64 deletions

File tree

Sources/LoadableView/Protocols/LoadableView/BaseLoadableView.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,49 @@ public protocol BaseLoadableView: View {
3636
// MARK: Optional
3737
func onAppear()
3838
func onDisappear()
39+
40+
// Note:
41+
// Has default implementation. Must call respective initialLoad method
42+
// on view model in custom implementation
43+
func initialLoadAction() async
3944
}
4045

4146
public extension BaseLoadableView {
4247
func onAppear() { }
4348

4449
func onDisappear() { }
4550
}
51+
52+
internal extension BaseLoadableView {
53+
@ViewBuilder
54+
func _buildBody() -> some View {
55+
ZStack {
56+
switch vm.viewState {
57+
case .notLoaded:
58+
notLoaded()
59+
case .loaded(let element):
60+
loaded(element)
61+
}
62+
InternalLoadingView(vm.overlayState) {
63+
loading()
64+
}
65+
InternalErrorView(vm.overlayState) {
66+
errorView($0)
67+
}
68+
}.task {
69+
await initialLoadAction()
70+
}
71+
.onAppear {
72+
vm.onAppear()
73+
onAppear()
74+
}
75+
.onDisappear {
76+
vm.onDisappear()
77+
onDisappear()
78+
79+
}
80+
.refreshable {
81+
vm.refresh()
82+
}
83+
}
84+
}

Sources/LoadableView/Protocols/LoadableView/BaseLoadableViewModel.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ public protocol BaseLoadableViewModel: ObservableObject, AnyObject {
3434
}
3535

3636
public extension BaseLoadableViewModel {
37-
3837
func onAppear() {
3938
if let foregroundEnteringAware = self as? (any ForegroundEnteringAware) {
4039
ForegroundingDetector.shared.observe(foregroundEnteringAware)

Sources/LoadableView/Protocols/LoadableView/IDedLoadableView.swift

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -20,43 +20,21 @@ public protocol IDedLoadableView: BaseLoadableView
2020
}
2121

2222
public extension IDedLoadableView {
23+
func initialLoadAction() async {
24+
do {
25+
try await vm.initialLoad(id: id)
26+
} catch {
27+
assertionFailure("\(error)")
28+
}
29+
}
30+
}
2331

32+
public extension IDedLoadableView {
2433
@ViewBuilder
2534
var body: some View {
26-
ZStack {
27-
switch vm.viewState {
28-
case .notLoaded:
29-
notLoaded()
30-
case .loaded(let element):
31-
loaded(element)
32-
}
33-
InternalLoadingView(vm.overlayState) {
34-
loading()
35-
}
36-
InternalErrorView(vm.overlayState) {
37-
errorView($0)
38-
}
39-
}.task {
40-
do {
41-
try await vm.initialLoad(id: id)
42-
} catch {
43-
assertionFailure("\(error)")
35+
_buildBody()
36+
.onChange(of: id) { oldValue, newValue in
37+
vm.idHasChanged(newValue, showLoading: true)
4438
}
45-
}
46-
.onAppear {
47-
vm.onAppear()
48-
onAppear()
49-
}
50-
.onDisappear {
51-
vm.onDisappear()
52-
onDisappear()
53-
54-
}
55-
.refreshable {
56-
vm.refresh()
57-
}
58-
.onChange(of: id) { oldValue, newValue in
59-
vm.idHasChanged(newValue, showLoading: true)
60-
}
6139
}
6240
}

Sources/LoadableView/Protocols/LoadableView/LoadableView.swift

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,19 @@ public protocol LoadableView: BaseLoadableView
1212
}
1313

1414
public extension LoadableView {
15+
func initialLoadAction() async {
16+
await vm.initialLoad()
17+
}
18+
}
19+
20+
public extension LoadableView {
21+
1522
func cancel() async {
1623
// Implement to cancel loading
1724
}
18-
25+
1926
@ViewBuilder
2027
var body: some View {
21-
ZStack {
22-
switch vm.viewState {
23-
case .notLoaded:
24-
notLoaded()
25-
case .loaded(let element):
26-
loaded(element)
27-
}
28-
InternalLoadingView(vm.overlayState) {
29-
loading()
30-
}
31-
InternalErrorView(vm.overlayState) {
32-
errorView($0)
33-
}
34-
}.task {
35-
await vm.initialLoad()
36-
}
37-
.onAppear {
38-
vm.onAppear()
39-
onAppear()
40-
}
41-
.onDisappear {
42-
vm.onDisappear()
43-
onDisappear()
44-
45-
}
46-
.refreshable {
47-
vm.refresh()
48-
}
28+
_buildBody()
4929
}
5030
}

0 commit comments

Comments
 (0)