Code Monkey home page Code Monkey logo

Comments (2)

cdaringe avatar cdaringe commented on July 26, 2024

I was able to do this mapping within my own domain.

external unsafeToJsExn: exn => Js.Exn.t = "%identity"

type jsexn_or_err<'t> =
  | JsError(Js.Exn.t)
  | Err('t)

type rec queryResultR<'queryError, 'queryData> = {
  status: ReactQuery_Types.queryStatus,
  // ..snip
  error: option<jsexn_or_err<'queryError>>,
}

// useQuery wrapper for doing all Promise modeling with Result types
let useQueryR = (~queryFn) => {
  let (err, setErr) = React.useState(_ => None)
  let queryFnWithResultHandling = React.useCallback1(opts => {
    queryFn(opts)
    ->Promise.tapError(e => setErr(_ => Some(Err(e))))
    ->Promise.Js.fromResult
    ->Promise.Js.toBsPromise
      |> Js.Promise.catch(exn => {
        let err = exn->%raw("(x => x instanceof Error ? x : new Error(String(x)))")
        setErr(_ => Some(JsError(err)))
        Js.Promise.reject(err)
      })
  }, [queryFn])
  let res = ReactQuery_Query.useQuery(
    ReactQuery_Query.queryOptions(~queryFn=queryFnWithResultHandling, ()),
  )
  {
    status: res.status,
    // ...snip
    error: err,
  }
}

// Demo!

type foo_err = Zed
let foo = () => {
  if true {
    Ok(1)
  } else {
    Error(Zed)
  }
}

let v = useQueryR(~queryFn=_ => Promise.resolved(foo()))

switch v.error {
| Some(JsError(e')) => () // e' ~ Js.Exn.t
| Some(Err(e')) => () // e' ~ foo_err
| _ => ()
}->ignore
// v.data //  option<int>

from react-query.

vmarcosp avatar vmarcosp commented on July 26, 2024

@cdaringe Sorry for the delay. I was about to suggest you to do something like that. This package is focused on (almost) zero-cost bindings but I understand that the usage of react-query with ReScript could be better if we use built-in structures like variants.
However, I prefer to support zero-cost bindings and provide you a way to create your own custom wrappers instead to make this package a very opinionated bindings that doesn't provide the possibility to create a wrappers or custom hooks based on react-query.

from react-query.

Related Issues (6)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.