增加连接钱包的代码
This commit is contained in:
parent
da9e681fa5
commit
5977e01fc6
2
.env
Normal file
2
.env
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
VUE_APP_WALLET_INFURAID='e7743d46923911fa8850619b7a7f6d9d'
|
||||||
|
VUE_APP_CHAIN_ID=97
|
3
.env.development
Normal file
3
.env.development
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
VUE_APP_WALLET_INFURAID='e7743d46923911fa8850619b7a7f6d9d'
|
||||||
|
VUE_APP_CHAIN_ID=97
|
||||||
|
VUE_APP_CHAIN_RPC='https://data-seed-prebsc-1-s1.binance.org:8545/'
|
3
.env.production
Normal file
3
.env.production
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
VUE_APP_WALLET_INFURAID='e7743d46923911fa8850619b7a7f6d9d'
|
||||||
|
VUE_APP_CHAIN_ID=97
|
||||||
|
VUE_APP_CHAIN_RPC='https://data-seed-prebsc-1-s1.binance.org:8545/'
|
@ -153,8 +153,8 @@ export default class extends Vue {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import '@/scss/breakpoints.scss';
|
@import '../../scss/breakpoints.scss';
|
||||||
@import '@/scss/tooltip.scss';
|
@import '../../scss/tooltip.scss';
|
||||||
.root {
|
.root {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
<div class="nav overflow" :class="{'show': menuShow}">
|
<div class="nav overflow" :class="{'show': menuShow}">
|
||||||
<label class="navItem">Thetan Boxes</label>
|
<label class="navItem">Thetan Boxes</label>
|
||||||
<label class="navItem dash">Marketplace</label>
|
<label class="navItem dash">Marketplace</label>
|
||||||
<button class="general-btn connectButton mobile">
|
<button class="general-btn connectButton mobile" @click="collectToWallet">
|
||||||
<span>Connect Wallet</span>
|
<span>Connect Wallet</span>
|
||||||
</button>
|
</button>
|
||||||
<label class="navItem contact">Contact us</label>
|
<label class="navItem contact">Contact us</label>
|
||||||
@ -20,7 +20,7 @@
|
|||||||
<div>My Profile</div>
|
<div>My Profile</div>
|
||||||
<img src="data:image/svg+xml,%3csvg width='10' height='18' viewBox='0 0 10 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3cpath d='M0.0507022 16.0711L1.46491 17.4854L9.9502 9.00007L1.46492 0.514787L0.0507015 1.929L7.12177 9.00007L0.0507022 16.0711Z' fill='%23BCADF2' /%3e %3c/svg%3e">
|
<img src="data:image/svg+xml,%3csvg width='10' height='18' viewBox='0 0 10 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3cpath d='M0.0507022 16.0711L1.46491 17.4854L9.9502 9.00007L1.46492 0.514787L0.0507015 1.929L7.12177 9.00007L0.0507022 16.0711Z' fill='%23BCADF2' /%3e %3c/svg%3e">
|
||||||
</label>
|
</label>
|
||||||
<label class="navItem">Log Out</label>
|
<label class="navItem" @click="disconnectWallet">Log Out</label>
|
||||||
<div class="navChild" :class="{'show': subShow}">
|
<div class="navChild" :class="{'show': subShow}">
|
||||||
<label class="navItem profile" @click="subShow=!subShow">
|
<label class="navItem profile" @click="subShow=!subShow">
|
||||||
<img class="arrowIcon" src="data:image/svg+xml,%3csvg width='10' height='18' viewBox='0 0 10 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3cpath d='M0.0507022 16.0711L1.46491 17.4854L9.9502 9.00007L1.46492 0.514787L0.0507015 1.929L7.12177 9.00007L0.0507022 16.0711Z' fill='%23BCADF2' /%3e %3c/svg%3e">
|
<img class="arrowIcon" src="data:image/svg+xml,%3csvg width='10' height='18' viewBox='0 0 10 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3e %3cpath d='M0.0507022 16.0711L1.46491 17.4854L9.9502 9.00007L1.46492 0.514787L0.0507015 1.929L7.12177 9.00007L0.0507022 16.0711Z' fill='%23BCADF2' /%3e %3c/svg%3e">
|
||||||
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Component, Vue } from 'vue-property-decorator'
|
import { Component, Vue } from 'vue-property-decorator'
|
||||||
|
import { BlockChain } from '@/utils/blockchain'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
name: 'MobileTop',
|
name: 'MobileTop',
|
||||||
@ -47,12 +48,21 @@ import { Component, Vue } from 'vue-property-decorator'
|
|||||||
export default class extends Vue {
|
export default class extends Vue {
|
||||||
menuShow = false
|
menuShow = false
|
||||||
subShow = false
|
subShow = false
|
||||||
|
bc = new BlockChain();
|
||||||
toggleMenu() {
|
toggleMenu() {
|
||||||
this.menuShow = !this.menuShow
|
this.menuShow = !this.menuShow
|
||||||
if (!this.menuShow) {
|
if (!this.menuShow) {
|
||||||
this.subShow = false
|
this.subShow = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async collectToWallet() {
|
||||||
|
return this.bc.connect()
|
||||||
|
}
|
||||||
|
|
||||||
|
async disconnectWallet() {
|
||||||
|
return this.bc.disconnect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
<div class="contact">
|
<div class="contact">
|
||||||
<span class="span">Contact Us</span>
|
<span class="span">Contact Us</span>
|
||||||
</div>
|
</div>
|
||||||
<button v-if="!walletCollected" class="general-btn connectButton">
|
<button v-if="!walletCollected" @click="collectToWallet" class="general-btn connectButton">
|
||||||
<span>Connect Wallet</span>
|
<span>Connect Wallet</span>
|
||||||
</button>
|
</button>
|
||||||
<img
|
<img
|
||||||
@ -45,6 +45,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Component, Vue } from 'vue-property-decorator'
|
import { Component, Vue } from 'vue-property-decorator'
|
||||||
import TopUserInfo from '@/components/market/TopUserInfo.vue'
|
import TopUserInfo from '@/components/market/TopUserInfo.vue'
|
||||||
|
import { BlockChain } from '@/utils/blockchain'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
name: 'Navbar',
|
name: 'Navbar',
|
||||||
@ -53,6 +54,15 @@ import TopUserInfo from '@/components/market/TopUserInfo.vue'
|
|||||||
export default class extends Vue {
|
export default class extends Vue {
|
||||||
walletCollected = false;
|
walletCollected = false;
|
||||||
infoPanelShow = false
|
infoPanelShow = false
|
||||||
|
bc = new BlockChain();
|
||||||
|
|
||||||
|
async collectToWallet() {
|
||||||
|
return this.bc.connect()
|
||||||
|
}
|
||||||
|
|
||||||
|
async disconnectWallet() {
|
||||||
|
return this.bc.disconnect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<span class="itemName">Wallet</span>
|
<span class="itemName">Wallet</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<span class="itemName">Logout</span>
|
<span class="itemName" @click="disconnectWallet">Logout</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -32,12 +32,18 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Component, Vue } from 'vue-property-decorator'
|
import { Component, Vue } from 'vue-property-decorator'
|
||||||
|
import { BlockChain } from '@/utils/blockchain'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
name: 'TopUserInfo',
|
name: 'TopUserInfo',
|
||||||
components: {}
|
components: {}
|
||||||
})
|
})
|
||||||
export default class extends Vue {
|
export default class extends Vue {
|
||||||
|
bc = new BlockChain();
|
||||||
|
|
||||||
|
async disconnectWallet() {
|
||||||
|
return this.bc.disconnect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
28
src/decorators/singleton.decorator.ts
Normal file
28
src/decorators/singleton.decorator.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/**
|
||||||
|
* @singleton
|
||||||
|
* class Test {}
|
||||||
|
* new Test() === new Test() // returns `true`
|
||||||
|
* 也可以不使用 decorator
|
||||||
|
* const TestSingleton = singleton(Test)
|
||||||
|
* new TestSingleton() === new TestSingleton() //returns 'true'
|
||||||
|
*/
|
||||||
|
|
||||||
|
// eslint-disable-next-line symbol-description
|
||||||
|
export const SINGLETON_KEY = Symbol()
|
||||||
|
|
||||||
|
export type Singleton<T extends new (...args: any[]) => any> = T & {
|
||||||
|
[SINGLETON_KEY]: T extends new (...args: any[]) => infer I ? I : never
|
||||||
|
}
|
||||||
|
export const singleton = <T extends new (...args: any[]) => any>(classTarget: T) =>
|
||||||
|
new Proxy(classTarget, {
|
||||||
|
construct(target: Singleton<T>, argumentsList, newTarget) {
|
||||||
|
// Skip proxy for children
|
||||||
|
if (target.prototype !== newTarget.prototype) {
|
||||||
|
return Reflect.construct(target, argumentsList, newTarget)
|
||||||
|
}
|
||||||
|
if (!target[SINGLETON_KEY]) {
|
||||||
|
target[SINGLETON_KEY] = Reflect.construct(target, argumentsList, newTarget)
|
||||||
|
}
|
||||||
|
return target[SINGLETON_KEY]
|
||||||
|
}
|
||||||
|
})
|
53
src/utils/blockchain.ts
Normal file
53
src/utils/blockchain.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import { singleton } from '@/decorators/singleton.decorator'
|
||||||
|
import WalletConnectProvider from '@walletconnect/web3-provider'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
|
||||||
|
@singleton
|
||||||
|
export class BlockChain {
|
||||||
|
provider: WalletConnectProvider
|
||||||
|
web3: Web3
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
const rpc = { 97: process.env.VUE_APP_CHAIN_RPC! }
|
||||||
|
this.provider = new WalletConnectProvider({
|
||||||
|
infuraId: process.env.VUE_APP_WALLET_INFURAID,
|
||||||
|
chainId: parseInt(process.env.VUE_APP_CHAIN_ID!),
|
||||||
|
rpc
|
||||||
|
})
|
||||||
|
console.log('wallet connected: ', this.isWalletConnect)
|
||||||
|
if (this.isWalletConnect) {
|
||||||
|
this.connect()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get isWalletConnect() {
|
||||||
|
return this.provider?.wc.connected
|
||||||
|
}
|
||||||
|
|
||||||
|
public async connect() {
|
||||||
|
// Enable session (triggers QR Code modal)
|
||||||
|
await this.provider.enable()
|
||||||
|
this.web3 = new Web3(<any> this.provider)
|
||||||
|
}
|
||||||
|
|
||||||
|
public async disconnect() {
|
||||||
|
return this.provider?.disconnect()
|
||||||
|
}
|
||||||
|
|
||||||
|
public subscribeToEvents = () => {
|
||||||
|
// Subscribe to accounts change
|
||||||
|
this.provider.on('accountsChanged', (accounts: string[]) => {
|
||||||
|
console.log(accounts)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Subscribe to chainId change
|
||||||
|
this.provider.on('chainChanged', (chainId: number) => {
|
||||||
|
console.log(chainId)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Subscribe to session disconnection
|
||||||
|
this.provider.on('disconnect', (code: number, reason: string) => {
|
||||||
|
console.log(code, reason)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -24,7 +24,7 @@ import MobileTop from '@/components/market/MoileTop.vue'
|
|||||||
export default class Item extends Vue {}
|
export default class Item extends Vue {}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import '@/scss/breakpoints.scss';
|
@import '../scss/breakpoints.scss';
|
||||||
.root {
|
.root {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -50,7 +50,7 @@ export default class Item extends Vue {}
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@media (min-width: 1024px) and (max-width: 1439px) {
|
@include media('>=desktop', '<wide'){
|
||||||
.root {
|
.root {
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ export default class Market extends Vue {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
@import '../scss/breakpoints.scss';
|
||||||
.root {
|
.root {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@ -50,7 +51,7 @@ export default class Market extends Vue {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1023px) {
|
@include media('<desktop') {
|
||||||
.container {
|
.container {
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
-webkit-box-direction: normal;
|
-webkit-box-direction: normal;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user