| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- import Contacts
- import ContactsUI
- import SwiftUI
- import Swinject
- extension ContactImage {
- struct RootView: BaseView {
- let resolver: Resolver
- @State var state = StateModel()
- @State private var isAddSheetPresented: Bool = false
- @Environment(\.colorScheme) var colorScheme
- @Environment(AppState.self) var appState
- var body: some View {
- Form {
- contactItemsList
- }
- .onAppear(perform: configureView)
- .navigationTitle("Contacts Configuration")
- .navigationBarTitleDisplayMode(.large)
- .scrollContentBackground(.hidden)
- .background(appState.trioBackgroundColor(for: colorScheme))
- .toolbar {
- ToolbarItem(placement: .topBarTrailing) {
- Button(action: {
- isAddSheetPresented.toggle()
- }) {
- HStack {
- Text("Add Contact")
- Image(systemName: "plus")
- }
- }
- }
- }
- .sheet(isPresented: $isAddSheetPresented) {
- AddContactImageSheet(state: state)
- }
- }
- private var contactItemsList: some View {
- List {
- if state.contactImageEntries.isEmpty {
- Section(
- header: Text(""),
- content: {
- Text("No Contact Trick Entries.")
- }
- ).listRowBackground(Color.chart)
- } else {
- ForEach(state.contactImageEntries, id: \.id) { entry in
- NavigationLink(destination: ContactImageDetailView(entry: entry, state: state)) {
- HStack {
- ZStack {
- Circle()
- .fill(.black)
- .foregroundColor(.white)
- .frame(width: 40, height: 40)
- Image(uiImage: ContactPicture.getImage(contact: entry, state: state.state))
- .resizable()
- .frame(width: 40, height: 40)
- .clipShape(Circle())
- Circle()
- .stroke(lineWidth: 2)
- .foregroundColor(colorScheme == .dark ? .white : .black)
- .frame(width: 40, height: 40)
- }
- Text("\(entry.name)")
- }
- }
- }
- .onDelete(perform: onDelete)
- }
- Section {} header: {
- Text(
- "Add one or more contacts to your iOS Contacts to display real-time Trio metrics on your watch face. Be sure to grant Trio full access to your Contacts when prompted."
- )
- .textCase(nil)
- .foregroundStyle(.secondary)
- }
- }.listRowBackground(Color.chart)
- }
- private func onDelete(offsets: IndexSet) {
- Task {
- for offset in offsets {
- let entry = state.contactImageEntries[offset]
- await state.deleteContact(entry: entry)
- }
- }
- }
- }
- }
|