Yes, you can just use ReScript’s normal binding syntax for the hook. I’m not familiar with that library, but here’s one possible approach.
I was following the API docs on the page for useStarknetCall.
module Contract = {
type t
@val external make: unit => t = "makeContract" // TODO: Implement
}
module StarknetCall = {
module Result = {
type t
// TODO: `data` is an array of `any` so treating it as JSON for now
@get external data: t => Js.Nullable.t<array<Js.Json.t>> = "data"
@get external loading: t => bool = "loading"
@get external error: t => Js.Nullable.t<string> = "loading"
@send external refresh: t => unit = "refresh"
}
module Parameters = {
type t
// TODO: No idea what `args` should be so just using a JS object
@obj
external make: (~contract: Contract.t=?, ~method: string=?, ~args: {..}=?, unit) => t = ""
}
@module("@starknet-react/core") @val
external useStartnetCall: Parameters.t => Result.t = "useStartnetCall"
}
// Example usage
let params = StarknetCall.Parameters.make(
~contract=Contract.make(),
~method="method",
~args={"arg1": 0, "arg2": ""},
(),
)
let result = StarknetCall.useStartnetCall(params)
if StarknetCall.Result.loading(result) {
Js.log("Loading")
} else {
let error = StarknetCall.Result.error(result)->Js.Nullable.toOption
switch error {
| Some(errorMessage) => Js.log(errorMessage)
| None => {
let data = StarknetCall.Result.data(result)->Js.Nullable.toOption
switch data {
| None => Js.log("No data")
| Some(data) => Js.log(data)
}
}
}
}