Issue #592

Use picker with Radio style

Hard to customize

Picker(selection: Binding<Bool>.constant(true), label: EmptyView()) {
    Text("Production").tag(0)
    Text("Sandbox").tag(1)
}.pickerStyle(RadioGroupPickerStyle())

Use custom view

Use contentShape to make whole button tappable. Make custom Binding for our enum

struct EnvironmentView: View {
    @Binding var input: Input

    var body: some View {
        VStack(alignment: .leading) {
                RadioButton(text: "Production", isOn: binding(for: .production))
                RadioButton(text: "Sandbox", isOn: binding(for: .sandbox))
         }
    }

    private func binding(for environment: Input.Environment) -> Binding<Bool> {
        Binding<Bool>(
            get: { self.input.environment == environment },
            set: { flag in
                if flag {
                    self.input.environment = environment
                }
            }
        )
    }
}

struct RadioButton: View {
    let text: String
    @Binding var isOn: Bool

    var body: some View {
        Button(action: {
            self.isOn.toggle()
        }) {
            HStack(alignment: .top) {
                Circle()
                    .fill(isOn ? R.color.primary : Color.clear)
                    .overlay(Circle().stroke(R.color.primary))
                    .frame(width: 18, height: 18)
                Text(text)
                    .foregroundColor(R.color.text)
            }
            .contentShape(Rectangle())
        }
        .buttonStyle(RadioButtonStyle())
    }
}

struct RadioButtonStyle: ButtonStyle {
    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .padding(.vertical, 4)
            .padding(.horizontal, 8)
            .border(SeparatorShapeStyle(), width: 0)
            .background(Color.clear)
    }
}