From 1a9572425337c0a80e11e529a9e86aaa2ed57c95 Mon Sep 17 00:00:00 2001 From: strzelec Date: Tue, 29 Oct 2024 14:43:54 +0100 Subject: [PATCH 1/7] fix: change description for user who not stake but voted --- .../MotionStep/FinalizeStep/FinalizeStep.tsx | 19 ++++++++++++++++++- src/i18n/en.json | 5 +++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx index 1454b5be79..1c5c3fa86c 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx @@ -133,6 +133,19 @@ const FinalizeStep: FC = ({ !isMotionFailedNotFinalizable && !isMotionFinalized && !isMotionAgreement; const showClaimButton = isMotionClaimable && canClaimStakes && !isClaimed; + const canBeExecuted = + !isPolling && + !isMotionFailedNotFinalizable && + !isMotionFinalized && + !isMotionAgreement; + + const successStatusText = canBeExecuted + ? 'motion.finalizeStep.votedAndNotStaked.statusText' + : 'motion.finalizeStep.complete.statusText'; + + const statusText = isMotionFailedNotFinalizable + ? 'motion.finalizeStep.failed.statusText' + : successStatusText; return ( = ({ iconAlignment="top" iconSize={16} > - {formatText({ id: statusId })} + {actionType === ColonyActionType.CreateDecisionMotion + ? formatText({ id: statusId }) + : formatText({ + id: statusText, + })} } content={ diff --git a/src/i18n/en.json b/src/i18n/en.json index 6116e04bb8..142d3b1443 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1471,8 +1471,9 @@ "motion.finalizeStep.title": "Your overview", "motion.finalizeStep.failedNotAchieving.statusText": "Action failed due to not achieving required stake.", "motion.finalizeStep.failed.statusText": "Action failed and cannot be executed.", - "motion.finalizeStep.staked": "Staked", - "motion.finalizeStep.winnings": "Reward", + "motion.finalizeStep.votedAndNotStaked.statusText": "Action has passed and can be executed.", + "motion.finalizeStep.staked": "Your stake", + "motion.finalizeStep.winnings": "Your reward", "motion.finalizeStep.total": "Total", "motion.finalizeStep.submit": "Finalize", "motion.finalizeStep.returnStakes": "Return stakes", From 4f81647d1ba5f50c0707539157e8195fe8493e3d Mon Sep 17 00:00:00 2001 From: strzelec Date: Thu, 7 Nov 2024 09:40:39 +0100 Subject: [PATCH 2/7] fix: change status text for passed and completed action --- .../partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx | 4 ++-- .../partials/Motions/MotionStep/FinalizeStep/hooks.tsx | 1 + src/i18n/en.json | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx index 1c5c3fa86c..5a2e0a3574 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx @@ -140,8 +140,8 @@ const FinalizeStep: FC = ({ !isMotionAgreement; const successStatusText = canBeExecuted - ? 'motion.finalizeStep.votedAndNotStaked.statusText' - : 'motion.finalizeStep.complete.statusText'; + ? 'motion.finalizeStep.passedAction' + : 'motion.finalizeStep.completedStatusText'; const statusText = isMotionFailedNotFinalizable ? 'motion.finalizeStep.failed.statusText' diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx index 13036a1ad3..1bd04839f3 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx @@ -123,6 +123,7 @@ export const useClaimConfig = ({ motionStateHistory.hasFailedNotFinalizable; const userStake = usersStakes.find(({ address }) => address === userAddress); + const stakerReward = stakerRewards.find( ({ address }) => address === userAddress, ); diff --git a/src/i18n/en.json b/src/i18n/en.json index 142d3b1443..ed8bda344c 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1467,11 +1467,12 @@ "motion.finalizeStep.statusText": "Finalize to execute the agreed transactions and return stakes.", "motion.finalizeStep.finalizeAgreement": "Agreement process is complete and stakes have been returned.", "motion.finalizeStep.claimable.finalizeAgreement": "Agreement process is complete, finalize to return stakes.", + "motion.finalizeStep.completedStatusText": "Action has passed and is now complete.", "motion.finalizeStep.claimable.statusText": "Action has passed and has been executed.", "motion.finalizeStep.title": "Your overview", "motion.finalizeStep.failedNotAchieving.statusText": "Action failed due to not achieving required stake.", "motion.finalizeStep.failed.statusText": "Action failed and cannot be executed.", - "motion.finalizeStep.votedAndNotStaked.statusText": "Action has passed and can be executed.", + "motion.finalizeStep.passedAction": "Action has passed and can be executed.", "motion.finalizeStep.staked": "Your stake", "motion.finalizeStep.winnings": "Your reward", "motion.finalizeStep.total": "Total", From 9761b267377fb1cc2c2d71129f355121e7542ae3 Mon Sep 17 00:00:00 2001 From: strzelec Date: Tue, 12 Nov 2024 15:44:40 +0100 Subject: [PATCH 3/7] fix: user who voted but not staked can claim --- .../Motions/MotionStep/FinalizeStep/hooks.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx index 1bd04839f3..14ff0cbef4 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx @@ -134,13 +134,14 @@ export const useClaimConfig = ({ } }, [stakerReward?.isClaimed, isClaimed]); + const userReward = voterRewards?.items.find( + (voterReward) => voterReward?.userAddress === userAddress, + ); + const userVoteRewardAmount = useMemo(() => { if (!userAddress || !voterRewards?.items) { return 0; } - const userReward = voterRewards.items.find( - (voterReward) => voterReward?.userAddress === userAddress, - ); if (!userReward) { return 0; @@ -178,7 +179,9 @@ export const useClaimConfig = ({ // Else, return full widget const buttonTextId = isClaimed ? 'button.claimed' : 'button.claim'; const remainingStakesNumber = remainingStakes.length; - const canClaimStakes = userTotalStake ? !userTotalStake.isZero() : false; + const canClaimStakes = userTotalStake + ? !userTotalStake.isZero() + : !!userReward; const handleClaimSuccess = () => { setIsClaimed(true); pollLockedTokenBalance(); From b3c4cd8a0a0c2f13be45c59b66e927f78e37d166 Mon Sep 17 00:00:00 2001 From: strzelec Date: Mon, 9 Dec 2024 13:00:54 +0100 Subject: [PATCH 4/7] fix: display claimed pill for users who staked or woted and change copy for opposed action --- .../Motions/MotionStep/FinalizeStep/FinalizeStep.tsx | 9 +++++++-- src/i18n/en.json | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx index 5a2e0a3574..2ce89c5128 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx @@ -73,6 +73,7 @@ const FinalizeStep: FC = ({ const { setActionsTableTriggers } = useColonyTriggersContext(); const previousIsMotionFinalized = usePrevious(isMotionFinalized); + const isMotionFailed = motionData.motionStateHistory.hasFailed; const isMotionAgreement = actionType === ColonyActionType.CreateDecisionMotion; @@ -139,13 +140,17 @@ const FinalizeStep: FC = ({ !isMotionFinalized && !isMotionAgreement; - const successStatusText = canBeExecuted + const supportedStatusText = canBeExecuted ? 'motion.finalizeStep.passedAction' : 'motion.finalizeStep.completedStatusText'; + const finalizeStatusText = isMotionFailed + ? 'motion.finalizeStep.opposedAction' + : supportedStatusText; + const statusText = isMotionFailedNotFinalizable ? 'motion.finalizeStep.failed.statusText' - : successStatusText; + : finalizeStatusText; return ( Date: Tue, 21 Jan 2025 21:40:17 +0100 Subject: [PATCH 5/7] fix: styles and handle translations for agreements --- .../MotionStep/FinalizeStep/FinalizeStep.tsx | 30 +++++++++++++------ .../Motions/MotionStep/FinalizeStep/hooks.tsx | 29 ++++++++++++++++++ .../Motions/steps/FinalizeStep/types.ts | 22 ++++++++++++++ src/i18n/en.json | 11 +++++-- 4 files changed, 80 insertions(+), 12 deletions(-) create mode 100644 src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx index 2ce89c5128..ab78a8339e 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx @@ -58,6 +58,7 @@ const FinalizeStep: FC = ({ handleClaimSuccess, claimPayload, canClaimStakes, + hasUserStake, } = useClaimConfig({ action, motionData }); const { type: actionType } = action; @@ -75,11 +76,12 @@ const FinalizeStep: FC = ({ const previousIsMotionFinalized = usePrevious(isMotionFinalized); const isMotionFailed = motionData.motionStateHistory.hasFailed; const isMotionAgreement = - actionType === ColonyActionType.CreateDecisionMotion; - - const isMotionClaimable = - isMotionFinalized || - isMotionFailedNotFinalizable || + action.type === ColonyActionType.CreateDecisionMotion; + const isMotionClaimable = isMotionFinalized && !isClaimed; + const isAgreementClaimable = + ((isMotionFinalized || isMotionFailedNotFinalizable) && + !isMotionFailed && + !isMotionFailedNotFinalizable) || (isMotionAgreement && !isClaimed); const handleSuccess = () => { @@ -120,9 +122,17 @@ const FinalizeStep: FC = ({ const statusId = (() => { if (isMotionAgreement) { - return isClaimed - ? 'motion.finalizeStep.finalizeAgreement' - : 'motion.finalizeStep.claimable.finalizeAgreement'; + const userNotStakeOrClaimedText = isMotionFailed + ? 'motion.finalizeStep.finalizeAgreement.failed' + : 'motion.finalizeStep.finalizeAgreement.supported'; + + const userStakeUnclaimedText = isMotionFailed + ? 'motion.finalizeStep.claimable.finalizeAgreement.failed' + : 'motion.finalizeStep.claimable.finalizeAgreement.passed'; + + return isClaimed || !hasUserStake + ? userNotStakeOrClaimedText + : userStakeUnclaimedText; } return isMotionFailedNotFinalizable @@ -133,7 +143,9 @@ const FinalizeStep: FC = ({ const showFinalizeButton = !isMotionFailedNotFinalizable && !isMotionFinalized && !isMotionAgreement; - const showClaimButton = isMotionClaimable && canClaimStakes && !isClaimed; + const showClaimButton = + (isMotionClaimable && canClaimStakes && !isClaimed) || + (isMotionAgreement && isAgreementClaimable && hasUserStake && !isClaimed); const canBeExecuted = !isPolling && !isMotionFailedNotFinalizable && diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx index 14ff0cbef4..983e4a9d3a 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx @@ -1,4 +1,5 @@ import { Extension, Id } from '@colony/colony-js'; +import { format } from 'date-fns'; import { BigNumber } from 'ethers'; import React, { useEffect, useMemo, useState } from 'react'; @@ -267,6 +268,33 @@ export const useClaimConfig = ({ ), }, + { + key: WinningsItems.Completed, + label: formatText({ id: 'motion.finalizeStep.completed' }), + value: ( +
+ +
+ ), + }, ]; }; @@ -280,5 +308,6 @@ export const useClaimConfig = ({ handleClaimSuccess, claimPayload, canClaimStakes, + hasUserStake: !!userStake, }; }; diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts b/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts new file mode 100644 index 0000000000..8b8ff5d605 --- /dev/null +++ b/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts @@ -0,0 +1,22 @@ +import { type MotionAction } from '~types/motions.ts'; +import { type MotionState } from '~utils/colonyMotions.ts'; +import { type RefetchAction } from '~v5/common/ActionSidebar/hooks/useGetColonyAction.ts'; + +export interface FinalizeStepProps { + startPollingAction: (pollingInterval: number) => void; + stopPollingAction: () => void; + refetchAction: RefetchAction; + actionData: MotionAction; + motionState?: MotionState; +} + +export enum FinalizeStepSections { + Finalize = 'finalizeStep', +} + +export enum WinningsItems { + Staked = 'staked', + Winnings = 'winnings', + Total = 'total', + Completed = 'completed', +} diff --git a/src/i18n/en.json b/src/i18n/en.json index 24e0274f6e..e76a25d5e5 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -1465,18 +1465,23 @@ "motion.staking.accordion.title.hide": "Hide staking information", "motion.finalize.label": "Finalize", "motion.finalizeStep.statusText": "Finalize to execute the agreed transactions and return stakes.", - "motion.finalizeStep.finalizeAgreement": "Agreement process is complete and stakes have been returned.", - "motion.finalizeStep.claimable.finalizeAgreement": "Agreement process is complete, finalize to return stakes.", + "motion.finalizeStep.finalizeAgreement.failed": "Agreement has failed and now is complete.", + "motion.finalizeStep.finalizeAgreement.supported": "Agreement has passed and now is complete.", + "motion.finalizeStep.claimable.finalizeAgreement.failed": "Agreement has failed, stakes can be claimed.", + "motion.finalizeStep.claimable.finalizeAgreement.passed": "Agreement has passed, stakes can be claimed.", "motion.finalizeStep.completedStatusText": "Action has passed and is now complete.", "motion.finalizeStep.claimable.statusText": "Action has passed and has been executed.", - "motion.finalizeStep.title": "Your overview", + "motion.finalizeStep.title": "Overview", "motion.finalizeStep.failedNotAchieving.statusText": "Action failed due to not achieving required stake.", + "motion.finalizeStep.complete.statusText": "Action has passed and is now complete.", "motion.finalizeStep.failed.statusText": "Action failed and cannot be executed.", "motion.finalizeStep.passedAction": "Action has passed and can be executed.", "motion.finalizeStep.opposedAction": "Action was opposed and cannot be executed.", "motion.finalizeStep.staked": "Your stake", "motion.finalizeStep.winnings": "Your reward", "motion.finalizeStep.total": "Total", + "motion.finalizeStep.completed": "Completed", + "motion.finalizeStep.completedAt": "{date} at {hour}", "motion.finalizeStep.submit": "Finalize", "motion.finalizeStep.returnStakes": "Return stakes", "motion.finalizeStep.transactions.remaining": "{transactions} transactions remaining", From 5f325ca84ce3da7ae9ff220d0ac8aefd0efebfef Mon Sep 17 00:00:00 2001 From: strzelec Date: Wed, 22 Jan 2025 16:29:02 +0100 Subject: [PATCH 6/7] fix: add claim button for not supported actions --- .../partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx | 2 +- src/redux/sagas/motions/claimMotionRewards.ts | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx index ab78a8339e..4de9d62d01 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/FinalizeStep.tsx @@ -144,7 +144,7 @@ const FinalizeStep: FC = ({ !isMotionFailedNotFinalizable && !isMotionFinalized && !isMotionAgreement; const showClaimButton = - (isMotionClaimable && canClaimStakes && !isClaimed) || + (isMotionClaimable && canClaimStakes && !isClaimed && hasUserStake) || (isMotionAgreement && isAgreementClaimable && hasUserStake && !isClaimed); const canBeExecuted = !isPolling && diff --git a/src/redux/sagas/motions/claimMotionRewards.ts b/src/redux/sagas/motions/claimMotionRewards.ts index cce97fbdf6..0a7d66bcb1 100644 --- a/src/redux/sagas/motions/claimMotionRewards.ts +++ b/src/redux/sagas/motions/claimMotionRewards.ts @@ -79,10 +79,6 @@ function* claimMotionRewards({ const hasYayStake = !BigNumber.from(yayStake).isZero(); const hasNayStake = !BigNumber.from(nayStake).isZero(); - if (!hasYayStake && !hasNayStake) { - throw new Error('A motion with claims needs to be provided'); - } - const YAY_ID = 'yayClaim'; const NAY_ID = 'nayClaim'; From a14c2121079eb732e8acf020e4e8fa82f1ce76ff Mon Sep 17 00:00:00 2001 From: strzelec Date: Fri, 7 Feb 2025 10:55:21 +0100 Subject: [PATCH 7/7] fix: rebase --- .../partials/Motions/MotionStep/FinalizeStep/hooks.tsx | 2 +- .../partials/Motions/MotionStep/FinalizeStep/types.ts | 1 + .../partials/Motions/steps/FinalizeStep/types.ts | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx index 983e4a9d3a..0f78805c17 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/hooks.tsx @@ -149,7 +149,7 @@ export const useClaimConfig = ({ } return userReward.amount; - }, [userAddress, voterRewards]); + }, [userAddress, voterRewards, userReward]); const userTotalStake = useMemo( () => diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/types.ts b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/types.ts index a7ad13339d..24247f0cc1 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/types.ts +++ b/src/components/v5/common/ActionSidebar/partials/Motions/MotionStep/FinalizeStep/types.ts @@ -13,4 +13,5 @@ export enum WinningsItems { Staked = 'staked', Winnings = 'winnings', Total = 'total', + Completed = 'completed', } diff --git a/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts b/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts index 8b8ff5d605..e7606beb0b 100644 --- a/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts +++ b/src/components/v5/common/ActionSidebar/partials/Motions/steps/FinalizeStep/types.ts @@ -1,4 +1,4 @@ -import { type MotionAction } from '~types/motions.ts'; +import { type ColonyActionFragment } from '~gql'; import { type MotionState } from '~utils/colonyMotions.ts'; import { type RefetchAction } from '~v5/common/ActionSidebar/hooks/useGetColonyAction.ts'; @@ -6,7 +6,7 @@ export interface FinalizeStepProps { startPollingAction: (pollingInterval: number) => void; stopPollingAction: () => void; refetchAction: RefetchAction; - actionData: MotionAction; + actionData: ColonyActionFragment; motionState?: MotionState; }