Skip to content

Commit b88df0c

Browse files
committed
Resolve fields when set values
1 parent f438257 commit b88df0c

File tree

2 files changed

+19
-8
lines changed

2 files changed

+19
-8
lines changed

Sources/FormHook/Form.swift

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -279,15 +279,26 @@ public class FormControl<FieldName> where FieldName: Hashable {
279279
if options.contains(.shouldDirty) || !areEqual(first: value, second: instantFormState.defaultValues[name]) {
280280
instantFormState.dirtyFields.insert(name)
281281
}
282-
if options.contains(.shouldValidate), let field = fields[name] {
283-
let (result, messages) = await field.computeMessages()
284-
instantFormState.errors.setMessages(name: name, messages: messages, isValid: result)
285-
if !result {
282+
guard options.contains(.shouldValidate) else {
283+
return await syncFormState()
284+
}
285+
if let resolver = self.options.resolver {
286+
let result = await resolver(instantFormState.formValues, self.options.context, [name])
287+
switch result {
288+
case .success:
289+
break
290+
case .failure(let e):
291+
instantFormState.errors = instantFormState.errors.rewrite(from: e)
292+
instantFormState.isValid = false
293+
}
294+
} else if let field = fields[name] {
295+
let (isValid, messages) = await field.computeMessages()
296+
instantFormState.errors.setMessages(name: name, messages: messages, isValid: isValid)
297+
if !isValid {
286298
instantFormState.isValid = false
287299
}
288-
return await syncFormState()
289300
}
290-
await syncFormState()
301+
return await syncFormState()
291302
}
292303

293304
public func getFieldState(name: FieldName) -> FieldState {

Sources/FormHook/Hook/UseController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public func useController<FieldName, Value>(
1616
unregisterOption: UnregisterOption = []
1717
) -> ControllerRenderOption<FieldName, Value> where FieldName: Hashable {
1818
let form = useContext(Context<FormControl<FieldName>>.self)
19-
let registrationRef = useRef(form.register(name: name, options: RegisterOption(rules: rules, defaultValue: defaultValue, shouldUnregister: shouldUnregister)))
19+
let registration = form.register(name: name, options: RegisterOption(rules: rules, defaultValue: defaultValue, shouldUnregister: shouldUnregister))
2020

2121
let preservedChangedArray = [
2222
AnyEquatable(name),
@@ -33,7 +33,7 @@ public func useController<FieldName, Value>(
3333

3434
let field = FieldOption(
3535
name: name,
36-
value: registrationRef.current
36+
value: registration
3737
)
3838
let fieldState = form.getFieldState(name: name)
3939
return (field: field, fieldState: fieldState, formState: form.instantFormState)

0 commit comments

Comments
 (0)