RequestAirdrop.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { useCallback, useEffect, useState } from "react"
  2. import { Button, Text } from "@chakra-ui/react"
  3. import { LAMPORTS_PER_SOL } from "@solana/web3.js"
  4. import { useConnection, useWallet } from "@solana/wallet-adapter-react"
  5. const RequestAirdrop = () => {
  6. const { publicKey } = useWallet()
  7. const { connection } = useConnection()
  8. const [balance, setBalance] = useState<number>(0)
  9. const [isLoading, setIsLoading] = useState(false)
  10. const getBalance = useCallback(async () => {
  11. if (!publicKey) return
  12. const balance = await connection.getBalance(publicKey, "confirmed")
  13. setBalance(balance / LAMPORTS_PER_SOL)
  14. }, [publicKey, connection])
  15. const onClick = useCallback(async () => {
  16. setIsLoading(true)
  17. if (!publicKey) return
  18. try {
  19. const txSig = await connection.requestAirdrop(publicKey, LAMPORTS_PER_SOL)
  20. await connection.confirmTransaction(txSig)
  21. getBalance()
  22. } catch (error: any) {
  23. alert(error.message)
  24. } finally {
  25. setIsLoading(false)
  26. }
  27. }, [publicKey, connection, getBalance])
  28. useEffect(() => {
  29. getBalance()
  30. }, [getBalance])
  31. return (
  32. <>
  33. {publicKey &&
  34. (balance <= 0 ? (
  35. <Button onClick={onClick} isLoading={isLoading}>
  36. Airdrop 1
  37. </Button>
  38. ) : (
  39. <Text>Balance: {Number(balance).toFixed(3)}</Text>
  40. ))}
  41. </>
  42. )
  43. }
  44. export default RequestAirdrop