core icon indicating copy to clipboard operation
core copied to clipboard

Broken Validation when using React Elements for Messages

Open dairyisscary opened this issue 2 years ago • 14 comments

Version Number

7.43.2

Codesandbox/Expo snack

n/a

Steps to reproduce

hello react-hook-form folks!

28cafa864b4a92b2d2f6ac8f5c5cb27722e38b3f removed the option to use react elements as validation messages. as a result internationalization libraries that use elements for translation of validation messages no longer work.

For example, with react-intl/formatjs:

<input type="text" {...form.register("name", { required: <FormattedMessage defaultMessage="this is required" /> })} />

most internationalization libraries (including formatjs) can produce strings but the element api is often more convenient, can use constant values, and doesn't require boilerplate to get things out of context

Expected behaviour

hopefully we can bring this back.

What browsers are you seeing the problem on?

No response

Relevant log output

No response

Code of Conduct

  • [X] I agree to follow this project's Code of Conduct

dairyisscary avatar Mar 15 '23 12:03 dairyisscary

We actually only support string from the very beginning of V7, but the code was left there for awhile. Now that react hook form core is going to be framework agnostic, any react-specific code will need to be removed. Consider returning the string and using translation API if you can. eg

{ required: translate(test') }

// or 

{ required: 'test' }
translate(errors.test.message)

bluebill1049 avatar Mar 15 '23 21:03 bluebill1049

hey bill! thanks for getting back to me.

can i convince you otherwise with any of these arguments?

  • how would I include html in a message? what if Iwanted this is <em>required</em>? strings cannot support this, can they?
  • I understand the idea of being framework agnostic but what if a framework doesn't use strings at all. I'm not sure this is the case today but solid js for example uses real DOM nodes, not vdom, so perhaps they might be using DOM textNodes, not strings. What if you just made isMessage part of the framework adapter instead of the core, since what a message can and cannot be is framework specific.

dairyisscary avatar Mar 16 '23 09:03 dairyisscary

I understand this is not going to work the best for you, and certainly answering your questions will only probably bubble up more. I am trying my best to answer here with a clear mind after a whole day of work. Yes, we can consider option two, but to be mindful, this is by design to only support string so users don't have to type assert. The typescript never supports React.ReactNode in the type definition and is included in the doc. It wouldn't be my priority to fix it out probably after the library core is published and officially used by hook form.

bluebill1049 avatar Mar 16 '23 10:03 bluebill1049

of course, bill! i hope i'm not being overwhelming haha (i know open source can be burnout-city).

i'll close the issue and migrate all my messages to strings :)

dairyisscary avatar Mar 16 '23 14:03 dairyisscary

@dairyisscary let me work on this later, I am moving to the core. Once the core is ready, I will try to get this working. There are a few challenges because I can't just check its function or want to bring react as a dependency, but will try to find a workaround if you have any suggestions or solutions let me know as well.

bluebill1049 avatar Mar 16 '23 21:03 bluebill1049

Hey @bluebill1049 any news on this? This is a blocker for us when updating to the latest react-hook-form version.

We currently sometimes use async validations to load data from the server, for example to test for duplicates. When there is a duplicate we add a link to the other entity right inside the error message. This was super easy to do when returing JSX, but will be quite difficult via a simple string.

Any suggestions to solve this with react-hook-form version 7?

lennerd avatar Apr 24 '23 09:04 lennerd

@bluebill1049 any news on this? Thanks in advance!

lennerd avatar Jun 28 '23 07:06 lennerd

@bluebill1049 we would like to update react-hook-form but are currently blocked by this bug. Any future plans or suggestions?

It's also fine for us if you think that this feature will not be reimplemented into react-hook-form. In this case we will need to look for refactorings in our code base to reenable this future with newer versions.

lennerd avatar Jul 11 '23 14:07 lennerd

@bluebill1049 any news? Like I said, a simple: "will not reimplement feature" is fine for us to be able to plan our next steps.

lennerd avatar Oct 31 '23 14:10 lennerd

We have multiple scenarios where we embed an anchor styled CTA button in the error message. Not sure why "react"-hook-form should be agnostic of react.

rh-meowsa avatar May 07 '24 19:05 rh-meowsa

A bit late to the party, but shouldn't this change either be breaking and thus belong in a major release, or shouldn't there be some kind of warning that support for JSX will be removed? I am upgrading from 7.43.0 and the "feature" is removed in 7.43.2, which is weird.

Maybe I missed the warning as we started using RHF from 7.8.8, but still it is weird for features to be removed in a patch release.

What is the alternative nowadays? How do people provide HTML in the error-text?

ivdma avatar Aug 27 '24 14:08 ivdma

We weren't able to finde a way to provide HTML and thus weren't able to update either. Still waiting for a response from @bluebill1049

lennerd avatar Aug 27 '24 14:08 lennerd

New year, new try: @bluebill1049 any suggestions on how to work around this change?

lennerd avatar Jan 08 '25 08:01 lennerd