Skip to content
Snippets Groups Projects
NewGroupView.swift 1.63 KiB
Newer Older
Dariusz Rybicki's avatar
Dariusz Rybicki committed
import AppCore
import ComposableArchitecture
import SwiftUI
import XXModels

public struct NewGroupView: View {
  public typealias Component = NewGroupComponent
  typealias ViewStore = ComposableArchitecture.ViewStore<ViewState, Component.Action>
Dariusz Rybicki's avatar
Dariusz Rybicki committed

  public init(store: StoreOf<Component>) {
    self.store = store
  }

  let store: StoreOf<Component>

  struct ViewState: Equatable {
    init(state: Component.State) {
      contacts = state.contacts
      members = state.members
    }

    var contacts: IdentifiedArrayOf<XXModels.Contact>
    var members: IdentifiedArrayOf<XXModels.Contact>
Dariusz Rybicki's avatar
Dariusz Rybicki committed
  }

  public var body: some View {
    WithViewStore(store, observe: ViewState.init) { viewStore in
      Form {
        Section {
          membersView(viewStore)
        }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
      }
      .navigationTitle("New Group")
      .task { viewStore.send(.start) }
    }
  }

  func membersView(_ viewStore: ViewStore) -> some View {
    NavigationLink("Members (\(viewStore.members.count))") {
      Form {
        ForEach(viewStore.contacts) { contact in
          Button {
            viewStore.send(.didSelectContact(contact))
          } label: {
            HStack {
              Text(contact.username ?? "")
              Spacer()
              if viewStore.members.contains(contact) {
                Image(systemName: "checkmark")
              }
            }
          }
        }
      }
    }
  }
Dariusz Rybicki's avatar
Dariusz Rybicki committed
}

#if DEBUG
public struct NewGroupView_Previews: PreviewProvider {
  public static var previews: some View {
    NavigationView {
      NewGroupView(store: Store(
        initialState: NewGroupComponent.State(),
        reducer: EmptyReducer()
      ))
    }
  }
}
#endif