From f581971f140a586d2ac7820fd4ebdc9057df54a7 Mon Sep 17 00:00:00 2001 From: lissavxo Date: Mon, 24 Mar 2025 16:04:03 -0300 Subject: [PATCH 1/8] feat: fromat numbers payments --- pages/payments/index.tsx | 5 +++-- redis/paymentCache.ts | 3 ++- redis/types.ts | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index 5d725a018..a2433c89f 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -11,7 +11,7 @@ import XECIcon from 'assets/xec-logo.png' import BCHIcon from 'assets/bch-logo.png' import EyeIcon from 'assets/eye-icon.png' import { formatQuoteValue, compareNumericString, removeUnserializableFields } from 'utils/index' -import { XEC_NETWORK_ID, BCH_TX_EXPLORER_URL, XEC_TX_EXPLORER_URL, NETWORK_TICKERS_FROM_ID } from 'constants/index' +import { XEC_NETWORK_ID, BCH_TX_EXPLORER_URL, XEC_TX_EXPLORER_URL, NETWORK_TICKERS_FROM_ID, DECIMALS } from 'constants/index' import moment from 'moment-timezone' import TopBar from 'components/TopBar' import { fetchUserWithSupertokens, UserWithSupertokens } from 'services/userService' @@ -147,7 +147,8 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac accessor: 'values', sortType: compareNumericString, Cell: (cellProps) => { - return
{cellProps.cell.value.amount} (${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)})
+ const networkTicker = NETWORK_TICKERS_FROM_ID[cellProps.cell.row.values.networkId] + return
{Number(cellProps.cell.value.amount).toFixed(DECIMALS[networkTicker])}(${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)})
} }, { diff --git a/redis/paymentCache.ts b/redis/paymentCache.ts index 0aa8d6d8d..6f85c4102 100755 --- a/redis/paymentCache.ts +++ b/redis/paymentCache.ts @@ -83,7 +83,8 @@ export const generatePaymentFromTx = async (tx: TransactionsWithPaybuttonsAndPri timestamp: tx.timestamp, values: { values, - amount: tx.amount + amount: tx.amount, + networkId: tx.address.networkId }, networkId: tx.address.networkId, hash: tx.hash, diff --git a/redis/types.ts b/redis/types.ts index 4abbfb1b4..0238e5809 100644 --- a/redis/types.ts +++ b/redis/types.ts @@ -49,6 +49,7 @@ export interface ButtonDisplayData { export interface AmountData { values: QuoteValues amount: Decimal + networkId?: number } export interface Payment { From 7b8714c308b7e80c54ccd43a1522812e9071994e Mon Sep 17 00:00:00 2001 From: lissavxo Date: Wed, 26 Mar 2025 15:46:07 -0300 Subject: [PATCH 2/8] feat: add value payments --- pages/payments/index.tsx | 14 ++++++++++++-- redis/paymentCache.ts | 4 ++++ redis/types.ts | 6 ++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index a2433c89f..052ee694c 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -144,11 +144,21 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac }, { Header: () => (
Amount
), + accessor: 'amount', + sortType: compareNumericString, + Cell: (cellProps) => { + const networkTicker = NETWORK_TICKERS_FROM_ID[cellProps.cell.value.networkId] + const amount = Number(cellProps.cell.value.amount).toFixed(DECIMALS[networkTicker]) + const formattedAmount = Number(amount).toLocaleString() + return
{formattedAmount}
+ } + }, + { + Header: () => (
Value
), accessor: 'values', sortType: compareNumericString, Cell: (cellProps) => { - const networkTicker = NETWORK_TICKERS_FROM_ID[cellProps.cell.row.values.networkId] - return
{Number(cellProps.cell.value.amount).toFixed(DECIMALS[networkTicker])}(${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)})
+ return
${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)}
} }, { diff --git a/redis/paymentCache.ts b/redis/paymentCache.ts index 6f85c4102..68b7b9f98 100755 --- a/redis/paymentCache.ts +++ b/redis/paymentCache.ts @@ -86,6 +86,10 @@ export const generatePaymentFromTx = async (tx: TransactionsWithPaybuttonsAndPri amount: tx.amount, networkId: tx.address.networkId }, + amount: { + amount: tx.amount, + networkId: tx.address.networkId + }, networkId: tx.address.networkId, hash: tx.hash, buttonDisplayDataList, diff --git a/redis/types.ts b/redis/types.ts index 0238e5809..0ad2cda47 100644 --- a/redis/types.ts +++ b/redis/types.ts @@ -52,9 +52,15 @@ export interface AmountData { networkId?: number } +export interface Amount { + amount: Decimal + networkId?: number +} + export interface Payment { timestamp: number values: AmountData + amount?: Amount networkId: number hash: string buttonDisplayDataList: ButtonDisplayData[] From 8e037ac92e3d46f5f1a7c47e229c9b9ba56ec824 Mon Sep 17 00:00:00 2001 From: lissavxo Date: Fri, 28 Mar 2025 19:37:55 -0300 Subject: [PATCH 3/8] fix: disable sorting value payments --- pages/payments/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index 052ee694c..d1c30afe7 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -157,6 +157,7 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac Header: () => (
Value
), accessor: 'values', sortType: compareNumericString, + disableSortBy: true, Cell: (cellProps) => { return
${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)}
} From 2fa721d2706ca1bd782c25d3820fcd8629273a37 Mon Sep 17 00:00:00 2001 From: lissavxo Date: Wed, 28 May 2025 14:53:09 -0300 Subject: [PATCH 4/8] fix: force decimals payments page --- pages/payments/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index d1c30afe7..7fcaa0a73 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -148,9 +148,12 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac sortType: compareNumericString, Cell: (cellProps) => { const networkTicker = NETWORK_TICKERS_FROM_ID[cellProps.cell.value.networkId] - const amount = Number(cellProps.cell.value.amount).toFixed(DECIMALS[networkTicker]) - const formattedAmount = Number(amount).toLocaleString() - return
{formattedAmount}
+ const formattedAmount = Number(cellProps.cell.value.amount).toLocaleString(undefined, { + minimumFractionDigits: DECIMALS[networkTicker], + maximumFractionDigits: DECIMALS[networkTicker] + }) + + return
{formattedAmount}
} }, { From 9f3e91ddbdb77892cd869e7fa3f53a439bde9eac Mon Sep 17 00:00:00 2001 From: lissavxo Date: Thu, 29 May 2025 11:50:34 -0300 Subject: [PATCH 5/8] refactor: clean up --- pages/payments/index.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index 7fcaa0a73..1b94f8917 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -146,9 +146,11 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac Header: () => (
Amount
), accessor: 'amount', sortType: compareNumericString, - Cell: (cellProps) => { - const networkTicker = NETWORK_TICKERS_FROM_ID[cellProps.cell.value.networkId] - const formattedAmount = Number(cellProps.cell.value.amount).toLocaleString(undefined, { + Cell: ({ cell }) => { + const original = cell.value + const { networkId, amount } = original + const networkTicker = NETWORK_TICKERS_FROM_ID[networkId] + const formattedAmount = Number(amount).toLocaleString(undefined, { minimumFractionDigits: DECIMALS[networkTicker], maximumFractionDigits: DECIMALS[networkTicker] }) From da0cd51d9e890432966e83676bbfb1747cc84f8c Mon Sep 17 00:00:00 2001 From: lissavxo Date: Fri, 30 May 2025 16:59:26 -0300 Subject: [PATCH 6/8] fix: button sort --- pages/payments/index.tsx | 5 ++--- services/transactionService.ts | 13 ++++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index 1b94f8917..f39247157 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -146,9 +146,8 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac Header: () => (
Amount
), accessor: 'amount', sortType: compareNumericString, - Cell: ({ cell }) => { - const original = cell.value - const { networkId, amount } = original + Cell: (cellProps) => { + const { networkId, amount } = cellProps.cell.row.original.amount const networkTicker = NETWORK_TICKERS_FROM_ID[networkId] const formattedAmount = Number(amount).toLocaleString(undefined, { minimumFractionDigits: DECIMALS[networkTicker], diff --git a/services/transactionService.ts b/services/transactionService.ts index aa910e0c3..8e1dbade8 100644 --- a/services/transactionService.ts +++ b/services/transactionService.ts @@ -151,11 +151,10 @@ export async function fetchTransactionsByAddressListWithPagination ( pageSize: number, orderBy?: string, orderDesc = true, - networkIdsListFilter?: number[], + networkIdsListFilter?: number[] ): Promise { - const orderDescString: Prisma.SortOrder = orderDesc ? 'desc' : 'asc' - + // Get query for orderBy that works with nested properties (e.g. `address.networkId`) let orderByQuery if (orderBy !== undefined && orderBy !== '') { @@ -192,7 +191,7 @@ export async function fetchTransactionsByAddressListWithPagination ( include: includePaybuttonsAndPrices, orderBy: orderByQuery, skip: page * pageSize, - take: pageSize, + take: pageSize }) } @@ -578,7 +577,7 @@ export async function fetchTransactionsByPaybuttonIdWithPagination ( pageSize, orderBy, orderDesc, - networkIds); + networkIds) if (transactions.length === 0) { throw new Error(RESPONSE_MESSAGES.NO_TRANSACTION_FOUND_404.message) @@ -705,6 +704,10 @@ export async function getPaymentsByUserIdOrderedByButtonName ( }) if (tx.amount > 0) { payments.push({ + amount: { + amount: tx.amount, + networkId: tx.networkId + }, timestamp: tx.timestamp, values: { values: ret, From 7ce3e6da5572a5c3a44a904bfb8de5fef1c459f4 Mon Sep 17 00:00:00 2001 From: lissavxo Date: Fri, 6 Jun 2025 14:25:51 -0300 Subject: [PATCH 7/8] refactor: clean up --- pages/payments/index.tsx | 2 +- redis/paymentCache.ts | 8 ++------ redis/types.ts | 8 +------- services/transactionService.ts | 5 +---- 4 files changed, 5 insertions(+), 18 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index f39247157..d22381f5c 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -147,7 +147,7 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac accessor: 'amount', sortType: compareNumericString, Cell: (cellProps) => { - const { networkId, amount } = cellProps.cell.row.original.amount + const { networkId, amount } = cellProps.cell.row.original const networkTicker = NETWORK_TICKERS_FROM_ID[networkId] const formattedAmount = Number(amount).toLocaleString(undefined, { minimumFractionDigits: DECIMALS[networkTicker], diff --git a/redis/paymentCache.ts b/redis/paymentCache.ts index 68b7b9f98..a5572f387 100755 --- a/redis/paymentCache.ts +++ b/redis/paymentCache.ts @@ -83,13 +83,9 @@ export const generatePaymentFromTx = async (tx: TransactionsWithPaybuttonsAndPri timestamp: tx.timestamp, values: { values, - amount: tx.amount, - networkId: tx.address.networkId - }, - amount: { - amount: tx.amount, - networkId: tx.address.networkId + amount: tx.amount }, + amount: tx.amount, networkId: tx.address.networkId, hash: tx.hash, buttonDisplayDataList, diff --git a/redis/types.ts b/redis/types.ts index 0ad2cda47..2fac85414 100644 --- a/redis/types.ts +++ b/redis/types.ts @@ -49,18 +49,12 @@ export interface ButtonDisplayData { export interface AmountData { values: QuoteValues amount: Decimal - networkId?: number -} - -export interface Amount { - amount: Decimal - networkId?: number } export interface Payment { timestamp: number values: AmountData - amount?: Amount + amount?: Decimal networkId: number hash: string buttonDisplayDataList: ButtonDisplayData[] diff --git a/services/transactionService.ts b/services/transactionService.ts index 8e1dbade8..5fd2757f3 100644 --- a/services/transactionService.ts +++ b/services/transactionService.ts @@ -704,10 +704,7 @@ export async function getPaymentsByUserIdOrderedByButtonName ( }) if (tx.amount > 0) { payments.push({ - amount: { - amount: tx.amount, - networkId: tx.networkId - }, + amount: tx.amount, timestamp: tx.timestamp, values: { values: ret, From 927df258a915109da9e669f5eb604833d36659ec Mon Sep 17 00:00:00 2001 From: lissavxo Date: Tue, 10 Jun 2025 11:46:30 -0300 Subject: [PATCH 8/8] refactor: clean up --- pages/payments/index.tsx | 2 +- redis/dashboardCache.ts | 16 ++++++++-------- redis/paymentCache.ts | 9 +++------ redis/types.ts | 6 +----- services/transactionService.ts | 5 +---- 5 files changed, 14 insertions(+), 24 deletions(-) diff --git a/pages/payments/index.tsx b/pages/payments/index.tsx index d22381f5c..79290036c 100644 --- a/pages/payments/index.tsx +++ b/pages/payments/index.tsx @@ -163,7 +163,7 @@ export default function Payments ({ user, userId }: PaybuttonsProps): React.Reac sortType: compareNumericString, disableSortBy: true, Cell: (cellProps) => { - return
${formatQuoteValue(cellProps.cell.value.values, user.userProfile.preferredCurrencyId)}
+ return
${formatQuoteValue(cellProps.cell.value, user.userProfile.preferredCurrencyId)}
} }, { diff --git a/redis/dashboardCache.ts b/redis/dashboardCache.ts index b1e2ee5c4..5de77260f 100644 --- a/redis/dashboardCache.ts +++ b/redis/dashboardCache.ts @@ -69,14 +69,14 @@ export const getButtonPaymentData = (n: number, periodString: string, paymentLis }, total: { payments: 1, - revenue: p.values.values + revenue: p.values } } buttonPaymentData[b.id] = newEntry return } prevObj.total.payments += 1 - prevObj.total.revenue = sumQuoteValues(prevObj.total.revenue, p.values.values) + prevObj.total.revenue = sumQuoteValues(prevObj.total.revenue, p.values) prevObj.displayData.isXec = prevObj.displayData.isXec === true || (p.networkId === XEC_NETWORK_ID) prevObj.displayData.isBch = prevObj.displayData.isBch === true || (p.networkId === BCH_NETWORK_ID) const lastPayment = prevObj.displayData.lastPayment as number @@ -100,8 +100,8 @@ export const sumPaymentsValue = function (paymentList: Payment[]): QuoteValues { } for (const p of paymentList) { - ret.usd = ret.usd.plus(p.values.values.usd) - ret.cad = ret.cad.plus(p.values.values.cad) + ret.usd = ret.usd.plus(p.values.usd) + ret.cad = ret.cad.plus(p.values.cad) } return ret } @@ -161,11 +161,11 @@ const generateDashboardDataFromStream = async function ( if (paybuttonIds !== undefined && paybuttonIds.length > 0) { const paymentButtonIds = payment.buttonDisplayDataList.map(b => b.id) if (paymentButtonIds.some(item => paybuttonIds.includes(item))) { - revenueAccumulators[period][index] = sumQuoteValues(revenueAccumulators[period][index], payment.values.values) + revenueAccumulators[period][index] = sumQuoteValues(revenueAccumulators[period][index], payment.values) paymentCounters[period][index] += 1 } } else { - revenueAccumulators[period][index] = sumQuoteValues(revenueAccumulators[period][index], payment.values.values) + revenueAccumulators[period][index] = sumQuoteValues(revenueAccumulators[period][index], payment.values) paymentCounters[period][index] += 1 } } @@ -315,13 +315,13 @@ function processButtonData ( lastPayment: payment.timestamp }, total: { - revenue: payment.values.values, + revenue: payment.values, payments: 1 } } } else { const buttonData = buttonDataAccumulators[period][button.id] - buttonData.total.revenue = sumQuoteValues(buttonData.total.revenue, payment.values.values) + buttonData.total.revenue = sumQuoteValues(buttonData.total.revenue, payment.values) buttonData.total.payments += 1 buttonData.displayData.lastPayment = Math.max( buttonData.displayData.lastPayment ?? 0, diff --git a/redis/paymentCache.ts b/redis/paymentCache.ts index a5572f387..1b1323cc8 100755 --- a/redis/paymentCache.ts +++ b/redis/paymentCache.ts @@ -81,10 +81,7 @@ export const generatePaymentFromTx = async (tx: TransactionsWithPaybuttonsAndPri } return { timestamp: tx.timestamp, - values: { - values, - amount: tx.amount - }, + values, amount: tx.amount, networkId: tx.address.networkId, hash: tx.hash, @@ -113,7 +110,7 @@ export const generateAndCacheGroupedPaymentsAndInfoForAddress = async (address: paymentCount } - paymentList = paymentList.filter((p) => p.values.values.usd > new Prisma.Decimal(0)) + paymentList = paymentList.filter((p) => p.values.usd > new Prisma.Decimal(0)) const groupedPayments = getPaymentsByWeek(address.address, paymentList) return { groupedPayments, @@ -197,7 +194,7 @@ export const cacheManyTxs = async (txs: TransactionsWithPaybuttonsAndPrices[]): const zero = new Prisma.Decimal(0) for (const tx of txs.filter(tx => tx.amount > zero)) { const payment = await generatePaymentFromTx(tx) - if (payment.values.values.usd !== new Prisma.Decimal(0)) { + if (payment.values.usd !== new Prisma.Decimal(0)) { const paymentsGroupedByKey = getPaymentsByWeek(tx.address.address, [payment]) void await cacheGroupedPaymentsAppend(paymentsGroupedByKey) } diff --git a/redis/types.ts b/redis/types.ts index 2fac85414..a319a2be0 100644 --- a/redis/types.ts +++ b/redis/types.ts @@ -46,14 +46,10 @@ export interface ButtonDisplayData { lastPayment?: number providerUserId?: string } -export interface AmountData { - values: QuoteValues - amount: Decimal -} export interface Payment { timestamp: number - values: AmountData + values: QuoteValues amount?: Decimal networkId: number hash: string diff --git a/services/transactionService.ts b/services/transactionService.ts index 5fd2757f3..1a9003b8d 100644 --- a/services/transactionService.ts +++ b/services/transactionService.ts @@ -706,10 +706,7 @@ export async function getPaymentsByUserIdOrderedByButtonName ( payments.push({ amount: tx.amount, timestamp: tx.timestamp, - values: { - values: ret, - amount: tx.amount - }, + values: ret, networkId: tx.networkId, hash: tx.hash, buttonDisplayDataList