Dapp-Development

當 Metamask 被使用者解鎖或鎖定時如何自動重新載入 dapp

  • March 22, 2018

如何根據 Metamask 帳戶狀態自動重新載入 dapp?

我希望設計一種基於元遮罩的身份驗證(如 Crypokitties 中使用的身份驗證),我可以為此設計程式碼來辨識元遮罩是否被鎖定。但挑戰是我必須手動刷新我的網頁以擷取元遮罩的最新狀態,如果它被鎖定或解鎖。

假設,如果使用者退出元遮罩,我想擷取該實例並同時關閉 dapp,而不需要使用者採取任何進一步的行動(在我的情況下,這只發生在我手動刷新頁面之後)。

如果有人創建了類似的功能並可以使用邏輯或程式碼片段進行指導,將不勝感激。

當 Metamask 在對像中注入 Web3 實例時,window您可以檢查對像是否存在。為了檢測元遮罩是否已解鎖,您可以檢查 Web3 實例是否有可用的地址。

要在 JavaScript 中自動刷新數據,您可以setInterval(MyCheckingMethod,1000);在主應用程序實例中使用。

下面是一個簡單的範例,但您會發現大部分來自官方頁面。請注意,這只是一個大部分空但有註釋的範例,您必須適應自己的案例和數據流:

export detectWeb3 = () => {
   if(typeof window.web3 !== "undefined" ){ // load metamask's provider
       const w3 = window.web3;

       // Calling method to retrieve accounts. Method available since Web3 v1.x.x-beta
       w3.eth.getAccounts().then( r => {
           if (r.length > 0) { 
               // some addresses found.
           } else {
               // No address found
           }
       }).catch(e => { // Error catched if method doesn't exist
           const accounts = w3.eth.accounts; // We'll try to get accounts from previous versions ( up to Web3 v0.20.x)
           if (accounts.length > 0) {
               // some addresses found 
           } else {
               // No address found
           }
       });
   }else{ 

       // Instructions to execute if no Web3 instance has been detected.  

   }
}

setInterval(detectWeb3,1000);

另一個免責聲明:我從我的一堆打字稿文件中提取了部分程式碼。您可能需要考慮到這一點。

引用自:https://ethereum.stackexchange.com/questions/43572