From ff0df08a9fe3236ee9a0219b67b70e601afe610c Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Wed, 14 Dec 2022 09:52:37 -0300 Subject: [PATCH 1/6] feat: adds proposal status polling logic --- .../dashboard/governance/Governance.svelte | 6 ++++ .../lib/core/governance/actions/index.ts | 1 + .../actions/proposal-status-polling.ts | 13 +++++++ .../lib/core/governance/constants/index.ts | 1 + .../proposal-status-poll-interval.constant.ts | 6 ++++ .../lib/core/governance/stores/index.ts | 1 + .../stores/proposals-status.store.ts | 34 +++++++++++++++++++ .../api/deregisterParticipationEvent.ts | 4 ++- .../api/getVotingProposalStatus.ts | 8 +++++ .../lib/core/profile-manager/api/index.ts | 1 + .../api/registerParticipationEvent.ts | 7 ++-- .../interfaces/profile-manager.interface.ts | 2 ++ .../profile/actions/active-profile/logout.ts | 2 ++ 13 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 packages/shared/lib/core/governance/actions/proposal-status-polling.ts create mode 100644 packages/shared/lib/core/governance/constants/index.ts create mode 100644 packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts create mode 100644 packages/shared/lib/core/governance/stores/proposals-status.store.ts create mode 100644 packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts diff --git a/packages/desktop/views/dashboard/governance/Governance.svelte b/packages/desktop/views/dashboard/governance/Governance.svelte index 4e76a62b5e..e718629664 100644 --- a/packages/desktop/views/dashboard/governance/Governance.svelte +++ b/packages/desktop/views/dashboard/governance/Governance.svelte @@ -1,7 +1,13 @@ {#if $selectedAccount} diff --git a/packages/shared/lib/core/governance/actions/index.ts b/packages/shared/lib/core/governance/actions/index.ts index bcb399c0a7..9c00854e42 100644 --- a/packages/shared/lib/core/governance/actions/index.ts +++ b/packages/shared/lib/core/governance/actions/index.ts @@ -1 +1,2 @@ +export * from './proposal-status-polling' export * from './setVotingPower' diff --git a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts new file mode 100644 index 0000000000..b6de430a98 --- /dev/null +++ b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts @@ -0,0 +1,13 @@ +import { PROPOSAL_STATUS_POLL_INTERVAL } from '../constants' +import { updateProposalsStatus } from '../stores' + +let pollInterval: NodeJS.Timeout + +export async function pollProposalStatus(): Promise { + await updateProposalsStatus() + pollInterval = setInterval(() => void updateProposalsStatus(), PROPOSAL_STATUS_POLL_INTERVAL) +} + +export function clearPollProposalStatusInterval(): void { + clearInterval(pollInterval) +} diff --git a/packages/shared/lib/core/governance/constants/index.ts b/packages/shared/lib/core/governance/constants/index.ts new file mode 100644 index 0000000000..6be61878e3 --- /dev/null +++ b/packages/shared/lib/core/governance/constants/index.ts @@ -0,0 +1 @@ +export * from './proposal-status-poll-interval.constant' diff --git a/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts b/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts new file mode 100644 index 0000000000..33e0e25459 --- /dev/null +++ b/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts @@ -0,0 +1,6 @@ +import { SECONDS_PER_MILESTONE } from '@core/network' +import { MILLISECONDS_PER_SECOND } from '@core/utils' + +const INTERVAL_IN_SECONDS = SECONDS_PER_MILESTONE + +export const PROPOSAL_STATUS_POLL_INTERVAL = INTERVAL_IN_SECONDS * MILLISECONDS_PER_SECOND diff --git a/packages/shared/lib/core/governance/stores/index.ts b/packages/shared/lib/core/governance/stores/index.ts index 0b1e9b751e..3ef47d8e80 100644 --- a/packages/shared/lib/core/governance/stores/index.ts +++ b/packages/shared/lib/core/governance/stores/index.ts @@ -1 +1,2 @@ +export * from './proposals-status.store' export * from './selected-proposal.store' diff --git a/packages/shared/lib/core/governance/stores/proposals-status.store.ts b/packages/shared/lib/core/governance/stores/proposals-status.store.ts new file mode 100644 index 0000000000..10e5554f77 --- /dev/null +++ b/packages/shared/lib/core/governance/stores/proposals-status.store.ts @@ -0,0 +1,34 @@ +import { getProposalStatus } from '@core/profile-manager' +import { persistent } from '@core/utils/store' +import { EventStatus } from '@iota/wallet' +import { get } from 'svelte/store' + +export const proposalsStatus = persistent<{ [key in string]: EventStatus }>('proposalsStatus', {}) + +export async function addProposalStatus(eventId: string): Promise { + const _proposalsStatus = get(proposalsStatus) + const hasRegisteredProposalStatus = Object.keys(_proposalsStatus).includes(eventId) + if (!hasRegisteredProposalStatus) { + const proposalStatus = await getProposalStatus(eventId) + _proposalsStatus[eventId] = proposalStatus + proposalsStatus.set(_proposalsStatus) + } +} + +export function removeProposalStatus(eventId: string): void { + const _proposalsStatus = get(proposalsStatus) + const hasRegisteredProposalStatus = Object.keys(_proposalsStatus).includes(eventId) + if (hasRegisteredProposalStatus) { + delete _proposalsStatus[eventId] + proposalsStatus.set(_proposalsStatus) + } +} + +export async function updateProposalsStatus(): Promise { + const _proposalsStatus = get(proposalsStatus) + for (const eventId in _proposalsStatus) { + const proposalStatus = await getProposalStatus(eventId) + _proposalsStatus[eventId] = proposalStatus + } + proposalsStatus.set(_proposalsStatus) +} diff --git a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts index 2d57fe13cd..3d64eabe48 100644 --- a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts +++ b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts @@ -1,8 +1,10 @@ +import { removeProposalStatus } from '@core/governance' import { profileManager } from '@core/profile-manager/stores' import type { EventId } from '@iota/wallet' import { get } from 'svelte/store' -export function deregisterParticipationEvent(eventId: EventId): Promise { +export async function deregisterParticipationEvent(eventId: EventId): Promise { const manager = get(profileManager) + await removeProposalStatus(eventId) return manager.deregisterParticipationEvent(eventId) } diff --git a/packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts b/packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts new file mode 100644 index 0000000000..42247fa1f2 --- /dev/null +++ b/packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts @@ -0,0 +1,8 @@ +import { get } from 'svelte/store' +import { EventStatus, EventId } from '@iota/wallet' +import { profileManager } from '@core/profile-manager' + +export function getProposalStatus(eventId: EventId): Promise { + const manager = get(profileManager) + return manager.getParticipationEventStatus(eventId) +} diff --git a/packages/shared/lib/core/profile-manager/api/index.ts b/packages/shared/lib/core/profile-manager/api/index.ts index 5eb5c2f978..385fc46d9a 100644 --- a/packages/shared/lib/core/profile-manager/api/index.ts +++ b/packages/shared/lib/core/profile-manager/api/index.ts @@ -11,6 +11,7 @@ export * from './getLedgerNanoStatus' export * from './getNodeInfo' export * from './getVotingProposals' export * from './getVotingProposal' +export * from './getVotingProposalStatus' export * from './isStrongholdUnlocked' export * from './recoverAccounts' export * from './registerParticipationEvent' diff --git a/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts b/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts index 60a2bcfb3c..c72b776d44 100644 --- a/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts +++ b/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts @@ -1,8 +1,11 @@ +import { addProposalStatus } from '@core/governance' import { profileManager } from '@core/profile-manager/stores' import type { Event, EventId, Node } from '@iota/wallet' import { get } from 'svelte/store' -export function registerParticipationEvent(eventId: EventId, nodes: Node[]): Promise { +export async function registerParticipationEvent(eventId: EventId, nodes: Node[]): Promise { const manager = get(profileManager) - return manager.registerParticipationEvent(eventId, nodes) + const event = await manager.registerParticipationEvent(eventId, nodes) + await addProposalStatus(eventId) + return event } diff --git a/packages/shared/lib/core/profile-manager/interfaces/profile-manager.interface.ts b/packages/shared/lib/core/profile-manager/interfaces/profile-manager.interface.ts index ab3f8cfde2..670040852a 100644 --- a/packages/shared/lib/core/profile-manager/interfaces/profile-manager.interface.ts +++ b/packages/shared/lib/core/profile-manager/interfaces/profile-manager.interface.ts @@ -9,6 +9,7 @@ import type { Node, NodeInfoWrapper, WalletEvent, + EventStatus, } from '@iota/wallet' import { IAuth } from '@core/network' @@ -40,6 +41,7 @@ export interface IProfileManager { getLedgerNanoStatus(): Promise getParticipationEvent(eventId: EventId): Promise getParticipationEvents(): Promise + getParticipationEventStatus(eventId: EventId): Promise hexToBech32(hex: string, bech32Hrp?: string): Promise isStrongholdPasswordAvailable(): Promise listen(eventTypes: EventType[], callback: WalletApiEventHandler): void diff --git a/packages/shared/lib/core/profile/actions/active-profile/logout.ts b/packages/shared/lib/core/profile/actions/active-profile/logout.ts index 1b6997a948..2c7af19620 100644 --- a/packages/shared/lib/core/profile/actions/active-profile/logout.ts +++ b/packages/shared/lib/core/profile/actions/active-profile/logout.ts @@ -1,5 +1,6 @@ import { closePopup } from '@auxiliary/popup' import { resetSelectedAccount } from '@core/account' +import { clearPollProposalStatusInterval } from '@core/governance' import { isPollingLedgerDeviceStatus, stopPollingLedgerNanoStatus } from '@core/ledger' import { clearPollMarketPrices } from '@core/market/actions' import { clearPollNetworkInterval } from '@core/network' @@ -33,6 +34,7 @@ export function logout(clearActiveProfile: boolean = true, _lockStronghold: bool clearPollNetworkInterval() clearPollMarketPrices() + clearPollProposalStatusInterval() const _activeProfile = get(activeProfile) if (_activeProfile) { const manager = get(profileManager) From 4314b04959b96d658b7daba2e7ac7b18d19146a3 Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Thu, 15 Dec 2022 10:34:06 -0300 Subject: [PATCH 2/6] fix: mock with missing method --- packages/shared/lib/tests/__mocks__/profile-manager.mock.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/shared/lib/tests/__mocks__/profile-manager.mock.ts b/packages/shared/lib/tests/__mocks__/profile-manager.mock.ts index bad4ef2d30..d9a5925dec 100644 --- a/packages/shared/lib/tests/__mocks__/profile-manager.mock.ts +++ b/packages/shared/lib/tests/__mocks__/profile-manager.mock.ts @@ -12,6 +12,7 @@ import type { Event, Node, EventId, + EventStatus, } from '@iota/wallet' import { IAccount } from '@core/account' @@ -160,6 +161,10 @@ export class ProfileManagerMock implements IProfileManager { throw new Error('Method not implemented.') } + getParticipationEventStatus(eventId: EventId): Promise { + throw new Error('Method not implemented.') + } + hexToBech32(hex: string, bech32Hrp?: string): Promise { throw new Error('Method not implemented.') } From 18cf68c51667d60f1fd7e09fc3ff994200c69fb0 Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Thu, 15 Dec 2022 11:08:55 -0300 Subject: [PATCH 3/6] fix: proposal status enums --- .../governance/views/DetailsView.svelte | 4 ++-- .../ProposalStatusTimelineTooltip.svelte | 8 ++++---- .../atoms/pills/ProposalStatusPill.svelte | 8 ++++---- .../components/organisms/ProposalCard.svelte | 2 +- .../organisms/ProposalInformation.svelte | 2 +- .../governance/enums/proposal-status.enum.ts | 8 ++++---- .../utils/createProposalsFromEvents.ts | 10 +++++----- packages/shared/locales/en.json | 16 ++++++++-------- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte index 41e0c091c9..0ce99a7132 100644 --- a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte +++ b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte @@ -41,8 +41,8 @@ selectedIndices = Array(questions?.length) } $: isVotingDisabled = - $selectedProposal?.status === ProposalStatus.Announcement || - $selectedProposal?.status === ProposalStatus.Closed || + $selectedProposal?.status === ProposalStatus.Upcoming || + $selectedProposal?.status === ProposalStatus.Ended || selectedIndices?.length === 0 || selectedIndices?.includes(undefined) diff --git a/packages/shared/components/ProposalStatusTimelineTooltip.svelte b/packages/shared/components/ProposalStatusTimelineTooltip.svelte index ac6ed1b219..8cddc7556a 100644 --- a/packages/shared/components/ProposalStatusTimelineTooltip.svelte +++ b/packages/shared/components/ProposalStatusTimelineTooltip.svelte @@ -12,16 +12,16 @@ let eventProgress: number switch (status) { - case ProposalStatus.Announcement: + case ProposalStatus.Upcoming: eventProgress = 0 break - case ProposalStatus.VotingOpen: + case ProposalStatus.Commencing: eventProgress = 1 break - case ProposalStatus.Counting: + case ProposalStatus.Holding: eventProgress = 2 break - case ProposalStatus.Closed: + case ProposalStatus.Ended: eventProgress = 3 break default: diff --git a/packages/shared/components/atoms/pills/ProposalStatusPill.svelte b/packages/shared/components/atoms/pills/ProposalStatusPill.svelte index 83ab2df425..bfcd00907a 100644 --- a/packages/shared/components/atoms/pills/ProposalStatusPill.svelte +++ b/packages/shared/components/atoms/pills/ProposalStatusPill.svelte @@ -6,10 +6,10 @@ export let status: ProposalStatus const STATUS_COLORS: Record = { - [ProposalStatus.Announcement]: 'purple-200', - [ProposalStatus.VotingOpen]: 'blue-200', - [ProposalStatus.Counting]: 'green-300', - [ProposalStatus.Closed]: 'gray-200', + [ProposalStatus.Upcoming]: 'purple-200', + [ProposalStatus.Commencing]: 'blue-200', + [ProposalStatus.Holding]: 'green-300', + [ProposalStatus.Ended]: 'gray-200', } diff --git a/packages/shared/components/organisms/ProposalCard.svelte b/packages/shared/components/organisms/ProposalCard.svelte index 8d0bbbbf2a..7c4007da6e 100644 --- a/packages/shared/components/organisms/ProposalCard.svelte +++ b/packages/shared/components/organisms/ProposalCard.svelte @@ -20,7 +20,7 @@
{#if proposal.organization} diff --git a/packages/shared/components/organisms/ProposalInformation.svelte b/packages/shared/components/organisms/ProposalInformation.svelte index 1a279945e9..8b179fe84e 100644 --- a/packages/shared/components/organisms/ProposalInformation.svelte +++ b/packages/shared/components/organisms/ProposalInformation.svelte @@ -7,7 +7,7 @@ const proposalInformation = { countingEnds: formatDate( - milestoneToDate($networkStatus.currentMilestone, $selectedProposal.milestones?.closed), + milestoneToDate($networkStatus.currentMilestone, $selectedProposal.milestones?.ended), DATE_FORMAT ), eventId: truncateString($selectedProposal?.id, 9, 9), diff --git a/packages/shared/lib/core/governance/enums/proposal-status.enum.ts b/packages/shared/lib/core/governance/enums/proposal-status.enum.ts index a6977b6171..498055b08c 100644 --- a/packages/shared/lib/core/governance/enums/proposal-status.enum.ts +++ b/packages/shared/lib/core/governance/enums/proposal-status.enum.ts @@ -1,6 +1,6 @@ export enum ProposalStatus { - Announcement = 'announcement', - VotingOpen = 'votingOpen', - Counting = 'counting', - Closed = 'closed', + Upcoming = 'upcoming', + Commencing = 'commencing', + Holding = 'holding', + Ended = 'ended', } diff --git a/packages/shared/lib/core/governance/utils/createProposalsFromEvents.ts b/packages/shared/lib/core/governance/utils/createProposalsFromEvents.ts index 0ee826a1c9..f193d1ded5 100644 --- a/packages/shared/lib/core/governance/utils/createProposalsFromEvents.ts +++ b/packages/shared/lib/core/governance/utils/createProposalsFromEvents.ts @@ -12,12 +12,12 @@ export function createProposalsFromEvents(events: Event[]): IProposal[] { const proposal = { id, title: data.name, - status: ProposalStatus.Announcement, + status: ProposalStatus.Upcoming, milestones: { - [ProposalStatus.Announcement]: 0, // TODO: fix this - [ProposalStatus.VotingOpen]: data.milestoneIndexCommence, - [ProposalStatus.Counting]: data.milestoneIndexStart, - [ProposalStatus.Closed]: data.milestoneIndexEnd, + [ProposalStatus.Upcoming]: 0, // TODO: fix this + [ProposalStatus.Commencing]: data.milestoneIndexCommence, + [ProposalStatus.Holding]: data.milestoneIndexStart, + [ProposalStatus.Ended]: data.milestoneIndexEnd, }, // TODO: figure out a better way to get the node URLs nodeUrls: get(activeProfile)?.clientOptions?.nodes, diff --git a/packages/shared/locales/en.json b/packages/shared/locales/en.json index eec85c3009..ff2e29c8f1 100644 --- a/packages/shared/locales/en.json +++ b/packages/shared/locales/en.json @@ -583,10 +583,10 @@ "successRemove": "Proposal successfully removed" }, "statusTimeline": { - "announcement": "Announcement", - "votingOpen": "Voting open", - "counting": "Counting starts", - "closed": "Counting stops" + "upcoming": "Announcement", + "commencing": "Voting open", + "holding": "Counting starts", + "ended": "Counting stops" }, "details": { "fullProposal": "Read the full proposal", @@ -1983,10 +1983,10 @@ "locked": "locked", "smartContract": "smart contract", "proposalStatus": { - "announcement": "Announcement", - "votingOpen": "Voting open", - "counting": "Counting", - "closed": "Closed" + "upcoming": "Announcement", + "commencing": "Voting open", + "holding": "Counting", + "ended": "Closed" } }, "menus": { From b47749dba1a24f999d09473edcfa294ee432f6d7 Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Thu, 15 Dec 2022 11:43:13 -0300 Subject: [PATCH 4/6] chore: change proposals status to proposals state --- .../governance/views/DetailsView.svelte | 11 +++--- .../components/organisms/ProposalCard.svelte | 5 ++- .../actions/proposal-status-polling.ts | 6 ++-- .../lib/core/governance/stores/index.ts | 2 +- .../stores/proposals-state.store.ts | 34 +++++++++++++++++++ .../stores/proposals-status.store.ts | 34 ------------------- .../api/deregisterParticipationEvent.ts | 4 +-- ...salStatus.ts => getVotingProposalState.ts} | 2 +- .../lib/core/profile-manager/api/index.ts | 2 +- .../api/registerParticipationEvent.ts | 4 +-- 10 files changed, 54 insertions(+), 50 deletions(-) create mode 100644 packages/shared/lib/core/governance/stores/proposals-state.store.ts delete mode 100644 packages/shared/lib/core/governance/stores/proposals-status.store.ts rename packages/shared/lib/core/profile-manager/api/{getVotingProposalStatus.ts => getVotingProposalState.ts} (74%) diff --git a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte index 0ce99a7132..6e8b370748 100644 --- a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte +++ b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte @@ -21,15 +21,16 @@ import type { IParticipations } from '@core/governance/interfaces' import { openPopup } from '@auxiliary/popup' import { ProposalStatus } from '@core/governance/enums' + import { proposalsState } from '@core/governance/stores' import { networkStatus } from '@core/network' let selectedIndices: number[] = [] - let votingPayload: VotingEventPayload - $: void setVotingEventPayload($selectedProposal?.id) - let totalVotes = 0 + + $: void setVotingEventPayload($selectedProposal?.id) $: void setTotalVotes() + $: proposalStatus = $proposalsState[$selectedProposal?.id]?.status $: votesCounter = { total: totalVotes, @@ -41,8 +42,8 @@ selectedIndices = Array(questions?.length) } $: isVotingDisabled = - $selectedProposal?.status === ProposalStatus.Upcoming || - $selectedProposal?.status === ProposalStatus.Ended || + proposalStatus === ProposalStatus.Upcoming || + proposalStatus === ProposalStatus.Ended || selectedIndices?.length === 0 || selectedIndices?.includes(undefined) diff --git a/packages/shared/components/organisms/ProposalCard.svelte b/packages/shared/components/organisms/ProposalCard.svelte index 7c4007da6e..ff078928b9 100644 --- a/packages/shared/components/organisms/ProposalCard.svelte +++ b/packages/shared/components/organisms/ProposalCard.svelte @@ -8,9 +8,12 @@ import { FontWeight, Position } from '../enums' import { Icon } from '@auxiliary/icon/enums' import { localize } from '@core/i18n' + import { proposalsState } from '@core/governance/stores' export let proposal: IProposal + $: proposalState = $proposalsState[proposal?.id] + function handleProposalClick(): void { $selectedProposal = proposal $governanceRouter.goTo(GovernanceRoute.Details) @@ -38,7 +41,7 @@ {proposal.title}
- + {#if proposal.hasVoted} diff --git a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts index b6de430a98..8695869943 100644 --- a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts +++ b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts @@ -1,11 +1,11 @@ import { PROPOSAL_STATUS_POLL_INTERVAL } from '../constants' -import { updateProposalsStatus } from '../stores' +import { updateProposalsState } from '../stores' let pollInterval: NodeJS.Timeout export async function pollProposalStatus(): Promise { - await updateProposalsStatus() - pollInterval = setInterval(() => void updateProposalsStatus(), PROPOSAL_STATUS_POLL_INTERVAL) + await updateProposalsState() + pollInterval = setInterval(() => void updateProposalsState(), PROPOSAL_STATUS_POLL_INTERVAL) } export function clearPollProposalStatusInterval(): void { diff --git a/packages/shared/lib/core/governance/stores/index.ts b/packages/shared/lib/core/governance/stores/index.ts index 3ef47d8e80..8a2efd8c37 100644 --- a/packages/shared/lib/core/governance/stores/index.ts +++ b/packages/shared/lib/core/governance/stores/index.ts @@ -1,2 +1,2 @@ -export * from './proposals-status.store' +export * from './proposals-state.store' export * from './selected-proposal.store' diff --git a/packages/shared/lib/core/governance/stores/proposals-state.store.ts b/packages/shared/lib/core/governance/stores/proposals-state.store.ts new file mode 100644 index 0000000000..3926c30f54 --- /dev/null +++ b/packages/shared/lib/core/governance/stores/proposals-state.store.ts @@ -0,0 +1,34 @@ +import { getVotingProposalState } from '@core/profile-manager' +import { persistent } from '@core/utils/store' +import { EventStatus } from '@iota/wallet' +import { get } from 'svelte/store' + +export const proposalsState = persistent<{ [key in string]: EventStatus }>('proposalsState', {}) + +export async function addProposalState(eventId: string): Promise { + const _proposalsState = get(proposalsState) + const hasRegisteredProposalStatus = Object.keys(_proposalsState).includes(eventId) + if (!hasRegisteredProposalStatus) { + const proposalStatus = await getVotingProposalState(eventId) + _proposalsState[eventId] = proposalStatus + proposalsState.set(_proposalsState) + } +} + +export function removeProposalState(eventId: string): void { + const _proposalsState = get(proposalsState) + const hasRegisteredProposalStatus = Object.keys(_proposalsState).includes(eventId) + if (hasRegisteredProposalStatus) { + delete _proposalsState[eventId] + proposalsState.set(_proposalsState) + } +} + +export async function updateProposalsState(): Promise { + const _proposalsState = get(proposalsState) + for (const eventId in _proposalsState) { + const proposalStatus = await getVotingProposalState(eventId) + _proposalsState[eventId] = proposalStatus + } + proposalsState.set(_proposalsState) +} diff --git a/packages/shared/lib/core/governance/stores/proposals-status.store.ts b/packages/shared/lib/core/governance/stores/proposals-status.store.ts deleted file mode 100644 index 10e5554f77..0000000000 --- a/packages/shared/lib/core/governance/stores/proposals-status.store.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { getProposalStatus } from '@core/profile-manager' -import { persistent } from '@core/utils/store' -import { EventStatus } from '@iota/wallet' -import { get } from 'svelte/store' - -export const proposalsStatus = persistent<{ [key in string]: EventStatus }>('proposalsStatus', {}) - -export async function addProposalStatus(eventId: string): Promise { - const _proposalsStatus = get(proposalsStatus) - const hasRegisteredProposalStatus = Object.keys(_proposalsStatus).includes(eventId) - if (!hasRegisteredProposalStatus) { - const proposalStatus = await getProposalStatus(eventId) - _proposalsStatus[eventId] = proposalStatus - proposalsStatus.set(_proposalsStatus) - } -} - -export function removeProposalStatus(eventId: string): void { - const _proposalsStatus = get(proposalsStatus) - const hasRegisteredProposalStatus = Object.keys(_proposalsStatus).includes(eventId) - if (hasRegisteredProposalStatus) { - delete _proposalsStatus[eventId] - proposalsStatus.set(_proposalsStatus) - } -} - -export async function updateProposalsStatus(): Promise { - const _proposalsStatus = get(proposalsStatus) - for (const eventId in _proposalsStatus) { - const proposalStatus = await getProposalStatus(eventId) - _proposalsStatus[eventId] = proposalStatus - } - proposalsStatus.set(_proposalsStatus) -} diff --git a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts index 3d64eabe48..1ca2590745 100644 --- a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts +++ b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts @@ -1,10 +1,10 @@ -import { removeProposalStatus } from '@core/governance' +import { removeProposalState } from '@core/governance' import { profileManager } from '@core/profile-manager/stores' import type { EventId } from '@iota/wallet' import { get } from 'svelte/store' export async function deregisterParticipationEvent(eventId: EventId): Promise { const manager = get(profileManager) - await removeProposalStatus(eventId) + await removeProposalState(eventId) return manager.deregisterParticipationEvent(eventId) } diff --git a/packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts b/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts similarity index 74% rename from packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts rename to packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts index 42247fa1f2..4426c2fd4f 100644 --- a/packages/shared/lib/core/profile-manager/api/getVotingProposalStatus.ts +++ b/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts @@ -2,7 +2,7 @@ import { get } from 'svelte/store' import { EventStatus, EventId } from '@iota/wallet' import { profileManager } from '@core/profile-manager' -export function getProposalStatus(eventId: EventId): Promise { +export function getVotingProposalState(eventId: EventId): Promise { const manager = get(profileManager) return manager.getParticipationEventStatus(eventId) } diff --git a/packages/shared/lib/core/profile-manager/api/index.ts b/packages/shared/lib/core/profile-manager/api/index.ts index 385fc46d9a..b03d53b3c0 100644 --- a/packages/shared/lib/core/profile-manager/api/index.ts +++ b/packages/shared/lib/core/profile-manager/api/index.ts @@ -11,7 +11,7 @@ export * from './getLedgerNanoStatus' export * from './getNodeInfo' export * from './getVotingProposals' export * from './getVotingProposal' -export * from './getVotingProposalStatus' +export * from './getVotingProposalState' export * from './isStrongholdUnlocked' export * from './recoverAccounts' export * from './registerParticipationEvent' diff --git a/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts b/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts index c72b776d44..93b651d777 100644 --- a/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts +++ b/packages/shared/lib/core/profile-manager/api/registerParticipationEvent.ts @@ -1,4 +1,4 @@ -import { addProposalStatus } from '@core/governance' +import { addProposalState } from '@core/governance' import { profileManager } from '@core/profile-manager/stores' import type { Event, EventId, Node } from '@iota/wallet' import { get } from 'svelte/store' @@ -6,6 +6,6 @@ import { get } from 'svelte/store' export async function registerParticipationEvent(eventId: EventId, nodes: Node[]): Promise { const manager = get(profileManager) const event = await manager.registerParticipationEvent(eventId, nodes) - await addProposalStatus(eventId) + await addProposalState(eventId) return event } From bc007b92f50817cd33b94d5e3765350ab2c342b8 Mon Sep 17 00:00:00 2001 From: Jean Ribeiro Date: Thu, 15 Dec 2022 12:11:08 -0300 Subject: [PATCH 5/6] fix: remove NodeJS.Timeout typing --- .../lib/core/governance/actions/proposal-status-polling.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts index 8695869943..e43836b9e7 100644 --- a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts +++ b/packages/shared/lib/core/governance/actions/proposal-status-polling.ts @@ -1,7 +1,7 @@ import { PROPOSAL_STATUS_POLL_INTERVAL } from '../constants' import { updateProposalsState } from '../stores' -let pollInterval: NodeJS.Timeout +let pollInterval export async function pollProposalStatus(): Promise { await updateProposalsState() From 7fcaa9c01db769bcbd3eb702a4dbbd2edbaa6785 Mon Sep 17 00:00:00 2001 From: Tuditi Date: Fri, 16 Dec 2022 11:29:51 +0100 Subject: [PATCH 6/6] chore: address PR review --- .../views/dashboard/governance/Governance.svelte | 4 ++-- .../dashboard/governance/views/DetailsView.svelte | 2 +- packages/shared/lib/core/governance/actions/index.ts | 2 +- ...osal-status-polling.ts => proposalsStatePolling.ts} | 4 ++-- .../proposal-status-poll-interval.constant.ts | 8 +++----- .../core/governance/stores/proposals-state.store.ts | 6 +++--- .../api/deregisterParticipationEvent.ts | 10 +++++----- .../core/profile-manager/api/getVotingProposalState.ts | 2 +- .../lib/core/profile/actions/active-profile/logout.ts | 4 ++-- 9 files changed, 20 insertions(+), 22 deletions(-) rename packages/shared/lib/core/governance/actions/{proposal-status-polling.ts => proposalsStatePolling.ts} (71%) diff --git a/packages/desktop/views/dashboard/governance/Governance.svelte b/packages/desktop/views/dashboard/governance/Governance.svelte index e718629664..b428ed0105 100644 --- a/packages/desktop/views/dashboard/governance/Governance.svelte +++ b/packages/desktop/views/dashboard/governance/Governance.svelte @@ -3,10 +3,10 @@ import { DetailsView, ProposalsView } from './views' import { selectedAccount } from '@core/account' import { GovernanceRoute, governanceRoute } from '@core/router' - import { pollProposalStatus } from '@core/governance' + import { pollProposalsState } from '@core/governance/actions' onMount(async () => { - await pollProposalStatus() + await pollProposalsState() }) diff --git a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte index 6e8b370748..e62df2b629 100644 --- a/packages/desktop/views/dashboard/governance/views/DetailsView.svelte +++ b/packages/desktop/views/dashboard/governance/views/DetailsView.svelte @@ -22,7 +22,7 @@ import { openPopup } from '@auxiliary/popup' import { ProposalStatus } from '@core/governance/enums' import { proposalsState } from '@core/governance/stores' - import { networkStatus } from '@core/network' + import { networkStatus } from '@core/network/stores' let selectedIndices: number[] = [] let votingPayload: VotingEventPayload diff --git a/packages/shared/lib/core/governance/actions/index.ts b/packages/shared/lib/core/governance/actions/index.ts index 9c00854e42..7afbeb7557 100644 --- a/packages/shared/lib/core/governance/actions/index.ts +++ b/packages/shared/lib/core/governance/actions/index.ts @@ -1,2 +1,2 @@ -export * from './proposal-status-polling' +export * from './proposalsStatePolling' export * from './setVotingPower' diff --git a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts b/packages/shared/lib/core/governance/actions/proposalsStatePolling.ts similarity index 71% rename from packages/shared/lib/core/governance/actions/proposal-status-polling.ts rename to packages/shared/lib/core/governance/actions/proposalsStatePolling.ts index e43836b9e7..ffdf3c6bea 100644 --- a/packages/shared/lib/core/governance/actions/proposal-status-polling.ts +++ b/packages/shared/lib/core/governance/actions/proposalsStatePolling.ts @@ -3,11 +3,11 @@ import { updateProposalsState } from '../stores' let pollInterval -export async function pollProposalStatus(): Promise { +export async function pollProposalsState(): Promise { await updateProposalsState() pollInterval = setInterval(() => void updateProposalsState(), PROPOSAL_STATUS_POLL_INTERVAL) } -export function clearPollProposalStatusInterval(): void { +export function clearPollProposalsStateInterval(): void { clearInterval(pollInterval) } diff --git a/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts b/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts index 33e0e25459..5ee80be050 100644 --- a/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts +++ b/packages/shared/lib/core/governance/constants/proposal-status-poll-interval.constant.ts @@ -1,6 +1,4 @@ -import { SECONDS_PER_MILESTONE } from '@core/network' -import { MILLISECONDS_PER_SECOND } from '@core/utils' +import { SECONDS_PER_MILESTONE } from '@core/network/constants' +import { MILLISECONDS_PER_SECOND } from '@core/utils/constants' -const INTERVAL_IN_SECONDS = SECONDS_PER_MILESTONE - -export const PROPOSAL_STATUS_POLL_INTERVAL = INTERVAL_IN_SECONDS * MILLISECONDS_PER_SECOND +export const PROPOSAL_STATUS_POLL_INTERVAL = SECONDS_PER_MILESTONE * MILLISECONDS_PER_SECOND diff --git a/packages/shared/lib/core/governance/stores/proposals-state.store.ts b/packages/shared/lib/core/governance/stores/proposals-state.store.ts index 3926c30f54..316bc6b521 100644 --- a/packages/shared/lib/core/governance/stores/proposals-state.store.ts +++ b/packages/shared/lib/core/governance/stores/proposals-state.store.ts @@ -1,7 +1,7 @@ -import { getVotingProposalState } from '@core/profile-manager' -import { persistent } from '@core/utils/store' -import { EventStatus } from '@iota/wallet' import { get } from 'svelte/store' +import type { EventStatus } from '@iota/wallet' +import { getVotingProposalState } from '@core/profile-manager/api' +import { persistent } from '@core/utils/store' export const proposalsState = persistent<{ [key in string]: EventStatus }>('proposalsState', {}) diff --git a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts index 1ca2590745..3c8761e3a4 100644 --- a/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts +++ b/packages/shared/lib/core/profile-manager/api/deregisterParticipationEvent.ts @@ -1,10 +1,10 @@ -import { removeProposalState } from '@core/governance' -import { profileManager } from '@core/profile-manager/stores' -import type { EventId } from '@iota/wallet' import { get } from 'svelte/store' +import type { EventId } from '@iota/wallet' +import { removeProposalState } from '@core/governance' +import { profileManager } from '../stores' -export async function deregisterParticipationEvent(eventId: EventId): Promise { +export function deregisterParticipationEvent(eventId: EventId): Promise { const manager = get(profileManager) - await removeProposalState(eventId) + removeProposalState(eventId) return manager.deregisterParticipationEvent(eventId) } diff --git a/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts b/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts index 4426c2fd4f..b40f7b3cc9 100644 --- a/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts +++ b/packages/shared/lib/core/profile-manager/api/getVotingProposalState.ts @@ -1,6 +1,6 @@ import { get } from 'svelte/store' import { EventStatus, EventId } from '@iota/wallet' -import { profileManager } from '@core/profile-manager' +import { profileManager } from '../stores' export function getVotingProposalState(eventId: EventId): Promise { const manager = get(profileManager) diff --git a/packages/shared/lib/core/profile/actions/active-profile/logout.ts b/packages/shared/lib/core/profile/actions/active-profile/logout.ts index 2c7af19620..b2a1d28338 100644 --- a/packages/shared/lib/core/profile/actions/active-profile/logout.ts +++ b/packages/shared/lib/core/profile/actions/active-profile/logout.ts @@ -1,6 +1,6 @@ import { closePopup } from '@auxiliary/popup' import { resetSelectedAccount } from '@core/account' -import { clearPollProposalStatusInterval } from '@core/governance' +import { clearPollProposalsStateInterval } from '@core/governance' import { isPollingLedgerDeviceStatus, stopPollingLedgerNanoStatus } from '@core/ledger' import { clearPollMarketPrices } from '@core/market/actions' import { clearPollNetworkInterval } from '@core/network' @@ -34,7 +34,7 @@ export function logout(clearActiveProfile: boolean = true, _lockStronghold: bool clearPollNetworkInterval() clearPollMarketPrices() - clearPollProposalStatusInterval() + clearPollProposalsStateInterval() const _activeProfile = get(activeProfile) if (_activeProfile) { const manager = get(profileManager)