ウォレットとネットワークの接続UIをセットアップしよう
このレッスンでは、いろいろな種類のdappに応用できる方法を説明します。
これらは非常に有用で後から役に立つことでしょう。
さぁ、dappを完成していきましょう。
まず、アプリのユーザーインタフェースを大幅に改善します。 まず、ユーザーにアドレスを表示することから始めましょう。Reactアプリにアクセスし、App.jsのheader-container
のdiv
を更新します。
<div className="header-container">
<header>
<div className="left">
<p className="title">🐱👤 Ninja Name Service</p>
<p className="subtitle">Your immortal API on the blockchain!</p>
</div>
{/* Display a logo and wallet connection status*/}
<div className="right">
<img alt="Network logo" className="logo" src={ network.includes('Polygon')
? polygonLogo : ethLogo} /> { currentAccount ?
<p>Wallet: {currentAccount.slice(0, 6)}...{currentAccount.slice(-4)}</p>
:
<p>Not connected</p>
}
</div>
</header>
</div>
「? :」は三項演算子であり、適切な場面で使用すると非常に有用です。
簡単には
( true or false ) ? ( true の場合の処理) : ( false の場合の処理)
です。
ここではネットワーク名に'Polygon'という単語が含まれているかどうかを確認しています。
したがって、Polygonメインネットを使用している場合は、ポリゴンのロゴが表示されます 。
エラーが出ていますがあせらず、今から修正します。
コンポーネントの先頭に戻り、以下を追加します(全体をコピー/貼り付けしないでください、うまく作動しません)。
// これまでのimportのあとに追加してください。
import polygonLogo from './assets/polygonlogo.png';
import ethLogo from './assets/ethlogo.png';
import { networks } from './utils/networks';
const App = () => {
// network を状態変数として設定します。
const [network, setNetwork] = useState('');
// network を扱えるよう checkIfWalletIsConnected 関数をupdateします。
const checkIfWalletIsConnected = async () => {
const { ethereum } = window;
if (!ethereum) {
console.log('Make sure you have metamask!');
return;
} else {
console.log('We have the ethereum object', ethereum);
}
const accounts = await ethereum.request({ method: 'eth_accounts' });
if (accounts.length !== 0) {
const account = accounts[0];
console.log('Found an authorized account:', account);
setCurrentAccount(account);
} else {
console.log('No authorized account found');
}
// ユーザーのネットワークのチェーンIDをチェックします。
const chainId = await ethereum.request({ method: 'eth_chainId' });
setNetwork(networks[chainId]);
ethereum.on('chainChanged', handleChainChanged);
// ネットワークが変わったらリロードします。
function handleChainChanged(_chainId) {
window.location.reload();
}
};
// その他の箇所は変更しないでください。
App.js
の残りの部分はそのままにしておいてください。
ブラウザで確認してみましょう。
Amoy上にいるときは次のようになります。
ネットワーク をチェックしているのでamoy
のテストネット上にいない場合は、ミントフォームを無効にする必要があります。 これをrenderInputForm
の先頭に追加します。
const renderInputForm = () =>{
// テストネットの Polygon Amoy 上にいない場合の処理
if (network !== 'Polygon Amoy Testnet') {
return (
<div className="connect-wallet-container">
<p>Please connect to the Polygon Amoy Testnet</p>
</div>
);
}
// その他の場所はそのままにしておいてください。
return (
...
一方、例えばPolygonのメインネットにいるときは次のように表示されます。
入力フォームとミントボタンの代わりにテキストメッセージをレンダリングします。