Skip to content

Commit 37305a3

Browse files
Victor KostinVictor Kostin
authored andcommitted
Add isRequired logic
1 parent 0f1e57f commit 37305a3

3 files changed

Lines changed: 20 additions & 8 deletions

File tree

ExampleApp/ExampleApp/UI/ContentScreen/ContentView.swift

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,32 @@ struct ContentView: View {
2020
) { proxy in
2121
FormField(
2222
value: $viewModel.name,
23-
rules: viewModel.nameValidationRules
23+
rules: viewModel.nameValidationRules,
24+
isRequired: true
2425
) { failedRules in
2526
TextInputField(title: "Name", text: $viewModel.name, failedRules: failedRules)
2627
}
2728
.disabled(viewModel.isLoading)
2829
FormField(
2930
value: $viewModel.age,
30-
rules: viewModel.ageValidationRules
31+
rules: viewModel.ageValidationRules,
32+
isRequired: false
3133
) { failedRules in
3234
TextInputField(title: "Age", text: $viewModel.age, failedRules: failedRules)
3335
}
3436
.disabled(viewModel.isLoading)
3537
FormField(
3638
value: $viewModel.pass,
37-
rules: viewModel.passValidationRules
39+
rules: viewModel.passValidationRules,
40+
isRequired: true
3841
) { failedRules in
3942
SecureInputField(title: "Password", text: $viewModel.pass, failedRules: failedRules)
4043
}
4144
.disabled(viewModel.isLoading)
4245
FormField(
4346
value: $viewModel.confirmPass,
44-
rules: viewModel.confirmPassValidationRules
47+
rules: viewModel.confirmPassValidationRules,
48+
isRequired: true
4549
) { failedRules in
4650
SecureInputField(title: "Confirm Password", text: $viewModel.confirmPass, failedRules: failedRules)
4751
}

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ struct ContentView: View {
6767
) { proxy in
6868
FormField(
6969
value: $name,
70-
rules: [TextValidationRule.notEmpty(message: "Name field should no be empty")]
70+
rules: [TextValidationRule.notEmpty(message: "Name field should no be empty")],
71+
isRequired: true, // field parameter, necessary for correct determination of validity of all fields
7172
) { failedRules in
7273
MyField(title: "Name", text: $name, failedRules: failedRules)
7374
}

Sources/FormView/FormField.swift

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public struct FormField<Content: View>: View {
1212
@ViewBuilder private let content: ([ValidationRule]) -> Content
1313

1414
@State private var failedValidationRules: [ValidationRule] = []
15-
private var isValid: Bool { failedValidationRules.isEmpty && value.isEmpty == false }
15+
private var isValid: Bool { getValidationStatus() }
16+
private var isRequired: Bool
1617

1718
// Fields Focus
1819
@FocusState private var isFocused: Bool
@@ -27,9 +28,11 @@ public struct FormField<Content: View>: View {
2728
public init(
2829
value: Binding<String>,
2930
rules: [ValidationRule] = [],
31+
isRequired: Bool,
3032
@ViewBuilder content: @escaping ([ValidationRule]) -> Content
3133
) {
3234
self._value = value
35+
self.isRequired = isRequired
3336
self.content = content
3437
self.validator = FieldValidator(rules: rules)
3538
}
@@ -95,8 +98,8 @@ public struct FormField<Content: View>: View {
9598

9699
if
97100
validationBehaviour.contains(.onFieldFocus)
98-
&& failedValidationRules.isEmpty
99-
&& newValue == true
101+
&& failedValidationRules.isEmpty
102+
&& newValue == true
100103
{
101104
failedValidationRules = await validator.validate(
102105
value: value,
@@ -107,4 +110,8 @@ public struct FormField<Content: View>: View {
107110
}
108111
}
109112
}
113+
114+
private func getValidationStatus() -> Bool {
115+
isRequired ? failedValidationRules.isEmpty && value.isEmpty == false : failedValidationRules.isEmpty
116+
}
110117
}

0 commit comments

Comments
 (0)