diff --git a/src/components/Minting/Minting.tsx b/src/components/Minting/Minting.tsx index fe05c5b..c84ffdb 100644 --- a/src/components/Minting/Minting.tsx +++ b/src/components/Minting/Minting.tsx @@ -27,6 +27,7 @@ import { FidgetSpinner } from 'react-loader-spinner'; import { useModal } from '../../common/useModal'; import { useAtom, useSetAtom } from 'jotai'; import { memberGroupsAtom, txListAtom } from '../../atoms/global'; +import { useTranslation } from 'react-i18next'; export const Minting = ({ setIsOpenMinting, myAddress, show }) => { const setTxList = useSetAtom(txListAtom); @@ -44,7 +45,7 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { const { show: showKey, message } = useModal(); const { isShow: isShowNext, onOk, show: showNext } = useModal(); const theme = useTheme(); - + const { t } = useTranslation(['core', 'auth', 'group']); const [info, setInfo] = useState(null); const [names, setNames] = useState({}); const [accountInfos, setAccountInfos] = useState({}); @@ -223,13 +224,21 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ + message: + error.message || + t('core:message.error.generic', { postProcess: 'capitalize' }), + }); }); }); } catch (error) { setInfo({ type: 'error', - message: error?.message || 'Unable to add minting account', + message: + error?.message || + t('core:message.error.minting_account_add', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } finally { @@ -263,13 +272,21 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ + message: + error.message || + t('core:message.error.generic', { postProcess: 'capitalize' }), + }); }); }); } catch (error) { setInfo({ type: 'error', - message: error?.message || 'Unable to remove minting account', + message: + error?.message || + t('core:message.error.minting_account_remove', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } finally { @@ -278,9 +295,13 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { }, []); const createRewardShare = useCallback(async (publicKey, recipient) => { - const fee = await getFee('REWARD_SHARE'); // TODO translate + const fee = await getFee('REWARD_SHARE'); await show({ - message: 'Would you like to perform an REWARD_SHARE transaction?', + message: t('group:question.perform_transaction', { + // TODO move from group into core namespace + action: 'REWARD_SHARE', + postProcess: 'capitalize', + }), publishFee: fee.fee + ' QORT', }); return await new Promise((res, rej) => { @@ -295,8 +316,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { recipient, ...response, type: 'add-rewardShare', - label: `Add rewardshare: awaiting confirmation`, - labelDone: `Add rewardshare: success!`, + label: t('group:message.success.rewardshare_add', { + postProcess: 'capitalize', + }), + labelDone: t('group:message.success.rewardshare_add_label', { + postProcess: 'capitalize', + }), done: false, }, ...prev, @@ -307,7 +332,11 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ + message: + error.message || + t('core:message.error.generic', { postProcess: 'capitalize' }), + }); }); }); }, []); @@ -326,7 +355,11 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ + message: + error.message || + t('core:message.error.generic', { postProcess: 'capitalize' }), + }); }); }); }, []); @@ -350,7 +383,9 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { await sleep(pollingInterval); // Wait before the next poll } - throw new Error('Timeout waiting for reward share confirmation'); + throw new Error( + t('group:message.error.timeout_reward', { postProcess: 'capitalize' }) + ); }; const startMinting = async () => { @@ -382,7 +417,11 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { setShowWaitDialog(false); setInfo({ type: 'error', - message: error?.message || 'Unable to start minting', + message: + error?.message || + t('group:message.error.unable_minting', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } finally { @@ -420,8 +459,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { ...rewardShare, ...response, type: 'remove-rewardShare', - label: `Remove rewardshare: awaiting confirmation`, - labelDone: `Remove rewardshare: success!`, + label: t('group:message.success.rewardshare_remove', { + postProcess: 'capitalize', + }), + labelDone: t('group:message.success.rewardshare_remove_label', { + postProcess: 'capitalize', + }), done: false, }, ...prev, @@ -431,59 +474,65 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ + message: + error.message || + t('core:message.error.generic', { postProcess: 'capitalize' }), + }); }); }); }, []); - const handleRemoveRewardShare = async (rewardShare) => { - try { - setIsLoading(true); + // TODO unused functions. Remove?? - const privateRewardShare = await removeRewardShare(rewardShare); - } catch (error) { - setInfo({ - type: 'error', - message: error?.message || 'Unable to remove reward share', - }); - setOpenSnack(true); - } finally { - setIsLoading(false); - } - }; + // const handleRemoveRewardShare = async (rewardShare) => { + // try { + // setIsLoading(true); - const createRewardShareForPotentialMinter = async (receiver) => { - try { - setIsLoading(true); - const confirmReceiver = await getNameOrAddress(receiver); - if (confirmReceiver.error) - throw new Error('Invalid receiver address or name'); - const isInMinterGroup = await checkIfMinterGroup(confirmReceiver); - if (!isInMinterGroup) throw new Error('Account not in Minter Group'); - const publicKey = await getPublicKeyFromAddress(confirmReceiver); - const findRewardShare = rewardShares?.find( - (item) => - item?.recipient === confirmReceiver && - item?.mintingAccount === myAddress - ); - if (findRewardShare) { - const privateRewardShare = await getRewardSharePrivateKey(publicKey); - setRewardsharekey(privateRewardShare); - } else { - await createRewardShare(publicKey, confirmReceiver); - const privateRewardShare = await getRewardSharePrivateKey(publicKey); - setRewardsharekey(privateRewardShare); - } - } catch (error) { - setInfo({ - type: 'error', - message: error?.message || 'Unable to create reward share', - }); - setOpenSnack(true); - } finally { - setIsLoading(false); - } - }; + // const privateRewardShare = await removeRewardShare(rewardShare); + // } catch (error) { + // setInfo({ + // type: 'error', + // message: error?.message || 'Unable to remove reward share', + // }); + // setOpenSnack(true); + // } finally { + // setIsLoading(false); + // } + // }; + + // const createRewardShareForPotentialMinter = async (receiver) => { + // try { + // setIsLoading(true); + // const confirmReceiver = await getNameOrAddress(receiver); + // if (confirmReceiver.error) + // throw new Error('Invalid receiver address or name'); + // const isInMinterGroup = await checkIfMinterGroup(confirmReceiver); + // if (!isInMinterGroup) throw new Error('Account not in Minter Group'); + // const publicKey = await getPublicKeyFromAddress(confirmReceiver); + // const findRewardShare = rewardShares?.find( + // (item) => + // item?.recipient === confirmReceiver && + // item?.mintingAccount === myAddress + // ); + // if (findRewardShare) { + // const privateRewardShare = await getRewardSharePrivateKey(publicKey); + // setRewardsharekey(privateRewardShare); + // } else { + // await createRewardShare(publicKey, confirmReceiver); + // const privateRewardShare = await getRewardSharePrivateKey(publicKey); + // setRewardsharekey(privateRewardShare); + // } + // } catch (error) { + // setInfo({ + // type: 'error', + // message: error?.message || 'Unable to create reward share', + // }); + // setOpenSnack(true); + // } finally { + // setIsLoading(false); + // } + // }; useEffect(() => { getNodeInfos(); @@ -558,7 +607,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { }, }} > - {'Manage your minting'} + + {t('group:message.generic.manage_minting', { + postProcess: 'capitalize', + })} + + { sx={{ backgroundColor: theme.palette.background.default, padding: '10px', - }} + }} // TODO translate > Account: {handleNames(accountInfo?.address)} @@ -618,7 +672,9 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => { This node is minting: {nodeInfos?.isMintingPossible?.toString()} + + {isPartOfMintingGroup && !accountIsMinting && ( { )} )} + + {mintingAccounts?.length > 0 && ( Node's minting accounts )} diff --git a/src/i18n/locales/en/core.json b/src/i18n/locales/en/core.json index 41ff3c0..df7eb80 100644 --- a/src/i18n/locales/en/core.json +++ b/src/i18n/locales/en/core.json @@ -67,6 +67,8 @@ "error": { "generic": "an error occurred", "incorrect_password": "incorrect password", + "minting_account_add": "unable to add minting account", + "minting_account_remove": "unable to remove minting account", "missing_field": "missing: {{ field }}", "save_qdn": "unable to save to QDN" }, diff --git a/src/i18n/locales/en/group.json b/src/i18n/locales/en/group.json index 5e0db18..6e0c8c7 100644 --- a/src/i18n/locales/en/group.json +++ b/src/i18n/locales/en/group.json @@ -62,6 +62,7 @@ "latest_promotion": "only the latest promotion from the week will be shown for your group.", "loading_members": "loading member list with names... please wait.", "max_chars": " Max 200 characters. Publish Fee", + "manage_minting": "manage your minting", "no_display": "nothing to display", "no_selection": "no group selected", "not_part_group": "you are not part of the encrypted group of members. Wait until an admin re-encrypts the keys.", @@ -80,7 +81,9 @@ "group_secret_key": "cannot get group secret key", "name_required": "please provide a name", "notify_admins": "try notifying an admin from the list of admins below:", - "thread_id": "unable to locate thread Id" + "timeout_reward": "timeout waiting for reward share confirmation", + "thread_id": "unable to locate thread Id", + "unable_minting": "unable to start minting" }, "success": { "group_ban": "successfully banned member from group. It may take a couple of minutes for the changes to propagate", @@ -104,6 +107,10 @@ "invitation_request": "accepted join request: awaiting confirmation", "loading_threads": "loading threads... please wait.", "post_creation": "successfully created post. It may take some time for the publish to propagate", + "rewardshare_add": "add rewardshare: awaiting confirmation", + "rewardshare_add_label": "add rewardshare: success!", + "rewardshare_remove": "remove rewardshare: awaiting confirmation", + "rewardshare_remove_label": "remove rewardshare: success!", "thread_creation": "successfully created thread. It may take some time for the publish to propagate", "unbanned_user": "successfully unbanned user. It may take a couple of minutes for the changes to propagate", "user_joined": "user successfully joined!"