217 lines
5.5 KiB
Vue
217 lines
5.5 KiB
Vue
<template>
|
|
<app-container :is-processing="isENSChecking" :on-proceed="onContinue" :is-proceed-disabled="isProceedDisabled">
|
|
<section>
|
|
<work-area>
|
|
<base-input
|
|
type="text"
|
|
:label="$t('pages.registration.ens.input.label')"
|
|
:loading="isENSChecking"
|
|
:model-value="ensName"
|
|
:error="isENSInvalid"
|
|
:error-message="$t(ensInvalidReason)"
|
|
placeholder-text="relayer-name.eth"
|
|
@update:modelValue="onChangeENSUrl"
|
|
/>
|
|
|
|
<ul v-for="subdomain in subdomains" v-show="shouldShowSubdomains" :key="subdomain.name" :class="$style.subdomains">
|
|
<li :class="$style.subdomains__item">
|
|
<span :class="$style.subdomains__title">
|
|
<span :class="$style.subdomains__titleIcon"><base-icon :name="subdomain.icon" size="fill" /></span>
|
|
<span :class="$style.subdomains__titleText">{{ subdomain.title }}</span>
|
|
</span>
|
|
<span :class="[$style.subdomains__status, $style[subdomain.status]]">
|
|
<span :class="$style.subdomains__statusText">{{ subdomain.status }}</span>
|
|
<span :class="$style.subdomains__statusIcon"><base-icon :name="subdomain.status" size="fill" /></span>
|
|
</span>
|
|
</li>
|
|
</ul>
|
|
</work-area>
|
|
|
|
<section :class="$style.content">
|
|
<p>
|
|
<i18n path="pages.registration.ens.content.first">
|
|
<template #link>
|
|
<base-link :href="relayerUrl">{{ relayerUrl }}</base-link>
|
|
</template>
|
|
</i18n>
|
|
</p>
|
|
|
|
<p>{{ $t('pages.registration.ens.content.second') }}</p>
|
|
|
|
<h4>{{ $t('pages.registration.ens.content.third') }}</h4>
|
|
<ul :class="$style.examples">
|
|
<li>mainnet-tornado.xxx.eth</li>
|
|
<li>goerli-tornado.xxx.eth</li>
|
|
</ul>
|
|
|
|
<h4>{{ $t('pages.registration.ens.content.fourth') }}</h4>
|
|
|
|
<ul :class="$style.examples">
|
|
<li>bsc-tornado.xxx.eth</li>
|
|
<li>gnosis-tornado.xxx.eth</li>
|
|
<li>polygon-tornado.xxx.eth</li>
|
|
<li>optimism-tornado.xxx.eth</li>
|
|
<li>arbitrum-tornado.xxx.eth</li>
|
|
<li>avalanche-tornado.xxx.eth</li>
|
|
</ul>
|
|
<h4>{{ $t('pages.registration.ens.content.fifth') }}</h4>
|
|
|
|
<ul :class="$style.examples">
|
|
<li>gnosis-nova.xxx.eth</li>
|
|
</ul>
|
|
<strong>
|
|
<i18n path="pages.registration.ens.content.sixth">
|
|
<template #link>
|
|
<base-link :href="instructionNova">{{ $t('pages.registration.ens.links.second') }}</base-link>
|
|
</template>
|
|
</i18n>
|
|
</strong>
|
|
</section>
|
|
</section>
|
|
</app-container>
|
|
</template>
|
|
<script>
|
|
import { mapActions, mapGetters, mapMutations } from 'vuex'
|
|
|
|
import { SetupMutation } from '@/types'
|
|
|
|
import { debounce } from '@/utilities'
|
|
import { AppContainer, WorkArea } from '@/containers'
|
|
import { numbers, pages, steps, instructions } from '@/constants'
|
|
|
|
export default {
|
|
components: { AppContainer, WorkArea },
|
|
data() {
|
|
return {
|
|
isENSInvalid: false,
|
|
isENSChecking: false,
|
|
ensInvalidReason: '',
|
|
instructionNova: instructions.nova,
|
|
instructionLink: instructions.relayer,
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters('setup', ['ensName', 'relayerUrl', 'subdomains']),
|
|
isProceedDisabled() {
|
|
return this.isENSInvalid || !this.ensName || this.isENSChecking
|
|
},
|
|
shouldShowSubdomains() {
|
|
const isValidEnsName = !this.isENSInvalid && this.ensName
|
|
return isValidEnsName && !this.isENSChecking && this.subdomains.length
|
|
},
|
|
},
|
|
async mounted() {
|
|
await this.checkerHandler()
|
|
},
|
|
methods: {
|
|
...mapActions('setup', ['checkEns']),
|
|
...mapActions('application', ['goNextStep']),
|
|
...mapMutations('setup', [SetupMutation.SET_ENS_NAME]),
|
|
onChangeENSUrl(value) {
|
|
this[SetupMutation.SET_ENS_NAME](value)
|
|
|
|
this.isENSInvalid = false
|
|
this.isENSChecking = true
|
|
|
|
this.checkENSDebouncer()
|
|
},
|
|
async checkerHandler() {
|
|
try {
|
|
this.isENSChecking = true
|
|
|
|
await this.checkEns()
|
|
} catch (err) {
|
|
this.isENSInvalid = true
|
|
this.ensInvalidReason = err.message
|
|
} finally {
|
|
this.isENSChecking = false
|
|
}
|
|
},
|
|
checkENSDebouncer: debounce(async function () {
|
|
await this.checkerHandler()
|
|
}, numbers.CHECK_RELAYER_URL_DEBOUNCE),
|
|
onContinue() {
|
|
this.goNextStep(steps[pages.setupENS].next)
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" module>
|
|
.content {
|
|
font-size: 1.3rem;
|
|
h4 {
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
}
|
|
|
|
.examples {
|
|
padding: 0 2rem;
|
|
margin: 0;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.subdomains {
|
|
margin: 1.6rem 0 0;
|
|
padding: 0;
|
|
font-size: 1.3rem;
|
|
font-weight: $font-weight-regular;
|
|
&__item {
|
|
display: flex;
|
|
list-style: none;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
|
|
&:not(:last-child) {
|
|
margin-bottom: 2rem;
|
|
}
|
|
}
|
|
|
|
&__title {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 1.3rem;
|
|
}
|
|
|
|
&__title,
|
|
&__status {
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
&__titleText {
|
|
margin-left: 1rem;
|
|
}
|
|
|
|
&__titleIcon {
|
|
height: 2.4rem;
|
|
width: 2.4rem;
|
|
}
|
|
|
|
&__statusText {
|
|
margin-right: 1rem;
|
|
}
|
|
|
|
&__statusIcon {
|
|
width: 1.6rem;
|
|
}
|
|
|
|
&__statusText,
|
|
&__titleText {
|
|
&:first-letter {
|
|
text-transform: uppercase;
|
|
}
|
|
}
|
|
|
|
.success {
|
|
color: $color-success;
|
|
}
|
|
.failed {
|
|
color: $color-warning;
|
|
}
|
|
.missing {
|
|
color: $color-link-text;
|
|
}
|
|
}
|
|
</style>
|