Как автоматически перезагрузить децентрализованное приложение, когда метамаска разблокирована или заблокирована пользователем

Как я могу автоматически перезагружать базу децентрализованных приложений в зависимости от статуса учетной записи Metamask?

Я хочу разработать аутентификацию на основе метамаски (например, ту, что используется в Crypokitties), для которой я могу разработать код, который определяет, заблокирована ли метамаска или нет. Но проблема в том, что мне приходится вручную обновлять свою веб-страницу, чтобы зафиксировать последний статус метамаски, если она заблокирована или разблокирована.

Предположим, если пользователь выходит из метамаски, я хочу поймать этот экземпляр и одновременно закрыть децентрализованное приложение без каких-либо дальнейших действий со стороны пользователя (в моем случае это происходит только после того, как я вручную обновлю страницу).

Буду признателен, если кто-то создал подобную функцию и может направить с помощью логики или фрагментов кода.

Ответы (1)

Поскольку 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);

Еще один отказ от ответственности: я взял часть кода из своих машинописных файлов. Возможно, вам придется принять это во внимание.

Спасибо @Asone. Фрагмент кода "setInterval(MyCheckingMethod,1000);" решил мою проблему на данный момент. Просто хотел подтвердить, считается ли эта логика (периодическая проверка web3 каждые несколько секунд) частью хороших руководств по разработке децентрализованных приложений и приемлемой в сообществе разработчиков.
Я не думаю, что это серьезная проблема, если вы не используете сложную логику и обработку в процессе обнаружения. Исходя из моего опыта, я использую это без каких-либо проблем, так как обычно вы, как правило, хотите выйти из системы и перенаправить пользователя в домашнюю/неприватную часть вашего приложения, если пользователь изменит свою личность. Лично я не знаю другого способа сделать это, если только не существует метода, который извлекал бы наблюдаемое, что позволило бы подписаться, но если он существует, я не видел его в документах. Если это так, пожалуйста, сообщите об этом, чтобы завершить ответ.
Я принял ваш ответ. Даже я облазил несколько форумов, но не нашел альтернатив. И да, я сведу логику к минимуму, чтобы избежать накладных расходов.