From 058b8be07196628d3b1385ab131929ede71fc915 Mon Sep 17 00:00:00 2001 From: devchenyan Date: Thu, 23 May 2024 16:06:18 +0800 Subject: [PATCH 1/4] feat: Consolidate Cells --- .../src/components/CellManagement/hooks.ts | 28 ++++++++++++++++--- .../src/components/CellManagement/index.tsx | 16 ++++++++++- .../neuron-ui/src/components/Send/index.tsx | 6 +++- packages/neuron-ui/src/locales/en.json | 7 ++++- packages/neuron-ui/src/locales/es.json | 7 ++++- packages/neuron-ui/src/locales/fr.json | 7 ++++- packages/neuron-ui/src/locales/zh-tw.json | 7 ++++- packages/neuron-ui/src/locales/zh.json | 7 ++++- .../src/widgets/Icons/Consolidate.svg | 4 +++ packages/neuron-ui/src/widgets/Icons/icon.tsx | 2 ++ 10 files changed, 80 insertions(+), 11 deletions(-) create mode 100644 packages/neuron-ui/src/widgets/Icons/Consolidate.svg diff --git a/packages/neuron-ui/src/components/CellManagement/hooks.ts b/packages/neuron-ui/src/components/CellManagement/hooks.ts index e38c6cec29..c3592cba5b 100644 --- a/packages/neuron-ui/src/components/CellManagement/hooks.ts +++ b/packages/neuron-ui/src/components/CellManagement/hooks.ts @@ -202,6 +202,7 @@ export enum Actions { Lock = 'lock', Unlock = 'unlock', Consume = 'consume', + Consolidate = 'consolidate', } export const useAction = ({ @@ -213,6 +214,7 @@ export const useAction = ({ setError, password, verifyDeviceStatus, + wallet, }: { liveCells: State.LiveCellWithLocalInfo[] currentPageLiveCells: State.LiveCellWithLocalInfo[] @@ -222,6 +224,7 @@ export const useAction = ({ setError: (error: string) => void password: string verifyDeviceStatus: () => Promise + wallet: State.Wallet }) => { const dispatch = useDispatch() const navigate = useNavigate() @@ -253,10 +256,20 @@ export const useAction = ({ }, [liveCells, selectedOutPoints, setOperateCells, dispatch, navigate] ) + + const getToAddress = useCallback(() => { + const { addresses } = wallet + const isSingleAddress = addresses.length === 1 + if (isSingleAddress) { + return addresses[0].address + } + return addresses.find(a => a.type === 0 && a.txCount === 0)?.address ?? '' + }, [wallet]) + const onActionConfirm = useCallback(async () => { switch (action) { - case 'lock': - case 'unlock': + case Actions.Lock: + case Actions.Unlock: if (!(await verifyDeviceStatus())) return setLoading(true) updateLiveCellsLockStatus({ @@ -276,17 +289,24 @@ export const useAction = ({ setLoading(false) }) break - case 'consume': + case Actions.Consume: dispatch({ type: AppActions.UpdateConsumeCells, payload: operateCells.map(v => ({ outPoint: v.outPoint, capacity: v.capacity })), }) navigate(`${RoutePath.Send}?isSendMax=true`) break + case Actions.Consolidate: + dispatch({ + type: AppActions.UpdateConsumeCells, + payload: operateCells.map(v => ({ outPoint: v.outPoint, capacity: v.capacity })), + }) + navigate(`${RoutePath.Send}?isSendMax=true&toAddress=${getToAddress()}`) + break default: break } - }, [action, operateCells, dispatch, navigate, password]) + }, [action, operateCells, dispatch, navigate, password, getToAddress]) const onActionCancel = useCallback(() => { setAction(undefined) setOperateCells([]) diff --git a/packages/neuron-ui/src/components/CellManagement/index.tsx b/packages/neuron-ui/src/components/CellManagement/index.tsx index 48f94566e2..15ab0eb53e 100644 --- a/packages/neuron-ui/src/components/CellManagement/index.tsx +++ b/packages/neuron-ui/src/components/CellManagement/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo, useState } from 'react' -import { Attention, Consume, DetailIcon, EyesClose, EyesOpen, LockCell, UnLock } from 'widgets/Icons/icon' +import { Attention, Consume, DetailIcon, EyesClose, EyesOpen, LockCell, UnLock, Consolidate } from 'widgets/Icons/icon' import PageContainer from 'components/PageContainer' import { useTranslation } from 'react-i18next' import Breadcrum from 'widgets/Breadcrum' @@ -265,6 +265,7 @@ const CellManagement = () => { resetPassword, password, verifyDeviceStatus, + wallet, }) const columns = useMemo( () => @@ -331,6 +332,10 @@ const CellManagement = () => { {t('cell-manage.consume')} + ) : null} @@ -432,6 +437,15 @@ const CellManagement = () => { > {t('cell-manage.cell-consume-dialog.warn-consume')} + + {t('cell-manage.cell-consolidate-dialog.warn-consume')} + ) } diff --git a/packages/neuron-ui/src/components/Send/index.tsx b/packages/neuron-ui/src/components/Send/index.tsx index c6c7a5563a..bd07c07473 100644 --- a/packages/neuron-ui/src/components/Send/index.tsx +++ b/packages/neuron-ui/src/components/Send/index.tsx @@ -109,8 +109,12 @@ const Send = () => { if (searchParams.get('isSendMax')) { updateIsSendMax(true) } + const toAddress = searchParams.get('toAddress') + if (toAddress) { + updateTransactionOutput('address')(0)(toAddress) + } // only when router change init send max - }, [searchParams, updateIsSendMax]) + }, [searchParams, updateIsSendMax, updateTransactionOutput]) const [locktimeIndex, setLocktimeIndex] = useState(-1) diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index 2a90be36e6..58af85241d 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -1269,12 +1269,17 @@ "title": "Consume Cell", "warn-consume": "Consume cell will not keep any data and use all of the ckb, please ensure that no important data needs to be retained" }, + "cell-consolidate-dialog": { + "title": "Consolidate Cells", + "warn-consume": "All selected cells will be consolidated into a new cell, make sure that no cells containing important data are selected." + }, "enter-password": "Enter Password", "password-placeholder": "Please input wallet password", "lock": "Lock", "unlock": "Unlock", "consume": "Consume", - "verify": "Verify" + "verify": "Verify", + "consolidate": "Consolidate" }, "send-tx-detail": { "page-title": "Transaction Detail", diff --git a/packages/neuron-ui/src/locales/es.json b/packages/neuron-ui/src/locales/es.json index 8c35cae3c0..6a28c8a3b4 100644 --- a/packages/neuron-ui/src/locales/es.json +++ b/packages/neuron-ui/src/locales/es.json @@ -1249,12 +1249,17 @@ "title": "Consumir Cell", "warn-consume": "Al consumir la Cell, no se retendrá ningún dato y se utilizará todo el ckb, asegúrese de que no haya datos importantes que necesiten ser retenidos" }, + "cell-consolidate-dialog": { + "title": "Consolidar", + "warn-consume": " Todas las Cell seleccionadas se consolidarán en una nueva celda, asegúrese de que no haya datos importantes que necesiten ser retenidos" + }, "enter-password": "Ingresar Contraseña", "password-placeholder": "Ingrese la contraseña de la billetera", "lock": "Bloquear", "unlock": "Desbloquear", "consume": "Consumir", - "verify": "Verificar" + "verify": "Verificar", + "consolidate": "Consolidar" }, "send-tx-detail": { "page-title": "Detalles de la transacción", diff --git a/packages/neuron-ui/src/locales/fr.json b/packages/neuron-ui/src/locales/fr.json index ae9db42555..95a2a4fb6f 100644 --- a/packages/neuron-ui/src/locales/fr.json +++ b/packages/neuron-ui/src/locales/fr.json @@ -1259,12 +1259,17 @@ "title": "Consommer la cellule", "warn-consume": "La consommation de la cellule ne conservera aucune donnée et utilisera tout le CKB. Veuillez vous assurer qu'aucune donnée importante ne doit être conservée." }, + "cell-consolidate-dialog": { + "title": "Consolider", + "warn-consume": "Toutes les cellules sélectionnées seront consolidées dans une nouvelle cellule. Veuillez vous assurer qu'aucune donnée importante ne doit être conservée." + }, "enter-password": "Entrez le mot de passe", "password-placeholder": "Veuillez entrer le mot de passe du Wallet", "lock": "Verrouiller", "unlock": "Déverrouiller", "consume": "Consommer", - "verify": "Vérifier" + "verify": "Vérifier", + "consolidate": "Consolider" }, "send-tx-detail": { "page-title": "Détail de l'historique", diff --git a/packages/neuron-ui/src/locales/zh-tw.json b/packages/neuron-ui/src/locales/zh-tw.json index 76946f85f3..70c7010253 100644 --- a/packages/neuron-ui/src/locales/zh-tw.json +++ b/packages/neuron-ui/src/locales/zh-tw.json @@ -1258,12 +1258,17 @@ "title": "消耗 Cell", "warn-consume": "消耗Cell不會保留任何數據,並將花費全部的CKB,請確保沒有重要數據需要保留。" }, + "cell-consolidate-dialog": { + "title": "合並", + "warn-consume": "所有選中的Cell都將合並到一個新Cell中,請確保沒有重要數據需要保留。" + }, "enter-password": "輸入密碼", "password-placeholder": "請輸入錢包密碼", "lock": "鎖定", "unlock": "解鎖", "consume": "消耗", - "verify": "驗證" + "verify": "驗證", + "consolidate": "合並" }, "send-tx-detail": { "page-title": "交易詳情", diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index 55109b76e9..47efdf422e 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -1261,12 +1261,17 @@ "title": "消耗 Cell", "warn-consume": "消耗Cell不会保留任何数据,并将花费全部的CKB,请确保没有重要数据需要保留。" }, + "cell-consolidate-dialog": { + "title": "合并 Cells", + "warn-consume": "所有选中的Cell都将合并到一个新Cell中,请确保没有重要数据需要保留。" + }, "enter-password": "输入密码", "password-placeholder": "请输入钱包密码", "lock": "锁定", "unlock": "解锁", "consume": "消耗", - "verify": "验证" + "verify": "验证", + "consolidate": "合并" }, "send-tx-detail": { "page-title": "交易详情", diff --git a/packages/neuron-ui/src/widgets/Icons/Consolidate.svg b/packages/neuron-ui/src/widgets/Icons/Consolidate.svg new file mode 100644 index 0000000000..824e415519 --- /dev/null +++ b/packages/neuron-ui/src/widgets/Icons/Consolidate.svg @@ -0,0 +1,4 @@ + + + + diff --git a/packages/neuron-ui/src/widgets/Icons/icon.tsx b/packages/neuron-ui/src/widgets/Icons/icon.tsx index c8a1f9bd2e..131b0387c6 100644 --- a/packages/neuron-ui/src/widgets/Icons/icon.tsx +++ b/packages/neuron-ui/src/widgets/Icons/icon.tsx @@ -52,6 +52,7 @@ import { ReactComponent as LockSvg } from './Lock.svg' import { ReactComponent as LockCellSvg } from './LockCell.svg' import { ReactComponent as UnLockSvg } from './Unlock.svg' import { ReactComponent as ConsumeSvg } from './Consume.svg' +import { ReactComponent as ConsolidateSvg } from './Consolidate.svg' import { ReactComponent as DetectSvg } from './Detect.svg' import { ReactComponent as DeleteSvg } from './Delete.svg' import { ReactComponent as ImportKeystoreSvg } from './SoftWalletImportKeystore.svg' @@ -126,6 +127,7 @@ export const Lock = WrapSvg(LockSvg, styles.withTheme) export const LockCell = WrapSvg(LockCellSvg) export const UnLock = WrapSvg(UnLockSvg) export const Consume = WrapSvg(ConsumeSvg) +export const Consolidate = WrapSvg(ConsolidateSvg) export const Detect = WrapSvg(DetectSvg) export const Delete = WrapSvg(DeleteSvg) export const ImportKeystore = WrapSvg(ImportKeystoreSvg) From f80db4ecf424fe011dee9f002a9355d1998a0336 Mon Sep 17 00:00:00 2001 From: devchenyan Date: Wed, 29 May 2024 17:38:36 +0800 Subject: [PATCH 2/4] fix: comments --- .../src/components/CellManagement/hooks.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/neuron-ui/src/components/CellManagement/hooks.ts b/packages/neuron-ui/src/components/CellManagement/hooks.ts index c3592cba5b..f0a746c5cb 100644 --- a/packages/neuron-ui/src/components/CellManagement/hooks.ts +++ b/packages/neuron-ui/src/components/CellManagement/hooks.ts @@ -257,13 +257,14 @@ export const useAction = ({ [liveCells, selectedOutPoints, setOperateCells, dispatch, navigate] ) - const getToAddress = useCallback(() => { + const getConsolidateAddress = useCallback(() => { const { addresses } = wallet - const isSingleAddress = addresses.length === 1 - if (isSingleAddress) { + if (addresses.length === 1) { return addresses[0].address } - return addresses.find(a => a.type === 0 && a.txCount === 0)?.address ?? '' + const unusedReceiveAddress = addresses.find(a => a.type === 0 && a.txCount === 0)?.address ?? '' + + return unusedReceiveAddress }, [wallet]) const onActionConfirm = useCallback(async () => { @@ -301,12 +302,12 @@ export const useAction = ({ type: AppActions.UpdateConsumeCells, payload: operateCells.map(v => ({ outPoint: v.outPoint, capacity: v.capacity })), }) - navigate(`${RoutePath.Send}?isSendMax=true&toAddress=${getToAddress()}`) + navigate(`${RoutePath.Send}?isSendMax=true&toAddress=${getConsolidateAddress()}`) break default: break } - }, [action, operateCells, dispatch, navigate, password, getToAddress]) + }, [action, operateCells, dispatch, navigate, password, getConsolidateAddress]) const onActionCancel = useCallback(() => { setAction(undefined) setOperateCells([]) From 36cf7cc0af8f7d9e9aee52c5dfad0cc030b3ac72 Mon Sep 17 00:00:00 2001 From: devchenyan Date: Fri, 31 May 2024 01:17:10 +0800 Subject: [PATCH 3/4] fix: comments --- packages/neuron-ui/src/locales/en.json | 2 +- packages/neuron-ui/src/locales/es.json | 2 +- packages/neuron-ui/src/locales/fr.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index 58af85241d..111092eebd 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -1271,7 +1271,7 @@ }, "cell-consolidate-dialog": { "title": "Consolidate Cells", - "warn-consume": "All selected cells will be consolidated into a new cell, make sure that no cells containing important data are selected." + "warn-consume": "All selected cells will be consolidated into a new cell, make sure that selected cells do not contain important data." }, "enter-password": "Enter Password", "password-placeholder": "Please input wallet password", diff --git a/packages/neuron-ui/src/locales/es.json b/packages/neuron-ui/src/locales/es.json index 6a28c8a3b4..1b5f2a212d 100644 --- a/packages/neuron-ui/src/locales/es.json +++ b/packages/neuron-ui/src/locales/es.json @@ -1251,7 +1251,7 @@ }, "cell-consolidate-dialog": { "title": "Consolidar", - "warn-consume": " Todas las Cell seleccionadas se consolidarán en una nueva celda, asegúrese de que no haya datos importantes que necesiten ser retenidos" + "warn-consume": "Todas las celdas seleccionadas se consolidarán en una nueva celda, asegúrese de que las celdas seleccionadas no contienen datos importantes." }, "enter-password": "Ingresar Contraseña", "password-placeholder": "Ingrese la contraseña de la billetera", diff --git a/packages/neuron-ui/src/locales/fr.json b/packages/neuron-ui/src/locales/fr.json index 95a2a4fb6f..48bf1295f1 100644 --- a/packages/neuron-ui/src/locales/fr.json +++ b/packages/neuron-ui/src/locales/fr.json @@ -1261,7 +1261,7 @@ }, "cell-consolidate-dialog": { "title": "Consolider", - "warn-consume": "Toutes les cellules sélectionnées seront consolidées dans une nouvelle cellule. Veuillez vous assurer qu'aucune donnée importante ne doit être conservée." + "warn-consume": "Toutes les cellules sélectionnées seront consolidées dans une nouvelle cellule. Assurez-vous que les cellules sélectionnées ne contiennent pas de données importantes." }, "enter-password": "Entrez le mot de passe", "password-placeholder": "Veuillez entrer le mot de passe du Wallet", From 7c0d5611a8928aece985d68953aae405e9e9417d Mon Sep 17 00:00:00 2001 From: devchenyan Date: Thu, 6 Jun 2024 00:00:59 +0800 Subject: [PATCH 4/4] fix --- .../src/components/AmendSUDTSend/amendSUDTSend.module.scss | 1 + .../neuron-ui/src/components/AmendSend/amendSend.module.scss | 1 + packages/neuron-ui/src/components/SUDTSend/sUDTSend.module.scss | 1 + packages/neuron-ui/src/components/Send/send.module.scss | 1 + 4 files changed, 4 insertions(+) diff --git a/packages/neuron-ui/src/components/AmendSUDTSend/amendSUDTSend.module.scss b/packages/neuron-ui/src/components/AmendSUDTSend/amendSUDTSend.module.scss index 2ef4fcb512..8194ab6031 100644 --- a/packages/neuron-ui/src/components/AmendSUDTSend/amendSUDTSend.module.scss +++ b/packages/neuron-ui/src/components/AmendSUDTSend/amendSUDTSend.module.scss @@ -9,6 +9,7 @@ $noticeHeight: 60px; .left { flex: 1; position: relative; + min-width: 480px; .addressCell { margin-bottom: 10px; diff --git a/packages/neuron-ui/src/components/AmendSend/amendSend.module.scss b/packages/neuron-ui/src/components/AmendSend/amendSend.module.scss index 58bd47f31f..0b823d03ec 100644 --- a/packages/neuron-ui/src/components/AmendSend/amendSend.module.scss +++ b/packages/neuron-ui/src/components/AmendSend/amendSend.module.scss @@ -9,6 +9,7 @@ $noticeHeight: 60px; .left { flex: 1; position: relative; + min-width: 480px; .addressCell { margin-bottom: 10px; diff --git a/packages/neuron-ui/src/components/SUDTSend/sUDTSend.module.scss b/packages/neuron-ui/src/components/SUDTSend/sUDTSend.module.scss index 0df08c4cff..faf2e957f4 100644 --- a/packages/neuron-ui/src/components/SUDTSend/sUDTSend.module.scss +++ b/packages/neuron-ui/src/components/SUDTSend/sUDTSend.module.scss @@ -27,6 +27,7 @@ $right-min-width: 476px; .left { flex: 1; + min-width: 480px; position: relative; max-width: calc(100% - $right-min-width); diff --git a/packages/neuron-ui/src/components/Send/send.module.scss b/packages/neuron-ui/src/components/Send/send.module.scss index cd0952d1e1..2bdcde3830 100644 --- a/packages/neuron-ui/src/components/Send/send.module.scss +++ b/packages/neuron-ui/src/components/Send/send.module.scss @@ -9,6 +9,7 @@ $noticeHeight: 60px; .left { flex: 1; position: relative; + min-width: 480px; .leftFooter { position: absolute;