InitPlayerButton.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { useCallback, useState } from "react"
  2. import { Button } from "@chakra-ui/react"
  3. import { SystemProgram } from "@solana/web3.js"
  4. import { useConnection, useWallet } from "@solana/wallet-adapter-react"
  5. import { useGameState } from "@/contexts/GameStateProvider"
  6. import { GAME_DATA_SEED, gameDataPDA, program } from "@/utils/anchor"
  7. const InitPlayerButton = () => {
  8. const { publicKey, sendTransaction } = useWallet()
  9. const { connection } = useConnection()
  10. const [isLoading, setIsLoading] = useState(false)
  11. const { gameState, playerDataPDA } = useGameState()
  12. // Init player button click handler
  13. const handleClick = useCallback(async () => {
  14. if (!publicKey || !playerDataPDA) return
  15. setIsLoading(true)
  16. try {
  17. const transaction = await program.methods
  18. .initPlayer(GAME_DATA_SEED)
  19. .accounts({
  20. player: playerDataPDA,
  21. gameData: gameDataPDA,
  22. signer: publicKey,
  23. systemProgram: SystemProgram.programId,
  24. })
  25. .transaction()
  26. const txSig = await sendTransaction(transaction, connection, {
  27. skipPreflight: true,
  28. })
  29. console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`)
  30. } catch (error) {
  31. console.log(error)
  32. } finally {
  33. setIsLoading(false) // set loading state back to false
  34. }
  35. }, [publicKey, playerDataPDA, connection])
  36. return (
  37. <>
  38. {!gameState && publicKey && (
  39. <Button onClick={handleClick} isLoading={isLoading}>
  40. Init Player
  41. </Button>
  42. )}
  43. </>
  44. )
  45. }
  46. export default InitPlayerButton