2021-08-01 20:21:28 -07:00
|
|
|
import { Connection, PublicKey } from "@solana/web3.js";
|
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
import { SOLANA_HOST } from "../utils/consts";
|
|
|
|
|
2021-08-02 12:23:37 -07:00
|
|
|
export interface Balance {
|
|
|
|
tokenAccount: PublicKey | undefined;
|
|
|
|
amount: string;
|
|
|
|
decimals: number;
|
|
|
|
uiAmount: number;
|
|
|
|
uiAmountString: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
function createBalance(
|
|
|
|
tokenAccount: PublicKey | undefined,
|
|
|
|
amount: string,
|
|
|
|
decimals: number,
|
|
|
|
uiAmount: number,
|
|
|
|
uiAmountString: string
|
|
|
|
) {
|
|
|
|
return {
|
|
|
|
tokenAccount,
|
|
|
|
amount,
|
|
|
|
decimals,
|
|
|
|
uiAmount,
|
|
|
|
uiAmountString,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2021-08-01 20:21:28 -07:00
|
|
|
function useSolanaBalance(
|
|
|
|
tokenAddress: string | undefined,
|
|
|
|
ownerAddress: PublicKey | null | undefined,
|
|
|
|
shouldCalculate?: boolean
|
|
|
|
) {
|
|
|
|
//TODO: should connection happen in a context?
|
2021-08-02 12:23:37 -07:00
|
|
|
const [balance, setBalance] = useState<Balance>(
|
|
|
|
createBalance(undefined, "", 0, 0, "")
|
|
|
|
);
|
2021-08-01 20:21:28 -07:00
|
|
|
useEffect(() => {
|
|
|
|
if (!tokenAddress || !ownerAddress || !shouldCalculate) {
|
2021-08-02 12:23:37 -07:00
|
|
|
setBalance(createBalance(undefined, "", 0, 0, ""));
|
2021-08-01 20:21:28 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
let cancelled = false;
|
2021-08-02 12:23:37 -07:00
|
|
|
const connection = new Connection(SOLANA_HOST, "finalized");
|
2021-08-01 20:21:28 -07:00
|
|
|
connection
|
|
|
|
.getParsedTokenAccountsByOwner(ownerAddress, {
|
|
|
|
mint: new PublicKey(tokenAddress),
|
|
|
|
})
|
|
|
|
.then(({ value }) => {
|
|
|
|
if (!cancelled) {
|
|
|
|
if (value.length) {
|
|
|
|
setBalance(
|
2021-08-02 12:23:37 -07:00
|
|
|
createBalance(
|
|
|
|
value[0].pubkey,
|
|
|
|
value[0].account.data.parsed?.info?.tokenAmount?.amount,
|
|
|
|
value[0].account.data.parsed?.info?.tokenAmount?.decimals,
|
|
|
|
value[0].account.data.parsed?.info?.tokenAmount?.uiAmount,
|
|
|
|
value[0].account.data.parsed?.info?.tokenAmount?.uiAmountString
|
|
|
|
)
|
2021-08-01 20:21:28 -07:00
|
|
|
);
|
|
|
|
} else {
|
2021-08-02 12:23:37 -07:00
|
|
|
setBalance(createBalance(undefined, "0", 0, 0, "0"));
|
2021-08-01 20:21:28 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(() => {
|
|
|
|
if (!cancelled) {
|
2021-08-02 12:23:37 -07:00
|
|
|
setBalance(createBalance(undefined, "", 0, 0, ""));
|
2021-08-01 20:21:28 -07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
return () => {
|
|
|
|
cancelled = true;
|
|
|
|
};
|
|
|
|
}, [tokenAddress, ownerAddress, shouldCalculate]);
|
|
|
|
return balance;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default useSolanaBalance;
|