Skip to content

Commit b03eaba

Browse files
committed
Make UI more informative when metamask is not connected.
1 parent b26613e commit b03eaba

File tree

4 files changed

+91
-4
lines changed

4 files changed

+91
-4
lines changed

web/public/mm-logo.svg

Lines changed: 39 additions & 0 deletions
Loading

web/src/components/Web3Info.vue

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<template>
2+
<div>
3+
<div v-if="status.initializing" class="text-center">Connecting...</div>
4+
<div v-else-if="!status.connected" class="d-flex flex-column align-items-center">
5+
<img src="/mm-logo.svg" class="p-2" />
6+
<p class="pt-2 mb-0">You need to connect your Metamask wallet to continue.</p>
7+
<a class="btn btn-link mb-5" target="_blank" href="https://metamask.io/download.html"
8+
>Get metamask</a
9+
>
10+
11+
<button type="button" class="btn btn-primary mb-2" @click="connect">Connect now</button>
12+
<p v-if="status.lastErrorMessage" class="mb-2 alert alert-warning">
13+
{{ status.lastErrorMessage }}
14+
</p>
15+
</div>
16+
<span v-else> Connected to {{ status.account }} </span>
17+
</div>
18+
</template>
19+
20+
<script lang="ts">
21+
import { web3Service } from '@/web3/web3Service';
22+
import { defineComponent } from 'vue';
23+
24+
export default defineComponent({
25+
setup() {
26+
const status = web3Service.status();
27+
const connect = () => {
28+
web3Service.init();
29+
};
30+
return {
31+
status,
32+
connect,
33+
};
34+
},
35+
});
36+
</script>

web/src/views/WalletAccount.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,13 @@
2929
</div>
3030
<OrderPlanDialog v-model:visible="orderDialogVisible" :orderPlan="orderPlan" />
3131
</div>
32-
<div v-else>Loading...</div>
32+
<Web3Info v-else />
3333
</template>
3434

3535
<script lang="ts">
3636
import OrderPlanDialog from '@/components/OrderPlanDialog.vue';
3737
import SliderPanel from '@/components/SliderPanel.vue';
38+
import Web3Info from '@/components/Web3Info.vue';
3839
import { defaultOrderPlanner, PlannedOrder } from '@/orderplan/orderplan';
3940
import { calcSliderChangeResult } from '@/util/sliderUtil';
4041
import { fetchTokens } from '@/util/tokenlist';
@@ -141,7 +142,7 @@ export default defineComponent({
141142
noFunds,
142143
};
143144
},
144-
components: { SliderPanel, OrderPlanDialog },
145+
components: { SliderPanel, OrderPlanDialog, Web3Info },
145146
methods: {},
146147
});
147148
</script>

web/src/web3/web3Service.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ async function getProvider(): Promise<ExternalProvider> {
3131
await provider.request!({ method: 'eth_requestAccounts' });
3232
} catch (err) {
3333
console.log(err);
34+
if (err.message && err.message.includes('rejected')) {
35+
throw err;
36+
}
3437
// Try ethereum.enable as fallback
3538
try {
3639
// eslint-disable-next-line @typescript-eslint/no-explicit-any
37-
(provider as unknown as any).enable();
40+
await (provider as unknown as any).enable();
3841
} catch (err) {
3942
console.log("enable also didn't work", err);
43+
throw err;
4044
}
4145
}
4246
return provider;
@@ -45,6 +49,8 @@ async function getProvider(): Promise<ExternalProvider> {
4549
export interface Web3Status {
4650
initializing: boolean;
4751
connected?: boolean;
52+
providerPresent: boolean;
53+
lastErrorMessage?: string;
4854
network?: string;
4955
chainId?: number;
5056
address?: string;
@@ -57,6 +63,7 @@ class Web3Service {
5763
private signer?: Signer;
5864
private state: Web3Status = reactive({
5965
initializing: true,
66+
providerPresent: false,
6067
}) as Web3Status;
6168
private copy = readonly(this.state);
6269
private intervalHandler?: number;
@@ -91,6 +98,7 @@ class Web3Service {
9198

9299
private async updateData() {
93100
if (this.provider !== undefined) {
101+
this.state.providerPresent = true;
94102
try {
95103
await this.provider.getBlock('latest');
96104
} catch (err) {
@@ -114,6 +122,7 @@ class Web3Service {
114122
this.state.balance = utils.formatEther(await this.provider.getBalance(accounts[0]));
115123
}
116124
} else {
125+
this.state.providerPresent = false;
117126
console.log('no web3');
118127
}
119128
}
@@ -122,6 +131,7 @@ class Web3Service {
122131
if (!this.state.connected) {
123132
this.state.initializing = true;
124133
}
134+
this.state.lastErrorMessage = undefined;
125135
return getProvider()
126136
.then(async (externalProvider) => {
127137
this.externalProvider = externalProvider;
@@ -131,10 +141,11 @@ class Web3Service {
131141
if (this.intervalHandler === undefined) {
132142
this.intervalHandler = window.setInterval(() => this.updateData(), 2000);
133143
}
134-
this.updateData();
144+
await this.updateData();
135145
})
136146
.catch((error) => {
137147
console.log(error);
148+
this.state.lastErrorMessage = error.message;
138149
if (errorCallback) {
139150
errorCallback(error.message);
140151
}

0 commit comments

Comments
 (0)