Browse Source

[react]: adds getTokenAccountBalance hook (#176)

* feat: wrap getTokenAccountBalance in a hook

* chore: changeset

* fix: imports and typos

---------

Co-authored-by: nickfrosty <75431177+nickfrosty@users.noreply.github.com>
Pratik 1 month ago
parent
commit
34a0ac9d74

+ 5 - 0
.changeset/wise-kangaroos-joke.md

@@ -0,0 +1,5 @@
+---
+"gill-react": minor
+---
+
+adds useTokenAccountBalance hook

+ 31 - 0
packages/react/src/__typeset__/token-account-balance.ts

@@ -0,0 +1,31 @@
+import { Address, GetTokenAccountBalanceApi } from "gill";
+import { useTokenAccountBalance } from "../hooks/token-account-balance.js";
+
+// [DESCRIBE] useTokenAccountBalance
+{
+  {
+    const { balance } = useTokenAccountBalance({ address: "123" as Address });
+    balance satisfies ReturnType<GetTokenAccountBalanceApi["getTokenAccountBalance"]>;
+  }
+
+  {
+    const { balance } = useTokenAccountBalance({
+      address: "123" as Address,
+      options: {
+        refetchInterval: 500,
+      },
+    });
+    balance satisfies ReturnType<GetTokenAccountBalanceApi["getTokenAccountBalance"]>;
+  }
+
+  {
+    const { balance } = useTokenAccountBalance({
+      address: "123" as Address,
+      config: {
+        commitment: "confirmed",
+      },
+      abortSignal: new AbortController().signal,
+    });
+    balance satisfies ReturnType<GetTokenAccountBalanceApi["getTokenAccountBalance"]>;
+  }
+}

+ 1 - 0
packages/react/src/hooks/index.ts

@@ -8,6 +8,7 @@ export * from "./signature-statuses.js";
 export * from "./signatures-for-address.js";
 export * from "./simulate-transaction.js";
 export * from "./slot.js";
+export * from "./token-account-balance.js";
 export * from "./token-account.js";
 export * from "./token-mint.js";
 export * from "./transaction.js";

+ 39 - 0
packages/react/src/hooks/token-account-balance.ts

@@ -0,0 +1,39 @@
+"use client";
+
+import { useQuery } from "@tanstack/react-query";
+import type { Address, GetTokenAccountBalanceApi, Simplify } from "gill";
+import { GILL_HOOK_CLIENT_KEY } from "../const.js";
+import { useSolanaClient } from "./client.js";
+import type { GillUseRpcHook } from "./types.js";
+
+type RpcConfig = Simplify<Parameters<GetTokenAccountBalanceApi["getTokenAccountBalance"]>>[1];
+
+type UseTokenAccountBalanceInput<TConfig extends RpcConfig = RpcConfig> = GillUseRpcHook<TConfig> & {
+  address: Address | string;
+};
+
+type UseTokenAccountBalanceResponse = ReturnType<GetTokenAccountBalanceApi["getTokenAccountBalance"]>;
+
+export function useTokenAccountBalance<TConfig extends RpcConfig = RpcConfig>({
+  options,
+  config,
+  abortSignal,
+  address,
+}: UseTokenAccountBalanceInput<TConfig>) {
+  const { rpc } = useSolanaClient();
+  const { data, ...rest } = useQuery({
+    networkMode: "offlineFirst",
+    ...options,
+    enabled: !!address,
+    queryKey: [GILL_HOOK_CLIENT_KEY, "getTokenAccountBalance", address],
+    queryFn: async () => {
+      const { value } = await rpc.getTokenAccountBalance(address as Address, config).send({ abortSignal });
+      return value;
+    },
+  });
+
+  return {
+    ...rest,
+    balance: data as UseTokenAccountBalanceResponse,
+  };
+}