doloresqui
Version:
136 lines (116 loc) • 3.43 kB
text/typescript
import { useContext, useEffect, useState } from "react";
import {
Balances,
ChainId,
Server,
Socket,
Supported,
} from "@socket.tech/socket-v2-sdk";
import { useDispatch, useSelector } from "react-redux";
import useSWR from "swr";
import { time } from "../consts";
// redux actions
import { setNetworks } from "../state/networksSlice";
import { Web3Context } from "../providers/Web3Provider";
export let socket;
// Function that lets you set the api key and preferences.
export const initSocket = (apiKey: string, _singleTxOnly: boolean) => {
socket = new Socket({
apiKey: apiKey,
defaultQuotePreferences: {
singleTxOnly: _singleTxOnly,
},
});
};
// Function to get the chains supported by socket apis.
export const useChains = () => {
const dispatch = useDispatch();
const [allChains, setAllChains] = useState(null);
useEffect(() => {
async function fetchSupportedNetworks() {
const supportedNetworks = await Supported.getAllSupportedChains();
setAllChains(supportedNetworks);
dispatch(setNetworks(supportedNetworks?.result));
}
fetchSupportedNetworks();
}, []);
return allChains;
};
import { useRoutes } from "./apis/useRoutes";
import { useActiveRoute } from "./apis/useActiveRoute";
import { useNextTx } from "./apis/useNextTx";
import { usePendingRoutes } from "./apis/usePendingRoutes";
import { updateAndRefetch } from "./updateAndRefetch";
export {
useRoutes,
useActiveRoute,
useNextTx,
usePendingRoutes,
updateAndRefetch,
};
// Returns balance of the token address provided
export const useBalance = (
tokenAddress: string,
chainId: string,
userAddress: string
) => {
const isTxModalOpen = useSelector((state: any) => state.modals.isTxModalOpen);
const shouldFetch = tokenAddress && chainId && userAddress && !isTxModalOpen;
async function fetchBalance(
tokenAddress: string,
chainId: ChainId,
userAddress: string
) {
const tokenWithBalance = await Balances.getBalance({
tokenAddress,
chainId,
userAddress,
});
return tokenWithBalance;
}
const { data, error, isValidating, mutate } = useSWR(
shouldFetch ? [tokenAddress, chainId, userAddress, "token-balance"] : null,
fetchBalance,
);
return {
data: data?.result,
isBalanceLoading: userAddress && !error && !data,
mutate
};
};
// Returns all token balances for the user on all chains.
export const useAllTokenBalances = () => {
const web3Context = useContext(Web3Context);
const { userAddress } = web3Context.web3Provider;
async function fetchAllTokenBalances(_userAddress: string) {
const balances = await Balances.getBalances({
userAddress: _userAddress,
});
return balances;
}
const { data, error, isValidating } = useSWR(
userAddress ? [userAddress, "user-balance"] : null,
fetchAllTokenBalances,
{
refreshInterval: time.USER_BALANCES_REFRESH * 1000,
}
);
return {
data: data?.result,
isLoading: userAddress && ((!error && !data) || isValidating),
};
};
// for gas price
export const useGasPrice = (chainId) => {
async function checkGasPrice(_chainId: number) {
const gasPrice = await Server.getGasPrice({ chainId: _chainId });
return gasPrice;
}
const { data, error, isValidating } = useSWR(
chainId ? [chainId, "gas price"] : null,
checkGasPrice
);
return {
data: data?.result,
};
};