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)
- Inconsistent display of selected option in select control HOT 4
- Custom Component typings HOT 2
- Error: Cannot submit element that is not <form>, <button>, or <input type="submit|image"> HOT 1
- Multiple Checkboxes HOT 3
- Define Input type through fieldTypes HOT 5
- Bring `errorMessagesForSchema` from `domain-functions` to this library HOT 1
- form with mode="onChange" button flashes when it hydrates HOT 2
- Could not resolve "@deepkit/type" HOT 3
- Overriding fields HOT 2
- <Field hidden /> is not passing `type="hidden"` to its input
- Validation error not shown when field is an array
- Can't trigger onSubmit from Form-component HOT 6
- Handle `z.object` HOT 1
- Can remix-forms function within a PWA / client side only context? HOT 4
- Zod schema array of objects HOT 1
- Remix forms site example no longer maintained? HOT 1
- [BUG] Field error(s) not showing if using additional component HOT 1
- Input ID's not always unique when multiple forms are rendered
- Example of how to do crud correctly?
- How to add a reset button on the side of the submit button? HOT 1
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.