From 5762905a8cc4d2e737f532a09ba2504c7d7961df Mon Sep 17 00:00:00 2001 From: Lucas Werey <73439207+LucasWerey@users.noreply.github.com> Date: Fri, 13 Sep 2024 11:53:35 +0200 Subject: [PATCH] :bug:fix(lld): fix export to csv account name (#7813) --- .changeset/thick-glasses-swim.md | 6 ++++ .../modals/ExportOperations/index.tsx | 8 +++-- libs/ledger-live-common/src/csvExport.ts | 31 ++++++++++++++----- 3 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 .changeset/thick-glasses-swim.md diff --git a/.changeset/thick-glasses-swim.md b/.changeset/thick-glasses-swim.md new file mode 100644 index 00000000000..8f5b5262fdd --- /dev/null +++ b/.changeset/thick-glasses-swim.md @@ -0,0 +1,6 @@ +--- +"ledger-live-desktop": patch +"@ledgerhq/live-common": patch +--- + +fix issue following CVS migration. The export didn't include account name diff --git a/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx b/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx index f0409db25fb..fe4aefa0b2d 100644 --- a/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/modals/ExportOperations/index.tsx @@ -1,7 +1,7 @@ import { ipcRenderer } from "electron"; import React, { memo, useState, useCallback } from "react"; import { Trans } from "react-i18next"; -import { connect } from "react-redux"; +import { connect, useSelector } from "react-redux"; import styled from "styled-components"; import { createStructuredSelector } from "reselect"; import { useCountervaluesState } from "@ledgerhq/live-countervalues-react"; @@ -23,6 +23,7 @@ import IconCheckCircle from "~/renderer/icons/CheckCircle"; import Alert from "~/renderer/components/Alert"; import { ModalData } from "../types"; import { useTechnicalDateFn } from "~/renderer/hooks/useDateFormatter"; +import { walletSelector } from "~/renderer/reducers/wallet"; type OwnProps = {}; type Props = OwnProps & { @@ -57,6 +58,8 @@ function ExportOperations({ accounts, closeModal, countervalueCurrency }: Props) const [success, setSuccess] = useState(false); const countervalueState = useCountervaluesState(); const getDateTxt = useTechnicalDateFn(); + const walletState = useSelector(walletSelector); + const exportCsv = useCallback(async () => { const path = await ipcRenderer.invoke("show-save-dialog", { title: "Exported account transactions", @@ -75,13 +78,14 @@ function ExportOperations({ accounts, closeModal, countervalueCurrency }: Props) accounts.filter(account => checkedIds.includes(account.id)), countervalueCurrency, countervalueState, + walletState, ), () => { setSuccess(true); }, ); } - }, [accounts, checkedIds, countervalueCurrency, countervalueState, getDateTxt]); + }, [accounts, checkedIds, countervalueCurrency, countervalueState, getDateTxt, walletState]); const onClose = useCallback(() => closeModal("MODAL_EXPORT_OPERATIONS"), [closeModal]); const handleButtonClick = useCallback(() => { let exporting = false; diff --git a/libs/ledger-live-common/src/csvExport.ts b/libs/ledger-live-common/src/csvExport.ts index a7a348bc881..ecf8eb70801 100644 --- a/libs/ledger-live-common/src/csvExport.ts +++ b/libs/ledger-live-common/src/csvExport.ts @@ -7,6 +7,7 @@ import { calculate } from "@ledgerhq/live-countervalues/logic"; import type { CounterValuesState } from "@ledgerhq/live-countervalues/types"; import type { Currency } from "@ledgerhq/types-cryptoassets"; import { getDefaultAccountName } from "@ledgerhq/live-wallet/accountName"; +import { WalletState, accountNameWithDefaultSelector } from "@ledgerhq/live-wallet/store"; type Field = { title: string; @@ -16,6 +17,7 @@ type Field = { arg2: Operation, arg3: Currency | null | undefined, arg4: CounterValuesState | null | undefined, + arg5: WalletState | null | undefined, ) => string; }; @@ -64,8 +66,10 @@ const fields: Field[] = [ }, { title: "Account Name", - // FIXME: we need to inject wallet state if we want the actual user's account name - cell: (account, parentAccount) => getDefaultAccountName(getMainAccount(account, parentAccount)), + cell: (account, parentAccount, _op, _counterValueCurrency, _countervalueState, walletState) => + walletState + ? accountNameWithDefaultSelector(walletState, account) + : getDefaultAccountName(getMainAccount(account, parentAccount)), }, { title: "Account xpub", @@ -128,12 +132,20 @@ const accountRows = ( parentAccount: Account | null | undefined, counterValueCurrency?: Currency, countervalueState?: CounterValuesState, + walletState?: WalletState, ): Array => account.operations .reduce((ops: Operation[], op) => ops.concat(flattenOperationWithInternalsAndNfts(op)), []) .map(operation => fields.map(field => - field.cell(account, parentAccount, operation, counterValueCurrency, countervalueState), + field.cell( + account, + parentAccount, + operation, + counterValueCurrency, + countervalueState, + walletState, + ), ), ); @@ -141,20 +153,25 @@ const accountsRows = ( accounts: Account[], counterValueCurrency?: Currency, countervalueState?: CounterValuesState, -): Array => - flattenAccounts(accounts).reduce((all: Array, account) => { + walletState?: WalletState, +): Array => { + return flattenAccounts(accounts).reduce((all: Array, account) => { const parentAccount = account.type !== "Account" ? accounts.find(a => a.id === account.parentId) : null; - return all.concat(accountRows(account, parentAccount, counterValueCurrency, countervalueState)); + return all.concat( + accountRows(account, parentAccount, counterValueCurrency, countervalueState, walletState), + ); }, []); +}; export const accountsOpToCSV = ( accounts: Account[], counterValueCurrency?: Currency, countervalueState?: CounterValuesState, // cvs state required for countervalues export + walletState?: WalletState, // wallet state required for account name ): string => fields.map(field => field.title).join(",") + newLine + - accountsRows(accounts, counterValueCurrency, countervalueState) + accountsRows(accounts, counterValueCurrency, countervalueState, walletState) .map(row => row.map(value => value.replace(/[,\n\r]/g, "")).join(",")) .join(newLine);