{"id":196,"date":"2025-08-28T14:57:44","date_gmt":"2025-08-28T14:57:44","guid":{"rendered":"https:\/\/learn.rantissi.my.id\/?p=196"},"modified":"2025-08-28T14:57:46","modified_gmt":"2025-08-28T14:57:46","slug":"upgrade-ui-web3-app-event-blockchain-data-lengkap","status":"publish","type":"post","link":"https:\/\/learn.rantissi.my.id\/index.php\/2025\/08\/28\/upgrade-ui-web3-app-event-blockchain-data-lengkap\/","title":{"rendered":"Upgrade UI Web3 App + Event Blockchain + Data Lengkap"},"content":{"rendered":"\n<p>Kita akan:<\/p>\n\n\n\n<p>\u2705 Menambahkan <strong>Tailwind CSS<\/strong> untuk tampilan modern<br>\u2705 Menampilkan <strong>waktu pengiriman pesan<\/strong><br>\u2705 Menambahkan <strong>alamat pengirim<\/strong><br>\u2705 Menghubungkan frontend dengan <strong>event dari smart contract<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Update Smart Contract untuk Tambah Data<\/h2>\n\n\n\n<p>\ud83d\udcc2 Buka <code>MessagePortal.sol<\/code>, ubah jadi seperti ini:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\ncontract MessagePortal {\n    event NewMessage(address indexed sender, string message, uint256 timestamp);\n\n    struct Message {\n        address sender;\n        string text;\n        uint256 timestamp;\n    }\n\n    Message&#91;] public messages;\n\n    function sendMessage(string memory _message) public {\n        messages.push(Message(msg.sender, _message, block.timestamp));\n        emit NewMessage(msg.sender, _message, block.timestamp);\n    }\n\n    function getAllMessages() public view returns (Message&#91;] memory) {\n        return messages;\n    }\n\n    function getMessageCount() public view returns (uint) {\n        return messages.length;\n    }\n}\n<\/code><\/pre>\n\n\n\n<p>\ud83d\udccc Penambahan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Struct <code>Message<\/code><\/li>\n\n\n\n<li>Event <code>NewMessage<\/code><\/li>\n\n\n\n<li>Data lengkap: alamat pengirim &amp; timestamp<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Deploy Ulang Kontrak<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Jangan lupa ganti nama file deploy.js jika perlu<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>npx hardhat compile\nnpx hardhat run scripts\/deploy.js --network sepolia\n<\/code><\/pre>\n\n\n\n<p>\u2192 Salin alamat kontraknya ke frontend<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Update ABI di Frontend<\/h2>\n\n\n\n<p>Untuk menyesuaikan ABI (karena data sekarang lebih kompleks), gunakan ABI baru dari <code>artifacts\/contracts\/MessagePortal.sol\/MessagePortal.json<\/code><br>\u2192 Salin bagian <code>abi<\/code> dan tempel ke frontend<\/p>\n\n\n\n<p>Contoh ABI function-nya:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"inputs\": &#91;],\n  \"name\": \"getAllMessages\",\n  \"outputs\": &#91;\n    {\n      \"components\": &#91;\n        { \"internalType\": \"address\", \"name\": \"sender\", \"type\": \"address\" },\n        { \"internalType\": \"string\", \"name\": \"text\", \"type\": \"string\" },\n        { \"internalType\": \"uint256\", \"name\": \"timestamp\", \"type\": \"uint256\" }\n      ],\n      \"internalType\": \"struct MessagePortal.Message&#91;]\",\n      \"name\": \"\",\n      \"type\": \"tuple&#91;]\"\n    }\n  ],\n  \"stateMutability\": \"view\",\n  \"type\": \"function\"\n}\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Update Tampilan <code>App.js<\/code><\/h2>\n\n\n\n<p>Ganti <code>App.js<\/code> agar menampilkan data lengkap:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;ul&gt;\n  {messages.map((msg, idx) =&gt; (\n    &lt;li key={idx} style={{ marginBottom: \"10px\" }}&gt;\n      &lt;div&gt;\ud83e\uddd1 From: {msg.sender}&lt;\/div&gt;\n      &lt;div&gt;\ud83d\udd52 {new Date(msg.timestamp * 1000).toLocaleString()}&lt;\/div&gt;\n      &lt;div&gt;\ud83d\udcac {msg.text}&lt;\/div&gt;\n    &lt;\/li&gt;\n  ))}\n&lt;\/ul&gt;\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">(Opsional) Tambahkan Tailwind CSS<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -D tailwindcss\nnpx tailwindcss init\n<\/code><\/pre>\n\n\n\n<p>Edit <code>tailwind.config.js<\/code> dan <code>index.css<\/code> seperti dokumentasi resmi<br>\u2192 Gunakan class-class Tailwind di komponen React kamu (misal: <code>className=\"text-lg font-bold\"<\/code>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus: Dengar Event dari Blockchain<\/h2>\n\n\n\n<p>Kamu bisa <strong>mendengar event NewMessage langsung dari blockchain<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>useEffect(() =&gt; {\n  const listenToEvents = async () =&gt; {\n    const provider = new ethers.providers.Web3Provider(window.ethereum);\n    const contract = new ethers.Contract(contractAddress, abi, provider);\n\n    contract.on(\"NewMessage\", (sender, text, timestamp) =&gt; {\n      setMessages(prev =&gt; &#91;...prev, { sender, text, timestamp: timestamp.toNumber() }]);\n    });\n  };\n\n  listenToEvents();\n}, &#91;]);\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Ringkasan<\/h2>\n\n\n\n<p>\u2705 Tampilan lebih informatif: nama pengirim + waktu<br>\u2705 Smart contract emit <code>event<\/code> yang ditangkap di frontend<br>\u2705 Tampilan lebih cantik bisa dicapai dengan Tailwind<br>\u2705 dApp kamu kini terasa seperti <strong>produk beneran Web3<\/strong> \ud83c\udfaf<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kita akan: \u2705 Menambahkan Tailwind CSS untuk tampilan modern\u2705 Menampilkan waktu pengiriman pesan\u2705 Menambahkan alamat pengirim\u2705 Menghubungkan frontend dengan event dari smart contract Update Smart Contract untuk Tambah Data \ud83d\udcc2 Buka MessagePortal.sol, ubah jadi seperti ini: \ud83d\udccc Penambahan: Deploy Ulang Kontrak Jangan lupa ganti nama file deploy.js jika perlu \u2192 Salin alamat kontraknya ke frontend&#8230;<\/p>\n","protected":false},"author":1,"featured_media":24,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-196","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-web3-blockchain"],"_links":{"self":[{"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/posts\/196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/comments?post=196"}],"version-history":[{"count":1,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/posts\/196\/revisions"}],"predecessor-version":[{"id":197,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/posts\/196\/revisions\/197"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/media\/24"}],"wp:attachment":[{"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/media?parent=196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/categories?post=196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learn.rantissi.my.id\/index.php\/wp-json\/wp\/v2\/tags?post=196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}