/
AccountView.swift
87 lines (79 loc) · 3.35 KB
/
AccountView.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//
// AccountView.swift
// MyDataHelpsKit-Example
//
// Created by CareEvolution on 3/28/23.
//
import SwiftUI
import MyDataHelpsKit
struct AccountView: View {
static let tabTitle = "Account"
@EnvironmentObject var session: SessionModel
@StateObject var model: AccountViewModel
var body: some View {
NavigationStack(path: $model.path) {
List {
Section("Participant:") {
AsyncCardView(result: model.participantInfo, failureTitle: "Failed to load participant info") {
ParticipantInfoView(model: .init(info: $0))
}
}
Section("Enrolled in:") {
AsyncCardView(result: model.projectModel, failureTitle: "Failed to load project info") {
ProjectInfoView(project: $0.info, dataCollectionSettings: $0.dataCollectionSettings)
}
}
if let ehrConnectionsEnabled = model.ehrConnectionsEnabled {
Section {
NavigationLink(value: ehrConnectionsEnabled ? AccountNavigationPath.externalAccounts : nil) {
Text("External Accounts")
}
} footer: {
if ehrConnectionsEnabled {
Text("View connected external accounts, and add provider connections.")
} else {
Text("EHR connection features are disabled for your project.")
}
}
}
}
.refreshable {
await model.refresh()
}
.onReceive(NotificationCenter.default.publisher(for: ParticipantSession.participantDidUpdateNotification)) { _ in
Task {
await model.refresh()
}
}
.onAppear { model.loadData() }
.navigationTitle(Self.tabTitle)
.toolbar {
ToolbarItemGroup(placement: .destructiveAction) {
Button("Log Out", role: .destructive, action: logOut)
}
}
.navigationDestination(for: AccountNavigationPath.self) { destination in
switch destination {
case .externalAccounts:
ExternalAccountsListView(model: ExternalAccountsListViewModel(session: model.session))
.navigationTitle("External Accounts")
case .providerSearch:
/// EXERCISE: Modify the query parameters to customize filtering providers.
ExternalAccountProviderPagedView(model: ExternalAccountProvidersQuery(limit: 25).pagedListViewModel(model.session))
.navigationTitle("Connect to a Provider")
.navigationBarTitleDisplayMode(.inline)
}
}
}
}
private func logOut() {
session.logOut()
}
}
struct AccountView_Previews: PreviewProvider {
static var previews: some View {
AccountView(model: AccountViewModel(participant: ParticipantModel(session: ParticipantSessionPreview(), info: PreviewData.participantInfo)))
.environmentObject(SessionModel())
.banner()
}
}