Remember previously opened budget to reopen upon launch

This commit is contained in:
William Brawner 2021-10-09 21:23:49 -06:00
parent 980e0baa1f
commit 7b99811cd9
4 changed files with 24 additions and 61 deletions

View file

@ -39,24 +39,19 @@ struct BudgetListsView: View {
}
struct BudgetListItemView: View {
@EnvironmentObject var budgetsDataStore: BudgetsDataStore
var budget: Budget
var body: some View {
NavigationLink(
destination: TabbedBudgetView(budget)
budget.name,
tag: budget,
selection: $budgetsDataStore.budget,
destination: {
TabbedBudgetView(budget)
.navigationBarTitle(budget.name)
) {
VStack(alignment: .leading) {
Text(verbatim: budget.name)
.lineLimit(1)
if budget.description?.isEmpty == false {
Text(verbatim: budget.description!)
.font(.subheadline)
.foregroundColor(.secondary)
.lineLimit(1)
}
}
}
)
}
init (_ budget: Budget) {

View file

@ -11,14 +11,10 @@ import Combine
class BudgetsDataStore: ObservableObject {
private var currentRequest: AnyCancellable? = nil
var budgets: Result<[Budget], NetworkError> = .failure(.loading) {
@Published var budgets: Result<[Budget], NetworkError> = .failure(.loading)
@Published var budget: Budget? = nil {
didSet {
self.objectWillChange.send()
}
}
var budget: Result<Budget, NetworkError> = .failure(.loading) {
didSet {
self.objectWillChange.send()
UserDefaults.standard.set(budget?.id, forKey: LAST_BUDGET)
}
}
@ -47,34 +43,20 @@ class BudgetsDataStore: ObservableObject {
return
}
}, receiveValue: { (budgets) in
self.budgets = .success(budgets)
})
}
func getBudget(_ id: String) {
self.budget = .failure(.loading)
self.currentRequest = self.budgetRepository.getBudget(id)
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { (status) in
switch status {
case .finished:
self.currentRequest = nil
return
case .failure(let error):
self.budget = .failure(error)
return
self.budgets = .success(budgets.sorted(by: { $0.name < $1.name }))
if let id = UserDefaults.standard.string(forKey: LAST_BUDGET) {
if let budget = budgets.first(where: { $0.id == id }) {
self.budget = budget
}
}
}, receiveValue: { (budget) in
self.budget = .success(budget)
})
}
init(_ budgetRepository: BudgetRepository) {
self.budgetRepository = budgetRepository
}
private let budgetRepository: BudgetRepository
// Needed since the default implementation is currently broken
let objectWillChange = ObservableObjectPublisher()
}
private let LAST_BUDGET = "LAST_BUDGET"

View file

@ -9,6 +9,7 @@
import SwiftUI
struct TabbedBudgetView: View {
@EnvironmentObject var budgetDataStore: BudgetsDataStore
@EnvironmentObject var categoryDataStore: CategoryDataStore
let budget: Budget
@State var isAddingTransaction = false
@ -18,7 +19,7 @@ struct TabbedBudgetView: View {
TabView {
BudgetDetailsView(budget: self.budget)
.tabItem {
Image(systemName: "briefcase.circle.fill")
Image(systemName: "chart.line.uptrend.xyaxis.circle.fill")
Text("Overview")
}
.tag(0)

View file

@ -38,7 +38,7 @@ struct TransactionDetailsView: View {
Spacer().frame(height: 20.0)
LabeledField(label: "notes", value: transaction.description, showDivider: true)
CategoryLineItem(transaction.categoryId)
BudgetLineItem(transaction.budgetId)
BudgetLineItem()
UserLineItem(transaction.createdBy)
}.padding()
}
@ -116,25 +116,10 @@ struct CategoryLineItem: View {
}
struct BudgetLineItem: View {
var body: some View {
stateContent.onAppear {
budgetDataStore.getBudget(budgetId)
}
}
var stateContent: AnyView {
switch budgetDataStore.budget {
case .success(let budget):
return AnyView(LabeledField(label: "budget", value: budget.name, showDivider: true))
default:
return AnyView(LabeledField(label: "budget", value: "", showDivider: true))
}
}
@EnvironmentObject var budgetDataStore: BudgetsDataStore
let budgetId: String
init(_ budgetId: String) {
self.budgetId = budgetId
var body: some View {
LabeledField(label: "budget", value: budgetDataStore.budget?.name ?? "", showDivider: true)
}
}