IceCubesApp/Packages/Account/Sources/Account/AccountsLIst/AccountsListView.swift

80 lines
2.2 KiB
Swift
Raw Normal View History

2023-01-17 10:36:01 +00:00
import DesignSystem
2022-12-23 17:47:19 +00:00
import Env
2023-01-17 10:36:01 +00:00
import Models
import Network
2022-12-23 17:47:19 +00:00
import Shimmer
2023-01-17 10:36:01 +00:00
import SwiftUI
2022-12-23 17:47:19 +00:00
public struct AccountsListView: View {
2022-12-29 09:39:34 +00:00
@EnvironmentObject private var theme: Theme
2022-12-23 17:47:19 +00:00
@EnvironmentObject private var client: Client
@StateObject private var viewModel: AccountsListViewModel
@State private var didAppear: Bool = false
2023-01-17 10:36:01 +00:00
2022-12-24 12:41:25 +00:00
public init(mode: AccountsListMode) {
_viewModel = StateObject(wrappedValue: .init(mode: mode))
2022-12-23 17:47:19 +00:00
}
2023-01-17 10:36:01 +00:00
2022-12-23 17:47:19 +00:00
public var body: some View {
List {
switch viewModel.state {
case .loading:
2023-01-17 10:36:01 +00:00
ForEach(Account.placeholders()) { _ in
2022-12-23 17:47:19 +00:00
AccountsListRow(viewModel: .init(account: .placeholder(), relationShip: .placeholder()))
.redacted(reason: .placeholder)
.shimmering()
2022-12-29 09:39:34 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
}
case let .display(accounts, relationships, nextPageState):
ForEach(accounts) { account in
if let relationship = relationships.first(where: { $0.id == account.id }) {
AccountsListRow(viewModel: .init(account: account,
relationShip: relationship))
2023-01-17 10:36:01 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
}
}
2023-01-17 10:36:01 +00:00
2022-12-23 17:47:19 +00:00
switch nextPageState {
case .hasNextPage:
loadingRow
2022-12-29 09:39:34 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
.onAppear {
Task {
await viewModel.fetchNextPage()
}
}
2023-01-17 10:36:01 +00:00
2022-12-23 17:47:19 +00:00
case .loadingNextPage:
loadingRow
2022-12-29 09:39:34 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
case .none:
EmptyView()
}
2023-01-17 10:36:01 +00:00
2022-12-23 17:47:19 +00:00
case let .error(error):
Text(error.localizedDescription)
2022-12-29 09:39:34 +00:00
.listRowBackground(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
}
}
2022-12-29 09:39:34 +00:00
.scrollContentBackground(.hidden)
.background(theme.primaryBackgroundColor)
2022-12-23 17:47:19 +00:00
.listStyle(.plain)
2022-12-24 12:41:25 +00:00
.navigationTitle(viewModel.mode.title)
2022-12-23 17:47:19 +00:00
.navigationBarTitleDisplayMode(.inline)
.task {
viewModel.client = client
2023-01-17 10:36:01 +00:00
guard !didAppear else { return }
2022-12-23 17:47:19 +00:00
didAppear = true
await viewModel.fetch()
}
}
2023-01-17 10:36:01 +00:00
2022-12-23 17:47:19 +00:00
private var loadingRow: some View {
HStack {
Spacer()
ProgressView()
Spacer()
}
}
}