Skip to content

Commit 2a54084

Browse files
committed
chore: re-fix issues with react ssr
1 parent 8dafa0c commit 2a54084

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

packages/form-core/src/FieldApi.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,6 +1380,35 @@ export class FieldApi<
13801380
value: this.state.value,
13811381
fieldApi: this,
13821382
})
1383+
1384+
// Only used so that `transform` works properly in the React adapter after first render
1385+
// This can be removed when `transform` is able to use the values directly from FormAPI instead of duplicate them
1386+
// @see https://github.com/TanStack/form-v2-private-discussions/blob/001-duplicated-error-map-keys/RFCs/001-duplicated-error-map-keys.md
1387+
const unsubFormListener = this.form.baseStore.subscribe(() => {
1388+
const perFieldStore = this.form._getOrCreatePerFieldStore(
1389+
this.name as string,
1390+
this.options.defaultMeta as any,
1391+
)
1392+
1393+
if (this.getValue() !== perFieldStore.get().value) {
1394+
perFieldStore.setState((prev) => ({
1395+
...prev,
1396+
value: this.getValue(),
1397+
}))
1398+
}
1399+
if (
1400+
this.form._getFieldMetaBase(this.name) !== perFieldStore.get().metaBase
1401+
) {
1402+
perFieldStore.setState((prev) => ({
1403+
...prev,
1404+
meta: this.getMeta(),
1405+
}))
1406+
}
1407+
})
1408+
1409+
return () => {
1410+
unsubFormListener.unsubscribe()
1411+
}
13831412
}
13841413

13851414
/**

packages/form-core/tests/FieldApi.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1596,7 +1596,8 @@ describe('field api', () => {
15961596
name: 'name',
15971597
})
15981598

1599-
field.mount()
1599+
const unmount = field.mount()
1600+
unmount()
16001601
expect(form.getFieldInfo(field.name).instance).toBeDefined()
16011602
expect(form.getFieldInfo(field.name)).toBeDefined()
16021603
})

packages/form-core/tests/fieldMeta.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,14 @@ describe('fieldMeta accessing', () => {
141141
name: 'name',
142142
})
143143

144-
field.mount()
144+
const cleanup = field.mount()
145145

146146
field.setValue('test')
147147
expect(form.state.fieldMeta.name?.isTouched).toBe(true)
148148
expect(form.state.fieldMeta.name?.isDirty).toBe(true)
149149

150+
cleanup()
151+
150152
const metaAfterCleanup = form.state.fieldMeta.name
151153

152154
expect(metaAfterCleanup).toBeDefined()

0 commit comments

Comments
 (0)