Skip to content

Commit 663f748

Browse files
committed
Lazily update formState
1 parent 5467a22 commit 663f748

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

Sources/FormHook/Hook/UseController.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,15 @@ 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 registration = form.register(name: name, options: RegisterOption(rules: rules, defaultValue: defaultValue, shouldUnregister: shouldUnregister))
19+
let registrationRef = useRef(form.register(name: name, options: RegisterOption(rules: rules, defaultValue: defaultValue, shouldUnregister: shouldUnregister)))
2020

21-
useEffect {{
21+
let preservedChangedArray = [
22+
AnyEquatable(name),
23+
AnyEquatable(shouldUnregister),
24+
AnyEquatable(unregisterOption),
25+
AnyEquatable(form)
26+
]
27+
useEffect(.preserved(by: preservedChangedArray)) {{
2228
guard shouldUnregister else { return }
2329
Task {
2430
await form.unregister(name: name, options: unregisterOption)
@@ -27,7 +33,7 @@ public func useController<FieldName, Value>(
2733

2834
let field = FieldOption(
2935
name: name,
30-
value: registration
36+
value: registrationRef.current
3137
)
3238
let fieldState = form.getFieldState(name: name)
3339
return (field: field, fieldState: fieldState, formState: form.instantFormState)

Sources/FormHook/Util/AnyEquatable.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,19 @@ func areEqual(first: Any?, second: Any?) -> Bool {
5353
}
5454
return true
5555
}
56+
57+
struct AnyEquatable: Equatable {
58+
static func == (lhs: AnyEquatable, rhs: AnyEquatable) -> Bool {
59+
areEqual(first: lhs.base, second: rhs.base)
60+
}
61+
62+
let base: Any?
63+
64+
init(_ base: Any?) {
65+
if let obj = base as? AnyEquatable {
66+
self = obj
67+
} else {
68+
self.base = base
69+
}
70+
}
71+
}

Tests/FormHookTests/FormHookTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ final class FormHookTests: QuickSpec {
253253
it("validity of \"a\" remains") {
254254
let fieldState = await formControl.getFieldState(name: .a)
255255
expect(fieldState.isInvalid) == true
256-
expect(fieldState.error.isEmpty) == true
256+
expect(fieldState.error).to(beEmpty())
257257
}
258258
}
259259
}
@@ -268,7 +268,7 @@ final class FormHookTests: QuickSpec {
268268
it("key \"a\" remains errors") {
269269
let fieldState = await formControl.getFieldState(name: .a)
270270
expect(fieldState.isInvalid) == false
271-
expect(fieldState.error.isEmpty) == true
271+
expect(fieldState.error).to(beEmpty())
272272
}
273273
}
274274

@@ -447,7 +447,7 @@ final class FormHookTests: QuickSpec {
447447
it("key \"a\" remains errors") {
448448
let fieldState = await formControl.getFieldState(name: .a)
449449
expect(fieldState.isInvalid) == false
450-
expect(fieldState.error.isEmpty) == true
450+
expect(fieldState.error).to(beEmpty())
451451
}
452452
}
453453

@@ -697,7 +697,7 @@ final class FormHookTests: QuickSpec {
697697
it("key \"b\" remains errors") {
698698
let fieldState = await formControl.getFieldState(name: .b)
699699
expect(fieldState.isInvalid) == false
700-
expect(fieldState.error.isEmpty) == true
700+
expect(fieldState.error).to(beEmpty())
701701
}
702702
}
703703

@@ -846,7 +846,7 @@ final class FormHookTests: QuickSpec {
846846
it("errors of key \"a\" has gone") {
847847
let fieldState = await formControl.getFieldState(name: .a)
848848
expect(fieldState.isInvalid) == false
849-
expect(fieldState.error.isEmpty) == true
849+
expect(fieldState.error).to(beEmpty())
850850
}
851851

852852
it("key \"b\" remains errors") {

0 commit comments

Comments
 (0)