This commit is contained in:
Alisa | Side.one 2023-05-12 02:01:14 +08:00
commit 5f2f06068c
12 changed files with 100 additions and 19 deletions

View File

@ -24,6 +24,7 @@
"coin_type": "118", "coin_type": "118",
"min_tx_fee": "800", "min_tx_fee": "800",
"addr_prefix": "cosmos", "addr_prefix": "cosmos",
"registry_name": "cosmoshub",
"logo": "/logos/cosmos.svg", "logo": "/logos/cosmos.svg",
"assets": [{ "assets": [{
"base": "uatom", "base": "uatom",

View File

@ -4,6 +4,7 @@ import { useThemeConfig } from '@/plugins/vuetify/@core/composable/useThemeConfi
import { hexToRgb } from '@/plugins/vuetify/@layouts/utils'; import { hexToRgb } from '@/plugins/vuetify/@layouts/utils';
import { themeChange } from 'theme-change'; import { themeChange } from 'theme-change';
import { onMounted } from 'vue'; import { onMounted } from 'vue';
import TxDialog from './components/TxDialog.vue';
const { const {
syncInitialLoaderTheme, syncInitialLoaderTheme,
syncVuetifyThemeWithTheme: syncConfigThemeWithVuetifyTheme, syncVuetifyThemeWithTheme: syncConfigThemeWithVuetifyTheme,
@ -30,6 +31,7 @@ onMounted(() => {
)}`" )}`"
> >
<RouterView /> <RouterView />
<TxDialog/>
</VApp> </VApp>
</VLocaleProvider> </VLocaleProvider>
</template> </template>

View File

@ -0,0 +1,12 @@
<script lang="ts" setup>
import { useTxDialog } from '@/stores'
const store = useTxDialog()
</script>
<template>
<ping-tx-dialog
:type="store.type"
:sender="store.sender"
:endpoint="store.endpoint"
:params="store.params"
></ping-tx-dialog>
</template>

View File

@ -1,5 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useBlockchain, useFormatter, useStakingStore } from '@/stores'; import { useBlockchain, useFormatter, useStakingStore, useTxDialog } from '@/stores';
import DynamicComponent from '@/components/dynamic/DynamicComponent.vue'; import DynamicComponent from '@/components/dynamic/DynamicComponent.vue';
import DonutChart from '@/components/charts/DonutChart.vue'; import DonutChart from '@/components/charts/DonutChart.vue';
import { computed, ref } from '@vue/reactivity'; import { computed, ref } from '@vue/reactivity';
@ -17,6 +17,7 @@ const props = defineProps(['address', 'chain']);
const blockchain = useBlockchain(); const blockchain = useBlockchain();
const stakingStore = useStakingStore(); const stakingStore = useStakingStore();
const dialog = useTxDialog();
const format = useFormatter(); const format = useFormatter();
const account = ref({} as AuthAccount); const account = ref({} as AuthAccount);
const txs = ref({} as TxResponse[]); const txs = ref({} as TxResponse[]);
@ -112,6 +113,10 @@ loadAccount(props.address);
</VCol> </VCol>
<VCol cols="12" md="8"> <VCol cols="12" md="8">
<VList class="card-list"> <VList class="card-list">
<VListItem>
<label for="transfer" class="btn btn-primary float-right btn-sm" @click="dialog.open('transfer', {chain_name: blockchain.current?.prettyName})">transfer</label>
<label for="send" class="btn btn-primary float-right btn-sm" @click="dialog.open('send', {})">Send</label>
</VListItem>
<VListItem v-for="v in balances"> <VListItem v-for="v in balances">
<template #prepend> <template #prepend>
<VAvatar rounded variant="tonal" size="35" color="info"> <VAvatar rounded variant="tonal" size="35" color="info">
@ -203,7 +208,13 @@ loadAccount(props.address);
<VCard class="my-5"> <VCard class="my-5">
<VCardItem> <VCardItem>
<VCardTitle>Delegations</VCardTitle> <VCardTitle>
Delegations
<div>
<label for="delegate" class="btn btn-primary float-right btn-sm" @click="dialog.open('delegate', {})">Delegate</label>
<label for="withdraw" class="btn btn-primary float-right btn-sm" @click="dialog.open('withdraw', {})">Withdraw</label>
</div>
</VCardTitle>
<VTable> <VTable>
<thead> <thead>
<tr> <tr>
@ -234,7 +245,11 @@ loadAccount(props.address);
) )
}} }}
</td> </td>
<td>action</td> <td>
<label for="delegate" class="btn btn-primary float-right btn-sm" @click="dialog.open('delegate', {validator_address: v.delegation.validator_address})">delegate</label>
<label for="redelegate" class="btn btn-primary float-right btn-sm" @click="dialog.open('redelegate', {validator_address: v.delegation.validator_address})">Redelegate</label>
<label for="unbond" class="btn btn-primary float-right btn-sm" @click="dialog.open('unbond', {validator_address: v.delegation.validator_address})">Unbond</label>
</td>
</tr> </tr>
</tbody> </tbody>
</VTable> </VTable>

View File

@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import ObjectElement from '@/components/dynamic/ObjectElement.vue'; import ObjectElement from '@/components/dynamic/ObjectElement.vue';
import { useBaseStore, useFormatter, useGovStore, useStakingStore } from '@/stores'; import { useBaseStore, useFormatter, useGovStore, useStakingStore, useTxDialog } from '@/stores';
import type { GovProposal, GovVote, PaginabledAccounts, PaginatedProposalDeposit, PaginatedProposalVotes, Pagination } from '@/types'; import type { GovProposal, GovVote, PaginabledAccounts, PaginatedProposalDeposit, PaginatedProposalVotes, Pagination } from '@/types';
import { ref , reactive} from 'vue'; import { ref , reactive} from 'vue';
import Countdown from '@/components/Countdown.vue'; import Countdown from '@/components/Countdown.vue';
@ -10,6 +10,8 @@ const props = defineProps(["proposal_id", "chain"]);
const proposal = ref({} as GovProposal) const proposal = ref({} as GovProposal)
const format = useFormatter() const format = useFormatter()
const store = useGovStore() const store = useGovStore()
const dialog = useTxDialog()
store.fetchProposal(props.proposal_id).then((res) => { store.fetchProposal(props.proposal_id).then((res) => {
const proposalDetail = reactive(res.proposal) const proposalDetail = reactive(res.proposal)
// when status under the voting, final_tally_result are no data, should request fetchTally // when status under the voting, final_tally_result are no data, should request fetchTally
@ -181,6 +183,10 @@ const processList = computed(()=>{
<p class="absolute inset-x-0 inset-y-0 text-center text-sm text-[#666] dark:text-[#eee] flex items-center justify-center">{{ item.value }}</p> <p class="absolute inset-x-0 inset-y-0 text-center text-sm text-[#666] dark:text-[#eee] flex items-center justify-center">{{ item.value }}</p>
</div> </div>
</div> </div>
<div>
<label for="vote" class="btn btn-primary float-right btn-sm mx-1" @click="dialog.open('vote', {proposal_id})">Vote</label>
<label for="deposit" class="btn btn-primary float-right btn-sm mx-1" @click="dialog.open('deposit', {proposal_id})">Deposit</label>
</div>
</div> </div>
<!-- lg:col-span-2 --> <!-- lg:col-span-2 -->
<!-- lg:flex-[2_2_0%] --> <!-- lg:flex-[2_2_0%] -->
@ -284,7 +290,6 @@ const processList = computed(()=>{
</p> </p>
</VTimelineItem> </VTimelineItem>
</VTimeline> </VTimeline>
</div> </div>
</div> </div>

View File

@ -3,7 +3,12 @@ import MdEditor from 'md-editor-v3';
import PriceMarketChart from '@/components/charts/PriceMarketChart.vue'; import PriceMarketChart from '@/components/charts/PriceMarketChart.vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import { useBlockchain, useFormatter, useWalletStore } from '@/stores'; import {
useBlockchain,
useFormatter,
useTxDialog,
useWalletStore,
} from '@/stores';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { useIndexModule } from './indexStore'; import { useIndexModule } from './indexStore';
import { computed } from '@vue/reactivity'; import { computed } from '@vue/reactivity';
@ -15,6 +20,7 @@ const blockchain = useBlockchain();
const store = useIndexModule(); const store = useIndexModule();
const walletStore = useWalletStore(); const walletStore = useWalletStore();
const format = useFormatter(); const format = useFormatter();
const dialog = useTxDialog();
const coinInfo = computed(() => { const coinInfo = computed(() => {
return store.coinInfo; return store.coinInfo;

View File

@ -5,6 +5,7 @@ import {
useFormatter, useFormatter,
useMintStore, useMintStore,
useStakingStore, useStakingStore,
useTxDialog,
} from '@/stores'; } from '@/stores';
import { onMounted, computed, ref } from 'vue'; import { onMounted, computed, ref } from 'vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
@ -22,6 +23,7 @@ const props = defineProps(['validator', 'chain']);
const staking = useStakingStore(); const staking = useStakingStore();
const blockchain = useBlockchain(); const blockchain = useBlockchain();
const format = useFormatter(); const format = useFormatter();
const dialog = useTxDialog();
const validator: string = props.validator; const validator: string = props.validator;
@ -170,7 +172,7 @@ onMounted(() => {
<div class="text-sm mb-2"> <div class="text-sm mb-2">
{{ v.description?.identity || '-' }} {{ v.description?.identity || '-' }}
</div> </div>
<button class="btn btn-primary btn-sm w-full">Delegate</button> <label for="delegate" class="btn btn-primary btn-sm w-full" @click="dialog.open('delegate', {validator_address: v.operator_address})">Delegate</label>
</div> </div>
</div> </div>
<div class="m-4 text-sm"> <div class="m-4 text-sm">
@ -307,12 +309,9 @@ onMounted(() => {
<VCardTitle>Commissions & Rewards</VCardTitle> <VCardTitle>Commissions & Rewards</VCardTitle>
<VCardItem class="pt-0 pb-0"> <VCardItem class="pt-0 pb-0">
<div class="overflow-auto" style="max-height: 280px"> <div class="overflow-auto" style="max-height: 280px">
<VCardSubtitle <VCardSubtitle>
>Commissions Commissions
<VBtn size="small" class="float-right" variant="text" </VCardSubtitle>
>Withdraw</VBtn
></VCardSubtitle
>
<VDivider class="mb-2"></VDivider> <VDivider class="mb-2"></VDivider>
<VChip <VChip
v-for="(i, k) in commission" v-for="(i, k) in commission"
@ -337,6 +336,7 @@ onMounted(() => {
{{ format.formatToken2(i) }} {{ format.formatToken2(i) }}
</VChip> </VChip>
</div> </div>
<label for="withdraw_commission" class="btn btn-primary mt-2 w-full btn-sm" @click="dialog.open('withdraw_commission', {validator_address: v.operator_address})">Withdraw</label>
</VCardItem> </VCardItem>
</VCard> </VCard>
</VCol> </VCol>

View File

@ -1,12 +1,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useBaseStore, useFormatter, useStakingStore } from '@/stores'; import { useBaseStore, useFormatter, useStakingStore, useTxDialog } from '@/stores';
import { toBase64, toHex } from '@cosmjs/encoding';
import { computed } from '@vue/reactivity'; import { computed } from '@vue/reactivity';
import { onMounted, ref, type DebuggerEvent } from 'vue'; import { onMounted, ref, type DebuggerEvent } from 'vue';
import { Icon } from '@iconify/vue'; import { Icon } from '@iconify/vue';
import type { Key, Validator } from '@/types'; import type { Key, Validator } from '@/types';
const staking = useStakingStore(); const staking = useStakingStore();
const format = useFormatter(); const format = useFormatter();
const dialog = useTxDialog()
const cache = JSON.parse(localStorage.getItem('avatars') || '{}'); const cache = JSON.parse(localStorage.getItem('avatars') || '{}');
const avatars = ref(cache || {}); const avatars = ref(cache || {});
@ -22,7 +23,6 @@ onMounted(() => {
}); });
async function fetchChange() { async function fetchChange() {
console.log('fetch changes');
let page = 0; let page = 0;
let height = Number(base.latest?.block?.header?.height || 0); let height = Number(base.latest?.block?.header?.height || 0);
@ -309,7 +309,7 @@ const rank = function (position: number) {
</td> </td>
<!-- 👉 Action --> <!-- 👉 Action -->
<td> <td>
{{ 2 }} <label for="delegate" class="btn btn-xs bg-primary" @click="dialog.open('delegate', {validator_address: v.operator_address})">Delegate</label>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -10,3 +10,4 @@ export * from './useStakingStore';
export * from './useDistributionStore'; export * from './useDistributionStore';
export * from './useParamsStore'; export * from './useParamsStore';
export * from './useWalletStore'; export * from './useWalletStore';
export * from './useTxDialog';

View File

@ -93,6 +93,7 @@ export interface LocalConfig {
min_tx_fee: string; min_tx_fee: string;
rpc: string[] | Endpoint[]; rpc: string[] | Endpoint[];
sdk_version: string; sdk_version: string;
registry_name?: string;
} }
function apiConverter(api: any[]) { function apiConverter(api: any[]) {
@ -129,7 +130,7 @@ export function fromLocal(lc: LocalConfig): ChainConfig {
conf.bech32Prefix = lc.addr_prefix; conf.bech32Prefix = lc.addr_prefix;
conf.chainName = lc.chain_name; conf.chainName = lc.chain_name;
conf.coinType = lc.coin_type; conf.coinType = lc.coin_type;
conf.prettyName = lc.chain_name; conf.prettyName = lc.registry_name || lc.chain_name;
conf.endpoints = { conf.endpoints = {
rest: apiConverter(lc.api), rest: apiConverter(lc.api),
rpc: apiConverter(lc.rpc), rpc: apiConverter(lc.rpc),

View File

@ -75,7 +75,6 @@ export const useFormatter = defineStore('formatter', {
}, },
price(denom: string, currency = "usd") { price(denom: string, currency = "usd") {
const info = this.priceInfo(denom); const info = this.priceInfo(denom);
console.log("info", info, denom)
return info? info[currency]||0 : 0 return info? info[currency]||0 : 0
}, },
priceChanges(denom: string, currency="usd"): number { priceChanges(denom: string, currency="usd"): number {

39
src/stores/useTxDialog.ts Normal file
View File

@ -0,0 +1,39 @@
import { defineStore } from 'pinia';
import { useWalletStore } from './useWalletStore';
import { useBlockchain } from './useBlockchain';
export const useTxDialog = defineStore('txDialogStore', {
state: () => {
return {
sender: "",
type: "send",
endpoint: "",
params: "",
};
},
getters: {
walletAddress() {
return useWalletStore().currentAddress
},
currentEndpoint() {
return useBlockchain().endpoint?.address
}
},
actions: {
setParams(param: any) {
this.params = JSON.stringify(param)
},
openWithArgument(type: string, sender: string, endpoint: string, param: any) {
this.type = type;
this.sender = sender;
this.endpoint = endpoint;
this.params = JSON.stringify(param)
},
open(type: string, param: any) {
this.type = type;
this.sender = this.walletAddress;
this.endpoint = this.currentEndpoint || "";
this.params = JSON.stringify(param)
}
},
});