Cómo recargar automáticamente dapp cuando Metamask está desbloqueado o bloqueado por el usuario

¿Cómo puedo recargar automáticamente la base de dapp en el estado de la cuenta de Metamask?

Deseo diseñar una autenticación basada en metamask (como la que se usa en Crypokitties), para lo cual puedo diseñar un código que identifique si Metamask está bloqueado o no. Pero el desafío es que tengo que actualizar manualmente mi página web para capturar el estado más reciente de la metamáscara si está bloqueada o desbloqueada.

Supongamos que, si un usuario cierra la sesión de metamask, quiero capturar esa instancia y cerrar la dapp al mismo tiempo sin ninguna otra acción por parte del usuario (en mi caso, esto sucede solo después de actualizar manualmente la página).

Estaré agradecido si alguien ha creado una función similar y puede guiar con lógica o fragmentos de código.

Respuestas (1)

Como Metamask inyecta una instancia Web3 en windowel objeto, puede verificar la existencia del objeto. Para detectar si la metamask está desbloqueada, puede verificar en la instancia Web3 si hay alguna dirección disponible.

Para actualizar los datos automáticamente en JavaScript, puede usarlos setInterval(MyCheckingMethod,1000);en la instancia de su aplicación principal.

Un ejemplo rápido a continuación, pero encontrará que la mayoría se toma de la página oficial . Tenga en cuenta que este es solo un ejemplo mayormente vacío pero comentado que tendrá que adaptar para su propio caso de uso y flujo de datos:

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);

Otro descargo de responsabilidad: tomé parte del código de un montón de archivos mecanografiados míos. Es posible que deba tener esto en cuenta.

Gracias @Asone. El fragmento de código "setInterval(MyCheckingMethod,1000);" ha resuelto mi preocupación a partir de ahora. Solo quería confirmar si esta lógica (verificar periódicamente web3 cada pocos segundos) se considera parte de las buenas pautas de desarrollo de dapp y es aceptable en la comunidad de desarrolladores.
No creo que esto sea un problema importante a menos que ponga una lógica y un procesamiento pesados ​​en su proceso de detección. Desde mi experiencia, he estado usando esto sin ningún problema, ya que generalmente querrá cerrar sesión y redirigir al usuario a la parte principal/no privada de su aplicación si el usuario cambia su identidad. Personalmente, no conozco otra forma de hacerlo, a menos que haya un método que recupere observable que permita suscribirse, pero si existe, no lo he visto en los documentos. Si es así, no dude en notificar para completar la respuesta.
He aceptado tu respuesta. Incluso busqué en varios foros pero no pude encontrar ninguna alternativa. Y sí, mantendré la lógica al mínimo para evitar gastos generales.