diff --git a/packages/shared/components/popups/GovernanceManager.svelte b/packages/shared/components/popups/GovernanceManager.svelte index c90b646812e..93f50b6e61a 100644 --- a/packages/shared/components/popups/GovernanceManager.svelte +++ b/packages/shared/components/popups/GovernanceManager.svelte @@ -159,7 +159,7 @@ if (!isSoftwareProfile) { transferState.set(null) } - + activeFlow = getActiveFlow() isPerformingParticipation.set(false) participationAction.set(undefined) } diff --git a/packages/shared/lib/participation/api.ts b/packages/shared/lib/participation/api.ts index 8001c541bfa..f4cedb4c085 100644 --- a/packages/shared/lib/participation/api.ts +++ b/packages/shared/lib/participation/api.ts @@ -80,7 +80,7 @@ export function participate( onSuccess(response: Event) { response.payload.forEach((message) => saveNewMessage(accountId, message)) - addNewPendingParticipation(response.payload, accountId, action) + addNewPendingParticipation(response.payload, accountId, action, participations) const eventIds = participations.map((participation) => participation.eventId) updateParticipationHistoryFromPayload(response.payload, accountId, action, eventIds) diff --git a/packages/shared/lib/participation/stores.ts b/packages/shared/lib/participation/stores.ts index ad2f858a860..77fc7925563 100644 --- a/packages/shared/lib/participation/stores.ts +++ b/packages/shared/lib/participation/stores.ts @@ -11,6 +11,7 @@ import { transferState, wallet } from '../wallet' import { ASSEMBLY_EVENT_ID, SHIMMER_EVENT_ID, TREASURY_VOTE_EVENT_ID } from './constants' import { ParticipateResponsePayload, + Participation, ParticipationAction, ParticipationEvent, ParticipationEventState, @@ -189,15 +190,17 @@ export const shimmerStakingRemainingTime: Readable = derived( export const addNewPendingParticipation = ( payload: ParticipateResponsePayload, accountId: string, - action: ParticipationAction + action: ParticipationAction, + participations?: Participation[] ): void => { const _pendingParticipation = { accountId, action, + participations, } - pendingParticipations.update((participations) => [ - ...participations, + pendingParticipations.update((_participations) => [ + ..._participations, ...payload.map((tx) => Object.assign({}, _pendingParticipation, { messageId: tx.id })), ]) } @@ -259,7 +262,6 @@ export const resetPerformingParticipation = (): void => { } isPerformingParticipation.set(false) participationAction.set(undefined) - isChangingParticipation.set(false) } export const participationHistory = persistent('participationHistory', []) diff --git a/packages/shared/lib/participation/types.ts b/packages/shared/lib/participation/types.ts index 82b8a05bc6e..fce450f5834 100644 --- a/packages/shared/lib/participation/types.ts +++ b/packages/shared/lib/participation/types.ts @@ -207,6 +207,7 @@ export type PendingParticipation = { messageId: string accountId: string action: ParticipationAction + participations?: Participation[] } /** diff --git a/packages/shared/lib/walletApiListeners.ts b/packages/shared/lib/walletApiListeners.ts index a46e178c14d..9046285770c 100644 --- a/packages/shared/lib/walletApiListeners.ts +++ b/packages/shared/lib/walletApiListeners.ts @@ -124,6 +124,7 @@ export const initialiseListeners = (): void => { (get(isChangingParticipation) && getPendingParticipation(message.id)?.action !== ParticipationAction.Unvote) ) { + isChangingParticipation.set(false) displayParticipationNotification(getPendingParticipation(message.id)) } if (get(popupState).type === 'stakingManager') { diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index d181d6fdcb0..d0de040b19e 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -1195,6 +1195,8 @@ "notStaked": "Not staked", "stakedFunds": "Staked funds", "unstakedFunds": "Unstaked funds", + "voting": "Voting", + "unvoting": "Unvoting", "accountColor": "Wallet color", "myAssets": "My assets", "option": "Option", diff --git a/packages/shared/routes/dashboard/governance/views/GovernanceEventInfo.svelte b/packages/shared/routes/dashboard/governance/views/GovernanceEventInfo.svelte index 0f471c9030d..1acd9aadfdb 100644 --- a/packages/shared/routes/dashboard/governance/views/GovernanceEventInfo.svelte +++ b/packages/shared/routes/dashboard/governance/views/GovernanceEventInfo.svelte @@ -15,22 +15,43 @@ import { openPopup } from '@lib/popup' import { formatUnitBestMatch } from '@lib/units' import { selectedAccountStore } from '@lib/wallet' - import { DashboardPane, GovernanceInfoTooltip, Icon, Text, Tooltip } from 'shared/components' + import { DashboardPane, GovernanceInfoTooltip, Icon, Spinner, Text, Tooltip } from 'shared/components' import { showAppNotification } from 'shared/lib/notifications' + import { + isChangingParticipation, + participationAction, + pendingParticipations, + } from 'shared/lib/participation/stores' + import { ParticipationAction } from 'shared/lib/participation/types' + import { isSyncing } from 'shared/lib/wallet' export let event: ParticipationEvent export let nextVote: VotingEventAnswer = null - $: cannotVote = getAccountParticipationAbility($selectedAccountStore) === AccountParticipationAbility.HasDustAmount - const tooltip = { statusTimeline: { anchor: null as HTMLElement, show: false }, partiallyVoted: { anchor: null as HTMLElement, show: false }, } + $: eventAnswers = event?.information?.payload?.questions[0]?.answers ?? [] $: results = event?.status?.questions?.[0]?.answers?.filter( (answer) => answer?.value !== 0 && answer?.value !== 255 ) + $: cannotVote = getAccountParticipationAbility($selectedAccountStore) === AccountParticipationAbility.HasDustAmount + $: disableVoting = + $isChangingParticipation || $pendingParticipations?.length > 0 || !!$participationAction || $isSyncing + + let disableVotingMessages: { + show?: boolean + busy?: boolean + message?: string + }[] + $: disableVoting, + eventAnswers, + $isSyncing, + $currentAccountTreasuryVoteValue, + $pendingParticipations, + updateDisableVotingMessages() const isSelected = (castedAnswerValue: string, answerValue: string): boolean => castedAnswerValue === answerValue @@ -90,6 +111,70 @@ break } } + + function updateDisableVotingMessages(): void { + if (!disableVoting) return + else { + disableVotingMessages = [] + const pendingParticipation = $pendingParticipations?.[0] + eventAnswers.forEach((eventAnswer) => { + if ($isSyncing) { + disableVotingMessages.push({ + show: true, + busy: true, + message: localize('general.syncing'), + }) + } else if ( + $participationAction === ParticipationAction.Stake || + $participationAction === ParticipationAction.Unstake + ) { + const locale = + $participationAction === ParticipationAction.Stake ? 'general.staking' : 'general.unstaking' + disableVotingMessages.push({ + show: true, + busy: true, + message: localize(locale), + }) + } else if ( + pendingParticipation?.action === ParticipationAction.Vote || + pendingParticipation?.action === ParticipationAction.Unvote + ) { + const pendingParticipationAnswers = + pendingParticipation?.participations?.map((participations) => participations?.answers) ?? [] + if (pendingParticipation?.action === ParticipationAction.Vote) { + if ( + pendingParticipationAnswers.some((participation) => + participation.includes(eventAnswer?.value) + ) + ) { + disableVotingMessages.push({ + show: true, + busy: true, + message: localize('general.voting'), + }) + } else { + disableVotingMessages.push({ + show: false, + }) + } + } else { + if (isSelected($currentAccountTreasuryVoteValue, eventAnswer?.value)) { + disableVotingMessages.push({ + show: true, + busy: true, + message: localize('general.unvoting'), + }) + } else { + disableVotingMessages.push({ + show: false, + }) + } + } + } + }) + disableVotingMessages = disableVotingMessages + } + } @@ -133,14 +218,14 @@ {/if}
- {#each event?.information?.payload?.questions[0]?.answers ?? [] as answer} + {#each event?.information?.payload?.questions[0]?.answers ?? [] as answer, answerIndex}