@@ -101,25 +101,12 @@ import ScreenStateKit
101101import Observation
102102
103103@Observable @MainActor
104- final class FeatureViewState : ScreenState {
104+ final class FeatureViewState : LoadmoreScreenState , StateUpdatable {
105105 // UI Configuration
106106 let headerHeight: CGFloat = 120.0
107107
108108 // Data State
109- private (set ) var items: [Item] = []
110- private (set ) var shouldShowLoadMore: Bool = false
111-
112- /// Safe property update helper
113- func tryUpdate <T >(
114- property : @autoclosure @MainActor () -> KeyPath<FeatureViewState, T>,
115- newValue : T
116- ) {
117- guard let keypath = property () as? ReferenceWritableKeyPath< FeatureViewState, T> else {
118- assertionFailure (" Read-only property" )
119- return
120- }
121- self [keyPath : keypath] = newValue
122- }
109+ var items: [Item] = []
123110}
124111```
125112
@@ -193,13 +180,17 @@ actor FeatureViewStore: ScreenActionStore {
193180 // MARK: - Action Implementations
194181 private func fetchItems () async throws {
195182 let result = try await dataService.fetchItems (page : 1 , limit : 20 )
196- await viewState? .tryUpdate (property : \.items , newValue : result.items )
183+ await viewState? .updateState { state in
184+ state.items = result.items
185+ }
197186 }
198187
199188 private func loadMoreItems () async throws {
189+ let currentItems = await viewState? .items ?? []
200190 let result = try await dataService.fetchItems (page : 2 , limit : 20 )
201- let allItems = (await viewState? .items ?? []) + result.items
202- await viewState? .tryUpdate (property : \.items , newValue : allItems)
191+ await viewState? .updateState { state in
192+ state.items = currentItems + result.items
193+ }
203194 }
204195}
205196```
@@ -257,7 +248,7 @@ struct FeatureView: View {
257248 }
258249
259250 // Load more indicator
260- if viewState.shouldShowLoadMore {
251+ if ! viewState.items. isEmpty && viewState.canShowLoadmore {
261252 ProgressView ()
262253 .frame (maxWidth : .infinity )
263254 .onAppear {
0 commit comments