~Webmodule~ to include a "Buy button" with streamlined crypto-pay transaction.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

204 行
6.8KB

  1. import React, { useState } from "react";
  2. import { TezosToolkit } from "@taquito/taquito";
  3. import "./App.css";
  4. import ConnectButton from "./components/ConnectWallet";
  5. import DisconnectButton from "./components/DisconnectWallet";
  6. import qrcode from "qrcode-generator";
  7. import UpdateContract from "./components/UpdateContract";
  8. import Transfers from "./components/Transfers";
  9. import BuyButton from "./components/BuyButton";
  10. enum BeaconConnection {
  11. NONE = "",
  12. LISTENING = "Listening to P2P channel",
  13. CONNECTED = "Channel connected",
  14. PERMISSION_REQUEST_SENT = "Permission request sent, waiting for response",
  15. PERMISSION_REQUEST_SUCCESS = "Wallet is connected"
  16. }
  17. const App = () => {
  18. const [Tezos, setTezos] = useState<TezosToolkit>(
  19. new TezosToolkit("https://mainnet.api.tez.ie/")
  20. );
  21. const [contract, setContract] = useState<any>(undefined);
  22. const [publicToken, setPublicToken] = useState<string | null>("");
  23. const [wallet, setWallet] = useState<any>(null);
  24. const [userAddress, setUserAddress] = useState<string>("");
  25. const [userBalance, setUserBalance] = useState<number>(0);
  26. const [storage, setStorage] = useState<number>(0);
  27. const [copiedPublicToken, setCopiedPublicToken] = useState<boolean>(false);
  28. const [beaconConnection, setBeaconConnection] = useState<boolean>(false);
  29. const [activeTab, setActiveTab] = useState<string>("transfer");
  30. // Granadanet Increment/Decrement contract
  31. const contractAddress: string = "KT1K3XVNzsmur7VRgY8CAHPUENaErzzEpe4e";
  32. const generateQrCode = (): { __html: string } => {
  33. const qr = qrcode(0, "L");
  34. qr.addData(publicToken || "");
  35. qr.make();
  36. return { __html: qr.createImgTag(4) };
  37. };
  38. if (publicToken && (!userAddress || isNaN(userBalance))) {
  39. return (
  40. <div className="main-box">
  41. <h1>Taquito Boilerplate</h1>
  42. <div id="dialog">
  43. <header>Try the Taquito Boilerplate App!</header>
  44. <div id="content">
  45. <p className="text-align-center">
  46. <i className="fas fa-broadcast-tower"></i>&nbsp; Connecting to
  47. your wallet
  48. </p>
  49. <div
  50. dangerouslySetInnerHTML={generateQrCode()}
  51. className="text-align-center"
  52. ></div>
  53. <p id="public-token">
  54. {copiedPublicToken ? (
  55. <span id="public-token-copy__copied">
  56. <i className="far fa-thumbs-up"></i>
  57. </span>
  58. ) : (
  59. <span
  60. id="public-token-copy"
  61. onClick={() => {
  62. if (publicToken) {
  63. navigator.clipboard.writeText(publicToken);
  64. setCopiedPublicToken(true);
  65. setTimeout(() => setCopiedPublicToken(false), 2000);
  66. }
  67. }}
  68. >
  69. <i className="far fa-copy"></i>
  70. </span>
  71. )}
  72. <span>
  73. Public token: <span>{publicToken}</span>
  74. </span>
  75. </p>
  76. <p className="text-align-center">
  77. Status: {beaconConnection ? "Connected" : "Disconnected"}
  78. </p>
  79. </div>
  80. </div>
  81. <div id="footer">
  82. <img src="built-with-taquito.png" alt="Built with Taquito" />
  83. </div>
  84. </div>
  85. );
  86. } else if (userAddress && !isNaN(userBalance)) {
  87. return (
  88. <div className="main-box">
  89. <h1>Taquito Boilerplate</h1>
  90. <div id="tabs">
  91. <div
  92. id="transfer"
  93. className={activeTab === "transfer" ? "active" : ""}
  94. onClick={() => setActiveTab("transfer")}
  95. >
  96. Make a transfer
  97. </div>
  98. <div
  99. id="contract"
  100. className={activeTab === "contract" ? "active" : ""}
  101. onClick={() => setActiveTab("contract")}
  102. >
  103. Interact with a contract
  104. </div>
  105. </div>
  106. <div id="dialog">
  107. <div id="content">
  108. <p>
  109. <i className="far fa-address-card"></i>&nbsp; {userAddress}
  110. </p>
  111. <p>
  112. <i className="fas fa-piggy-bank"></i>&nbsp;
  113. {(userBalance / 1000000).toLocaleString("en-US")} ꜩ
  114. </p>
  115. </div>
  116. <BuyButton
  117. Tezos={Tezos}
  118. FA2address="KT1BB1uMwVvJ1M3vVHXWALs1RWdgTp1rnXTR"
  119. receiver="tz1hJncvXvL2VyctPE685GJPXDaRJ7dtiwjm"
  120. amount={100}
  121. />
  122. <DisconnectButton
  123. wallet={wallet}
  124. setPublicToken={setPublicToken}
  125. setUserAddress={setUserAddress}
  126. setUserBalance={setUserBalance}
  127. setWallet={setWallet}
  128. setTezos={setTezos}
  129. setBeaconConnection={setBeaconConnection}
  130. />
  131. </div>
  132. <div id="footer">
  133. <img src="built-with-taquito.png" alt="Built with Taquito" />
  134. </div>
  135. </div>
  136. );
  137. } else if (!publicToken && !userAddress && !userBalance) {
  138. return (
  139. <div className="main-box">
  140. <div className="title">
  141. <h1>Taquito Boilerplate</h1>
  142. <a href="https://app.netlify.com/start/deploy?repository=https://github.com/ecadlabs/taquito-boilerplate">
  143. <img
  144. src="https://www.netlify.com/img/deploy/button.svg"
  145. alt="netlify-button"
  146. />
  147. </a>
  148. </div>
  149. <div id="dialog">
  150. <header>Welcome to Taquito Boilerplate App!</header>
  151. <div id="content">
  152. <p>Hello!</p>
  153. <p>
  154. This is a template Tezos dApp built using Taquito. It's a starting
  155. point for you to hack on and build your own dApp for Tezos.
  156. <br />
  157. If you have not done so already, go to the{" "}
  158. <a
  159. href="https://github.com/ecadlabs/taquito-boilerplate"
  160. target="_blank"
  161. rel="noopener noreferrer"
  162. >
  163. Taquito boilerplate Github page
  164. </a>{" "}
  165. and click the <em>"Use this template"</em> button.
  166. </p>
  167. <p>Go forth and Tezos!</p>
  168. </div>
  169. <ConnectButton
  170. Tezos={Tezos}
  171. setContract={setContract}
  172. setPublicToken={setPublicToken}
  173. setWallet={setWallet}
  174. setUserAddress={setUserAddress}
  175. setUserBalance={setUserBalance}
  176. setStorage={setStorage}
  177. contractAddress={contractAddress}
  178. setBeaconConnection={setBeaconConnection}
  179. wallet={wallet}
  180. />
  181. </div>
  182. <div id="footer">
  183. <img src="built-with-taquito.png" alt="Built with Taquito" />
  184. </div>
  185. </div>
  186. );
  187. } else {
  188. return <div>An error has occurred</div>;
  189. }
  190. };
  191. export default App;