From dd016c489e390b9e4305e5df299a43dae336638f Mon Sep 17 00:00:00 2001 From: Jose Felix Date: Fri, 3 Jun 2022 01:17:27 -0400 Subject: [PATCH 1/4] fix: display validators and add its loading state --- .../ProjectValidatorsTab/ValidatorCard.vue | 44 ++++++++++++------- .../ProjectValidatorsTab/ValidatorList.vue | 28 +++++++++--- .../ProjectValidatorsTab/index.vue | 24 +++++----- .../validator/useGenesisValidatorAllChains.ts | 27 ++++++------ 4 files changed, 75 insertions(+), 48 deletions(-) diff --git a/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorCard.vue b/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorCard.vue index 60732d51..bf32ae6f 100644 --- a/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorCard.vue +++ b/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorCard.vue @@ -1,25 +1,39 @@ @@ -30,14 +44,10 @@ const validatorData = computed(() => { - {{ - validatorData.details.body?.messages[0]?.description?.moniker || '-' - }} + {{ validatorDescription?.moniker ?? validator?.address ?? '-' }} - {{ - validatorData.details.body?.messages[0]?.description?.details || '-' - }} + {{ validatorDescription?.details || '' }} diff --git a/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorList.vue b/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorList.vue index 6a7cf772..26eb1eaf 100644 --- a/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorList.vue +++ b/src/components/project/project-tabs/ProjectValidatorsTab/ValidatorList.vue @@ -1,5 +1,8 @@ + + diff --git a/src/components/project/project-tabs/ProjectValidatorsTab/index.vue b/src/components/project/project-tabs/ProjectValidatorsTab/index.vue index be927b0b..48b3adac 100644 --- a/src/components/project/project-tabs/ProjectValidatorsTab/index.vue +++ b/src/components/project/project-tabs/ProjectValidatorsTab/index.vue @@ -84,16 +84,18 @@ const showIncentives = computed(function () { -
- - Validators - - - Active validators verifying transactions to secure the - {{ campaignSummary?.campaign?.campaignName }} network - +
+
+ + Validators + + + Active validators verifying transactions to secure the + {{ campaignSummary?.campaign?.campaignName }} network + +
Become a validator diff --git a/src/composables/validator/useGenesisValidatorAllChains.ts b/src/composables/validator/useGenesisValidatorAllChains.ts index 97f31c5b..a92f329a 100644 --- a/src/composables/validator/useGenesisValidatorAllChains.ts +++ b/src/composables/validator/useGenesisValidatorAllChains.ts @@ -7,20 +7,20 @@ import { useQuery } from 'vue-query' import { RefOrValue } from '~/utils/types' -export default function useGenesisValidatorAllChains( - campaignID: RefOrValue +export default function useAllGenesisValidators( + projectId: RefOrValue ) { const { queryCampaignChains } = useTendermintSpnCampaign() const { queryGenesisValidatorAll } = useTendermintSpnLaunch() const isEnabled = computed(() => { - return Boolean(unref(campaignID)) + return Boolean(unref(projectId)) }) const { data: campaignValidators, ...other } = useQuery( - ['campaignValidators', 'populated', campaignID], + ['campaignValidators', 'populated', projectId], async () => { - const { data } = await queryCampaignChains(unref(campaignID) as string) + const { data } = await queryCampaignChains(unref(projectId) as string) if (!data.campaignChains) throw new Error('Failed to fetch campaign chains') @@ -34,18 +34,17 @@ export default function useGenesisValidatorAllChains( const validators = await Promise.all(validatorPromises) - const reducedValidatorsFromAllChains = validators.flatMap( + const campaignValidators = validators.flatMap( (chainValidators) => chainValidators?.genesisValidator || [] ) - const uniqueValidators = [ - ...new Map( - reducedValidatorsFromAllChains.map((validator) => [ - validator.address, - validator - ]) - ) - ] + const seen: Record = {} + + const uniqueValidators = campaignValidators.filter((validator) => { + const address = validator?.address ?? '' + + return seen[address] ? false : (seen[address] = true) + }) return uniqueValidators }, From 2431222f8f7b601b29180f841df37cc75ff1b315 Mon Sep 17 00:00:00 2001 From: Jose Felix Date: Fri, 3 Jun 2022 01:55:48 -0400 Subject: [PATCH 2/4] improvement: connect automatically only on previous connects --- src/components/wallet/IgniteAccount.vue | 5 ++++- src/composables/wallet/useHasConnectedWallet.ts | 5 +++++ src/views/ProjectFundraiserCreate.vue | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/composables/wallet/useHasConnectedWallet.ts diff --git a/src/components/wallet/IgniteAccount.vue b/src/components/wallet/IgniteAccount.vue index 11faed4b..37b8d5f1 100644 --- a/src/components/wallet/IgniteAccount.vue +++ b/src/components/wallet/IgniteAccount.vue @@ -18,6 +18,7 @@ import IgniteModal from '~/components/ui/IgniteModal.vue' import IgniteSpinner from '~/components/ui/IgniteSpinner.vue' import IgniteText from '~/components/ui/IgniteText.vue' import useAddress from '~/composables/wallet/useAddress' +import useHasConnectedWallet from '~/composables/wallet/useHasConnectedWallet' import IgniteAccountMenu from './IgniteAccountMenu.vue' @@ -47,6 +48,7 @@ const state = reactive({ ...initialState }) // composables const { address } = useAddress() +const hasConnectedWallet = useHasConnectedWallet() // methods function onCloseModal() { @@ -86,6 +88,7 @@ async function tryToConnectToKeplr() { listenToAccChange(onKeplrConnect) resetState() + if (!hasConnectedWallet.value) hasConnectedWallet.value = true emit('connect') } @@ -114,7 +117,7 @@ async function tryToConnectToKeplr() { // lifecycle onBeforeMount(() => { - tryToConnectToKeplr() + if (hasConnectedWallet.value) tryToConnectToKeplr() }) // computed diff --git a/src/composables/wallet/useHasConnectedWallet.ts b/src/composables/wallet/useHasConnectedWallet.ts new file mode 100644 index 00000000..ddf44a64 --- /dev/null +++ b/src/composables/wallet/useHasConnectedWallet.ts @@ -0,0 +1,5 @@ +import { useStorage } from '@vueuse/core' + +export default function useHasConnectedWallet() { + return useStorage('has-connected-wallet', false) +} diff --git a/src/views/ProjectFundraiserCreate.vue b/src/views/ProjectFundraiserCreate.vue index 9d976a4c..a8dc3d60 100644 --- a/src/views/ProjectFundraiserCreate.vue +++ b/src/views/ProjectFundraiserCreate.vue @@ -45,6 +45,7 @@ import IgniteNumber from '~/components/ui/IgniteNumber.vue' import IgniteSelect from '~/components/ui/IgniteSelect.vue' import IgniteText from '~/components/ui/IgniteText.vue' import useTotalSupply from '~/composables/fundraising/useTotalSupply' +import useAddress from '~/composables/wallet/useAddress' import useBalances from '~/composables/wallet/useBalances' import { getDenomName } from '~/utils/fundraising' import { percentageToCosmosDecimal } from '~/utils/number' @@ -78,12 +79,13 @@ function coinToSelectOption(c: Coin): { label: string; value: string } { const { spn } = useSpn() // composables +const { address } = useAddress() const router = useRouter() const { balances, isFetching: isFetchingBalances, isFetched: isFetchedBalances -} = useBalances(spn.signer.value.addr) +} = useBalances(address) const { totalSupply, From 0be265ceba0faf88173298928e4ecf4c4f049c15 Mon Sep 17 00:00:00 2001 From: Jose Felix Date: Fri, 3 Jun 2022 03:25:56 -0400 Subject: [PATCH 3/4] feat: add useConnectWallet and useHasConnectedWallet hooks --- src/components/wallet/IgniteAccount.vue | 58 ++++--------- src/components/wallet/IgniteAccountMenu.vue | 6 +- src/composables/wallet/useConnectWallet.ts | 83 +++++++++++++++++++ .../wallet/useHasConnectedWallet.ts | 4 +- src/views/ProjectFundraiserCreate.vue | 42 +++++++--- 5 files changed, 134 insertions(+), 59 deletions(-) create mode 100644 src/composables/wallet/useConnectWallet.ts diff --git a/src/components/wallet/IgniteAccount.vue b/src/components/wallet/IgniteAccount.vue index 37b8d5f1..f026fd46 100644 --- a/src/components/wallet/IgniteAccount.vue +++ b/src/components/wallet/IgniteAccount.vue @@ -18,6 +18,7 @@ import IgniteModal from '~/components/ui/IgniteModal.vue' import IgniteSpinner from '~/components/ui/IgniteSpinner.vue' import IgniteText from '~/components/ui/IgniteText.vue' import useAddress from '~/composables/wallet/useAddress' +import useConnectWallet from '~/composables/wallet/useConnectWallet' import useHasConnectedWallet from '~/composables/wallet/useHasConnectedWallet' import IgniteAccountMenu from './IgniteAccountMenu.vue' @@ -35,7 +36,19 @@ interface Emits { const emit = defineEmits() // spn -const { spn, signIn, signOut } = useSpn() +const { spn } = useSpn() +const { tryToConnectToKeplr, onSignOut } = useConnectWallet({ + onConnecting: () => { + state.modalPage = ModalPage.Connecting + }, + onConnect: () => { + emit('connect') + resetState() + }, + onError: () => { + state.modalPage = ModalPage.Error + } +}) // variables const initialState = { @@ -62,7 +75,7 @@ function onOpenModal() { function onCancel() { resetState() - signOut() + onSignOut() } function getInitialModalPage(isKeplrAvaliable: boolean) { @@ -74,47 +87,6 @@ function resetState() { state.isConnectWalletModalOpen = initialState.isConnectWalletModalOpen } -async function tryToConnectToKeplr() { - const { connect, getOfflineSigner, listenToAccChange } = spn.keplr.value - - state.modalPage = ModalPage.Connecting - - const onKeplrConnect = async () => { - const chainId = spn.env.value.chainID ?? '' - - const offlineSigner = getOfflineSigner(chainId) - signIn(offlineSigner) - - listenToAccChange(onKeplrConnect) - resetState() - - if (!hasConnectedWallet.value) hasConnectedWallet.value = true - emit('connect') - } - - const onKeplrError = (): void => { - state.modalPage = ModalPage.Error - } - - try { - const stakingParams = await ( - await spn.cosmosStakingV1Beta1.value.queryParams() - ).data - - const tokens = await ( - await spn.cosmosBankV1Beta1.value.queryTotalSupply() - ).data - - connect(onKeplrConnect, onKeplrError, { - stakinParams: stakingParams, - tokens, - env: spn.env.value - }) - } catch (e) { - state.modalPage = ModalPage.Error - } -} - // lifecycle onBeforeMount(() => { if (hasConnectedWallet.value) tryToConnectToKeplr() diff --git a/src/components/wallet/IgniteAccountMenu.vue b/src/components/wallet/IgniteAccountMenu.vue index de5e01cc..b1a21386 100644 --- a/src/components/wallet/IgniteAccountMenu.vue +++ b/src/components/wallet/IgniteAccountMenu.vue @@ -6,7 +6,6 @@ export default {