Comments (2)
Hey, @vedantroy! Thanks for creating this issue
The short answer is yes to both questions. Here's the long answer:
Async validation
-
I created an example of the quick and dirty way of doing it with async
refine
on the schema. The downside is that it runs your async validation for every field. I don't recommend this unless it's a very simple form or a prototype you want to validate quickly. -
You can also do that by creating a 100% custom input and taking control of its
onChange
andonBlur
events. The downside is that you'll have to render the custom errors yourself, similarly to the example you sent. You can access the regular validation errors through theerrors
prop inField
's children render function. You can also access theErrors
component from there. Then, you can render the regular errors + your async validation errors insideErrors
. -
The most robust way to achieve that, I think, would be to create a custom resolver for your form and pass it to Remix Forms. But I don't know if many people would want that, so I haven't implemented a way of passing a custom resolver yet. Would this be something you'd use?
File inputs
We don't have any special API for dealing with file uploads, but I believe we don't need any. Since file inputs don't offer much in terms of validation, you can omit them from your schema, render them directly on the form, and follow Remix's way of dealing with uploads, like this:
const schema = z.object({
firstName: z.string().nonempty(),
email: z.string().nonempty().email(),
})
const mutation = makeDomainFunction(schema)(async (values) => values)
export const action: ActionFunction = async ({ request }) => {
// Create your custom upload handler
const uploadHandler = unstable_createFileUploadHandler({
maxFileSize: 5_000_000,
file: ({ filename }) => filename,
})
// Don't forget to clone the request: formAction will need to use the original later on
const clonedRequest = request.clone()
// Get the multipart form data with the upload
const formData = await unstable_parseMultipartFormData(
clonedRequest,
uploadHandler,
)
const file = formData.get('attachment')
// Do something with the file
console.log({ file })
return formAction({
request,
schema,
mutation,
successPath: '/success',
})
}
export default function Component() {
return (
<Form schema={schema} encType="multipart/form-data">
{({ Field, Errors, Button }) => (
<>
<Field name="firstName" />
<Field name="email" />
<input type="file" name="attachment" />
<Errors />
<Button />
</>
)}
</Form>
)
}
PS: we don't like dealing with multipart form data, so we usually do our uploads asynchronously and only send the metadata on the forms. When we do that, we can add the metadadata to the schema and use it inside our domain function :)
from remix-forms.
Hey, @vedantroy! We just added an example of async validation with custom inputs. Check it out: https://remix-forms.seasoned.cc/examples/forms/async-validation
In the end, it was much easier than I expected :D you could add a pending state to yours, of course, but since the validation will also happen on the server, I didn't think it was necessary.
Also, there is no need for throttling or debouncing, since Remix will cancel the extra requests for us
I'm closing this issue, but feel free to reopen it if you need anything else.
Thank you so much for creating this issue!
from remix-forms.
Related Issues (20)
- Did you have an example of multiple checkbox validator HOT 2
- Reset field value when other field value has changed HOT 2
- Access session cookie in mutation HOT 4
- Suport Remix's `v2_normalizeFormMethod` HOT 4
- put, patch, delete methods don't work HOT 1
- Better type inference for formAction result HOT 2
- Typings for the underlying Fields, Errors etc HOT 3
- Add `replace` prop to `Form` HOT 1
- Add a way to avoid magically passing props to inputs HOT 3
- How to disable inputs during the form submission? HOT 1
- Bug: TS types for `props.name` is wrong HOT 3
- Bug: Wrong accessibility tags applied to wrapping components when using `renderField` HOT 4
- How to handle custom Combobox input? HOT 4
- Element Types JSX.IntrinsicElements vs React.[Element]HTMLAttributes* HOT 1
- Global error duplicate with multiple forms HOT 2
- Form re-renders more than it should
- field param of useFieldArray not being updated in real-time and out of date when passed to modal HOT 3
- pendingButtonLabel should default to the value of buttonLabel HOT 1
- 1.6.3: Uncaught (in promise) Error: Cannot submit element that is not <form>, <button>, or <input type="submit|image"> HOT 1
- Attach errors to Fields that are dynamically generated? HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from remix-forms.