Skip to content

Commit 88d0d7c

Browse files
committed
chore: attempt 8
1 parent 3c369df commit 88d0d7c

File tree

7 files changed

+34
-101
lines changed

7 files changed

+34
-101
lines changed

examples/react/next-server-actions/src/app/action.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {
44
ServerValidateError,
55
createServerValidate,
66
} from '@tanstack/react-form-nextjs'
7-
import { formOpts } from './shared-code'
87
import { z } from 'zod'
8+
import { formOpts } from './shared-code'
99

1010
const schema = z.object({
1111
age: z.coerce.number().min(12),

examples/react/next-server-actions/src/app/client-component.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
'use client'
22

3-
import { useActionState } from 'react'
3+
import { useActionState, useCallback } from 'react'
44
import {
55
initialFormState,
66
mergeForm,
77
useForm,
8-
useMerge,
8+
useTransform,
99
} from '@tanstack/react-form-nextjs'
1010
import { z } from 'zod'
1111
import someAction from './action'
@@ -14,14 +14,14 @@ import { formOpts } from './shared-code'
1414
export const ClientComp = () => {
1515
const [state, action] = useActionState(someAction, initialFormState)
1616

17+
// debugger
18+
1719
const form = useForm({
1820
...formOpts,
19-
})
20-
21-
useMerge({
22-
form,
23-
fn: (baseForm) => mergeForm(baseForm, state ?? {}),
24-
deps: [state],
21+
transform: useCallback(
22+
(baseForm: unknown) => mergeForm(baseForm as never, state ?? {}),
23+
[state],
24+
),
2525
})
2626

2727
return (

packages/form-core/src/transform.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,6 @@ export function mergeAndUpdate<
151151
form.setErrorMap(newObj.state.errorMap)
152152
}
153153
})
154+
155+
return newObj;
154156
}

packages/react-form-nextjs/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ export * from '@tanstack/react-form'
22

33
export * from './createServerValidate'
44
export * from './error'
5-
export * from './useMerge'
5+
export * from './useTransform'

packages/react-form-nextjs/src/useMerge.ts

Lines changed: 0 additions & 88 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { useCallback } from 'react'
2+
import type { AnyFormApi } from '@tanstack/react-form'
3+
4+
export const useTransform: (
5+
fn: (formBase: AnyFormApi) => AnyFormApi,
6+
deps?: unknown[],
7+
) => unknown = useCallback as never

packages/react-form/src/useForm.tsx

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client'
22

3-
import { FormApi, functionalUpdate } from '@tanstack/form-core'
3+
import { FormApi, functionalUpdate, mergeAndUpdate } from '@tanstack/form-core'
44
import { useStore } from '@tanstack/react-store'
55
import { useMemo, useState } from 'react'
66
import { Field } from './useField'
@@ -183,7 +183,10 @@ export function useForm<
183183
TOnDynamicAsync,
184184
TOnServer,
185185
TSubmitMeta
186-
>,
186+
> & {
187+
// Made stable by `useTransform`
188+
transform?: (data: unknown) => unknown
189+
},
187190
) {
188191
const fallbackFormId = useFormId()
189192
const [prevFormId, setPrevFormId] = useState<string>(opts?.formId as never)
@@ -211,6 +214,8 @@ export function useForm<
211214
setPrevFormId(formId)
212215
}
213216

217+
const transform = useMemo(() => opts?.transform, [opts?.transform])
218+
214219
const extendedFormApi = useMemo(() => {
215220
const extendedApi: ReactFormExtendedApi<
216221
TFormData,
@@ -239,6 +244,13 @@ export function useForm<
239244
},
240245
} as never
241246

247+
if (transform) {
248+
// Cannot call synchronously, as otherwise we're setting state mid-render, which breaks React
249+
setTimeout(() => {
250+
mergeAndUpdate(extendedApi, transform as never)
251+
}, 0)
252+
}
253+
242254
extendedApi.Field = function APIField(props) {
243255
return <Field {...props} form={formApi} />
244256
}
@@ -254,7 +266,7 @@ export function useForm<
254266
}
255267

256268
return extendedApi
257-
}, [formApi])
269+
}, [formApi, transform])
258270

259271
useIsomorphicLayoutEffect(formApi.mount, [])
260272

0 commit comments

Comments
 (0)