Add minting translations

This commit is contained in:
Nicola Benaglia 2025-05-13 06:39:29 +02:00
parent 452c3a0894
commit 9adddce9fc
3 changed files with 132 additions and 65 deletions

View File

@ -27,6 +27,7 @@ import { FidgetSpinner } from 'react-loader-spinner';
import { useModal } from '../../common/useModal'; import { useModal } from '../../common/useModal';
import { useAtom, useSetAtom } from 'jotai'; import { useAtom, useSetAtom } from 'jotai';
import { memberGroupsAtom, txListAtom } from '../../atoms/global'; import { memberGroupsAtom, txListAtom } from '../../atoms/global';
import { useTranslation } from 'react-i18next';
export const Minting = ({ setIsOpenMinting, myAddress, show }) => { export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
const setTxList = useSetAtom(txListAtom); const setTxList = useSetAtom(txListAtom);
@ -44,7 +45,7 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
const { show: showKey, message } = useModal(); const { show: showKey, message } = useModal();
const { isShow: isShowNext, onOk, show: showNext } = useModal(); const { isShow: isShowNext, onOk, show: showNext } = useModal();
const theme = useTheme(); const theme = useTheme();
const { t } = useTranslation(['core', 'auth', 'group']);
const [info, setInfo] = useState(null); const [info, setInfo] = useState(null);
const [names, setNames] = useState({}); const [names, setNames] = useState({});
const [accountInfos, setAccountInfos] = useState({}); const [accountInfos, setAccountInfos] = useState({});
@ -223,13 +224,21 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
rej({ message: response.error }); rej({ message: response.error });
}) })
.catch((error) => { .catch((error) => {
rej({ message: error.message || 'An error occurred' }); rej({
message:
error.message ||
t('core:message.error.generic', { postProcess: 'capitalize' }),
});
}); });
}); });
} catch (error) { } catch (error) {
setInfo({ setInfo({
type: 'error', type: 'error',
message: error?.message || 'Unable to add minting account', message:
error?.message ||
t('core:message.error.minting_account_add', {
postProcess: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
} finally { } finally {
@ -263,13 +272,21 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
rej({ message: response.error }); rej({ message: response.error });
}) })
.catch((error) => { .catch((error) => {
rej({ message: error.message || 'An error occurred' }); rej({
message:
error.message ||
t('core:message.error.generic', { postProcess: 'capitalize' }),
});
}); });
}); });
} catch (error) { } catch (error) {
setInfo({ setInfo({
type: 'error', type: 'error',
message: error?.message || 'Unable to remove minting account', message:
error?.message ||
t('core:message.error.minting_account_remove', {
postProcess: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
} finally { } finally {
@ -278,9 +295,13 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
}, []); }, []);
const createRewardShare = useCallback(async (publicKey, recipient) => { const createRewardShare = useCallback(async (publicKey, recipient) => {
const fee = await getFee('REWARD_SHARE'); // TODO translate const fee = await getFee('REWARD_SHARE');
await show({ 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', publishFee: fee.fee + ' QORT',
}); });
return await new Promise((res, rej) => { return await new Promise((res, rej) => {
@ -295,8 +316,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
recipient, recipient,
...response, ...response,
type: 'add-rewardShare', type: 'add-rewardShare',
label: `Add rewardshare: awaiting confirmation`, label: t('group:message.success.rewardshare_add', {
labelDone: `Add rewardshare: success!`, postProcess: 'capitalize',
}),
labelDone: t('group:message.success.rewardshare_add_label', {
postProcess: 'capitalize',
}),
done: false, done: false,
}, },
...prev, ...prev,
@ -307,7 +332,11 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
rej({ message: response.error }); rej({ message: response.error });
}) })
.catch((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 }); rej({ message: response.error });
}) })
.catch((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 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 () => { const startMinting = async () => {
@ -382,7 +417,11 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
setShowWaitDialog(false); setShowWaitDialog(false);
setInfo({ setInfo({
type: 'error', type: 'error',
message: error?.message || 'Unable to start minting', message:
error?.message ||
t('group:message.error.unable_minting', {
postProcess: 'capitalize',
}),
}); });
setOpenSnack(true); setOpenSnack(true);
} finally { } finally {
@ -420,8 +459,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
...rewardShare, ...rewardShare,
...response, ...response,
type: 'remove-rewardShare', type: 'remove-rewardShare',
label: `Remove rewardshare: awaiting confirmation`, label: t('group:message.success.rewardshare_remove', {
labelDone: `Remove rewardshare: success!`, postProcess: 'capitalize',
}),
labelDone: t('group:message.success.rewardshare_remove_label', {
postProcess: 'capitalize',
}),
done: false, done: false,
}, },
...prev, ...prev,
@ -431,59 +474,65 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
rej({ message: response.error }); rej({ message: response.error });
}) })
.catch((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) => { // TODO unused functions. Remove??
try {
setIsLoading(true);
const privateRewardShare = await removeRewardShare(rewardShare); // const handleRemoveRewardShare = async (rewardShare) => {
} catch (error) { // try {
setInfo({ // setIsLoading(true);
type: 'error',
message: error?.message || 'Unable to remove reward share',
});
setOpenSnack(true);
} finally {
setIsLoading(false);
}
};
const createRewardShareForPotentialMinter = async (receiver) => { // const privateRewardShare = await removeRewardShare(rewardShare);
try { // } catch (error) {
setIsLoading(true); // setInfo({
const confirmReceiver = await getNameOrAddress(receiver); // type: 'error',
if (confirmReceiver.error) // message: error?.message || 'Unable to remove reward share',
throw new Error('Invalid receiver address or name'); // });
const isInMinterGroup = await checkIfMinterGroup(confirmReceiver); // setOpenSnack(true);
if (!isInMinterGroup) throw new Error('Account not in Minter Group'); // } finally {
const publicKey = await getPublicKeyFromAddress(confirmReceiver); // setIsLoading(false);
const findRewardShare = rewardShares?.find( // }
(item) => // };
item?.recipient === confirmReceiver &&
item?.mintingAccount === myAddress // const createRewardShareForPotentialMinter = async (receiver) => {
); // try {
if (findRewardShare) { // setIsLoading(true);
const privateRewardShare = await getRewardSharePrivateKey(publicKey); // const confirmReceiver = await getNameOrAddress(receiver);
setRewardsharekey(privateRewardShare); // if (confirmReceiver.error)
} else { // throw new Error('Invalid receiver address or name');
await createRewardShare(publicKey, confirmReceiver); // const isInMinterGroup = await checkIfMinterGroup(confirmReceiver);
const privateRewardShare = await getRewardSharePrivateKey(publicKey); // if (!isInMinterGroup) throw new Error('Account not in Minter Group');
setRewardsharekey(privateRewardShare); // const publicKey = await getPublicKeyFromAddress(confirmReceiver);
} // const findRewardShare = rewardShares?.find(
} catch (error) { // (item) =>
setInfo({ // item?.recipient === confirmReceiver &&
type: 'error', // item?.mintingAccount === myAddress
message: error?.message || 'Unable to create reward share', // );
}); // if (findRewardShare) {
setOpenSnack(true); // const privateRewardShare = await getRewardSharePrivateKey(publicKey);
} finally { // setRewardsharekey(privateRewardShare);
setIsLoading(false); // } 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(() => { useEffect(() => {
getNodeInfos(); getNodeInfos();
@ -558,7 +607,12 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
}, },
}} }}
> >
<DialogTitle id="alert-dialog-title">{'Manage your minting'}</DialogTitle> <DialogTitle id="alert-dialog-title">
{t('group:message.generic.manage_minting', {
postProcess: 'capitalize',
})}
</DialogTitle>
<IconButton <IconButton
sx={{ sx={{
position: 'absolute', position: 'absolute',
@ -604,7 +658,7 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
sx={{ sx={{
backgroundColor: theme.palette.background.default, backgroundColor: theme.palette.background.default,
padding: '10px', padding: '10px',
}} }} // TODO translate
> >
<Typography>Account: {handleNames(accountInfo?.address)}</Typography> <Typography>Account: {handleNames(accountInfo?.address)}</Typography>
@ -618,7 +672,9 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
This node is minting: {nodeInfos?.isMintingPossible?.toString()} This node is minting: {nodeInfos?.isMintingPossible?.toString()}
</Typography> </Typography>
</Card> </Card>
<Spacer height="10px" /> <Spacer height="10px" />
{isPartOfMintingGroup && !accountIsMinting && ( {isPartOfMintingGroup && !accountIsMinting && (
<Box <Box
sx={{ sx={{
@ -660,7 +716,9 @@ export const Minting = ({ setIsOpenMinting, myAddress, show }) => {
)} )}
</Box> </Box>
)} )}
<Spacer height="10px" /> <Spacer height="10px" />
{mintingAccounts?.length > 0 && ( {mintingAccounts?.length > 0 && (
<Typography>Node's minting accounts</Typography> <Typography>Node's minting accounts</Typography>
)} )}

View File

@ -67,6 +67,8 @@
"error": { "error": {
"generic": "an error occurred", "generic": "an error occurred",
"incorrect_password": "incorrect password", "incorrect_password": "incorrect password",
"minting_account_add": "unable to add minting account",
"minting_account_remove": "unable to remove minting account",
"missing_field": "missing: {{ field }}", "missing_field": "missing: {{ field }}",
"save_qdn": "unable to save to QDN" "save_qdn": "unable to save to QDN"
}, },

View File

@ -62,6 +62,7 @@
"latest_promotion": "only the latest promotion from the week will be shown for your group.", "latest_promotion": "only the latest promotion from the week will be shown for your group.",
"loading_members": "loading member list with names... please wait.", "loading_members": "loading member list with names... please wait.",
"max_chars": " Max 200 characters. Publish Fee", "max_chars": " Max 200 characters. Publish Fee",
"manage_minting": "manage your minting",
"no_display": "nothing to display", "no_display": "nothing to display",
"no_selection": "no group selected", "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.", "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", "group_secret_key": "cannot get group secret key",
"name_required": "please provide a name", "name_required": "please provide a name",
"notify_admins": "try notifying an admin from the list of admins below:", "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": { "success": {
"group_ban": "successfully banned member from group. It may take a couple of minutes for the changes to propagate", "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", "invitation_request": "accepted join request: awaiting confirmation",
"loading_threads": "loading threads... please wait.", "loading_threads": "loading threads... please wait.",
"post_creation": "successfully created post. It may take some time for the publish to propagate", "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", "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", "unbanned_user": "successfully unbanned user. It may take a couple of minutes for the changes to propagate",
"user_joined": "user successfully joined!" "user_joined": "user successfully joined!"