realm / realm-js

Realm is a mobile database: an alternative to SQLite & key-value stores
https://realm.io
Apache License 2.0
5.76k stars 572 forks source link

Improve useQuery arguments so react-hooks/exhaustive-deps recognise missing deps #6259

Open bimusiek opened 10 months ago

bimusiek commented 10 months ago

Problem

Currently there is no way to know if you forgot deps besides testing. We would love to use react-hooks/exhaustive-deps to recognise the missing deps in the useQuery function.

Solution

If we move the type argument as the last one, so example usage of useQuery:

  const results = useQuery<ImporterAuthenticationModel>(
    (objects) =>
      objects.filtered(query, ...args).sorted([
        ['importerId', false],
        ['title', false],
      ]),
    [query, args],
    ImporterAuthenticationModel.schema.name
  );

Then react-hooks/exhaustive-deps correctly recognises missing deps (as it expects deps to be on second position and callback to be on the first one like in useEffect).

Alternatives

No alternatives really. For our code base we copy-pasted useQuery source code and modified it to suit our needs, but I think it would be really beneficial to all developers using @realm/react.

Maybe alternative is to fork react-hooks/exhaustive-deps and make it work for realm-hooks :)

How important is this improvement for you?

Fairly niche but nice to have anyway

Feature would mainly be used with

Atlas Device Sync

kneth commented 10 months ago

@bimusiek Thank you for the suggestion. As you can guess, we didn't design @realm/react with react-hooks/exhaustive-deps fresh in our memory :smile:

Maybe alternative is to fork ...

Maintaining additional code isn't such a good idea, and we should avoid it.

As @realm/react is still early in development, I suppose the proposed change is acceptable.

takameyer commented 10 months ago

Ah, good catch. This would unfortunately be a breaking change, so we'll have to consider how we approach this.

kneth commented 10 months ago

unfortunately be a breaking change

Imho, the major version is 0, so we can allow to introduce breaking changes