Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions packages/common/src/adapters/audioTransactions.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { describe, expect, it } from 'vitest'

import {
TransactionMethod,
TransactionType
} from '~/store/ui/transaction-details/types'

import { audioTransactionFromSdk } from './audioTransactions'

const makeSdkTransaction = (overrides: Record<string, unknown> = {}) =>
({
signature: 'signature',
transactionType: 'transfer',
method: 'receive',
transactionDate: '2026-01-01T00:00:00.000Z',
change: '100000000',
balance: '500000000',
metadata: 'metadata',
...overrides
}) as any

describe('audioTransactionFromSdk', () => {
it('maps tip transactions', () => {
const tipTx = audioTransactionFromSdk(
makeSdkTransaction({
transactionType: 'tip',
method: 'send'
})
)

expect(tipTx.transactionType).toBe(TransactionType.TIP)
expect(tipTx.method).toBe(TransactionMethod.SEND)
})

it('throws on unknown transaction type', () => {
expect(() =>
audioTransactionFromSdk(
makeSdkTransaction({
transactionType: 'unknown_type'
})
)
).toThrow('Unknown Transaction')
})
})
4 changes: 3 additions & 1 deletion packages/common/src/adapters/audioTransactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ export const audioTransactionFromSdk = (
'purchase unknown': TransactionType.PURCHASE,
user_reward: TransactionType.CHALLENGE_REWARD,
trending_reward: TransactionType.TRENDING_REWARD,
transfer: TransactionType.TRANSFER
transfer: TransactionType.TRANSFER,
tip: TransactionType.TIP
}

const txType = transactionTypeMap[tx.transactionType]
Expand Down Expand Up @@ -48,6 +49,7 @@ export const audioTransactionFromSdk = (
metadata: undefined
}
case TransactionType.TRANSFER:
case TransactionType.TIP:
return {
signature: tx.signature,
transactionType: txType,
Expand Down
5 changes: 3 additions & 2 deletions packages/common/src/store/ui/transaction-details/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ export enum TransactionType {
PURCHASE = 'PURCHASE',
CHALLENGE_REWARD = 'CHALLENGE_REWARD',
TRENDING_REWARD = 'TRENDING_REWARD',
TRANSFER = 'TRANSFER'
TRANSFER = 'TRANSFER',
TIP = 'TIP'
}

export enum TransactionMethod {
Expand Down Expand Up @@ -50,7 +51,7 @@ export type TransactionDetails =
}
| {
signature: string
transactionType: TransactionType.TRANSFER
transactionType: TransactionType.TRANSFER | TransactionType.TIP
method: TransactionMethod.SEND | TransactionMethod.RECEIVE
date: string
change: StringAudio
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ const typeIconSvgMap: Record<TransactionType, IconComponent | null> = {
[TransactionType.CHALLENGE_REWARD]: IconTrophy,
[TransactionType.PURCHASE]: null, // Not needed, AppLogo is used for purchases
[TransactionType.TRANSFER]: IconTransaction,
[TransactionType.TIP]: IconTransaction,
[TransactionType.TRENDING_REWARD]: IconTrophy
} as const

Expand All @@ -54,6 +55,7 @@ const typeIconMap: Record<
[TransactionType.CHALLENGE_REWARD]: TypeIcon,
[TransactionType.PURCHASE]: AppLogo,
[TransactionType.TRANSFER]: TypeIcon,
[TransactionType.TIP]: TypeIcon,
[TransactionType.TRENDING_REWARD]: TypeIcon
} as const

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,15 @@
line-height: 1.2;
}

.icon {
margin-right: 22px;
.typeText {
line-height: 150%;
}

.changeCell.increase {
color: var(--harmony-green);
}
.changeCell.decrease {
color: var(--harmony-orange);
.tableWrapper {
padding-bottom: 0;
margin-bottom: 96px;
}

.typeText {
line-height: 150%;
.tableWrapper :global([class*='showMoreContainer']) {
background-color: transparent;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@ import {
import { dayjs } from '@audius/common/utils'
import { wAUDIO } from '@audius/fixed-decimal'
import { Tooltip } from '@audius/harmony'
import cn from 'classnames'
import { Cell, Row } from 'react-table'

import { AudioTransactionIcon } from 'components/audio-transaction-icon'
import { Table } from 'components/table'
import { TableProps } from 'components/table/Table'
import { RESPONSIVE_TABLE_POLICIES } from 'components/table/responsivePolicies'

import styles from './AudioTransactionsTable.module.css'

const transactionTypeLabelMap: Record<TransactionType, string> = {
[TransactionType.TRANSFER]: '$AUDIO',
[TransactionType.TIP]: 'Tip',
[TransactionType.CHALLENGE_REWARD]: '$AUDIO Reward Earned',
[TransactionType.TRENDING_REWARD]: 'Trending Competition Award',
[TransactionType.PURCHASE]: 'Purchased $AUDIO'
Expand Down Expand Up @@ -75,16 +75,13 @@ const renderTransactionTypeCell = (cellInfo: TransactionCell) => {
const methodText =
transactionMethodLabelMap[method as TransactionMethod] ?? ''

const isTransferType = transactionType === TransactionType.TRANSFER
const isMethodType =
transactionType === TransactionType.TRANSFER ||
transactionType === TransactionType.TIP
return (
<>
<div className={styles.icon}>
<AudioTransactionIcon type={transactionType} method={method} />
</div>
<span className={styles.typeText}>
{`${typeText} ${isTransferType ? methodText : ''}`.trim()}
</span>
</>
<span className={styles.typeText}>
{`${typeText} ${isMethodType ? methodText : ''}`.trim()}
</span>
)
}

Expand Down Expand Up @@ -113,12 +110,7 @@ const renderChangeCell = (cellInfo: TransactionCell) => {
})} $AUDIO`}
mount={'body'}
>
<div
className={cn(
styles.changeCell,
isChangePositive(tx) ? styles.increase : styles.decrease
)}
>
<div>
{wAUDIO(BigInt(change)).toLocaleString('en-US', {
maximumFractionDigits: 0
})}
Expand Down Expand Up @@ -210,6 +202,8 @@ export const AudioTransactionsTable = ({
columns={tableColumns}
onClickRow={handleClickRow}
isEmptyRow={isEmptyRow}
responsiveColumns={RESPONSIVE_TABLE_POLICIES.audioTransactions}
wrapperClassName={styles.tableWrapper}
{...other}
/>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { Cell, Row } from 'react-table'

import { TextLink } from 'components/link'
import { Table, alphaSorter, dateSorter, numericSorter } from 'components/table'
import type { TableProps } from 'components/table/Table'

import styles from './CollectionsTable.module.css'
import { CollectionsTableOverflowMenuButton } from './CollectionsTableOverflowMenuButton'
Expand Down Expand Up @@ -48,6 +49,7 @@ type CollectionsTableProps = {
showMoreLimit?: number
totalRowCount?: number
tableHeaderClassName?: string
responsiveColumns?: TableProps['responsiveColumns']
}

const defaultColumns: CollectionsTableColumn[] = [
Expand Down Expand Up @@ -75,7 +77,8 @@ export const CollectionsTable = ({
scrollRef,
showMoreLimit,
totalRowCount,
tableHeaderClassName
tableHeaderClassName,
responsiveColumns
}: CollectionsTableProps) => {
// Cell Render Functions
const renderNameCell = useCallback((cellInfo: CollectionCell) => {
Expand Down Expand Up @@ -262,6 +265,7 @@ export const CollectionsTable = ({
showMoreLimit={showMoreLimit}
totalRowCount={totalRowCount}
tableHeaderClassName={tableHeaderClassName}
responsiveColumns={responsiveColumns}
/>
)
}
53 changes: 24 additions & 29 deletions packages/web/src/components/table/Table.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -50,40 +50,44 @@
.tableHeader {
position: relative;
background-color: var(--harmony-white);
padding-left: 12px;
padding-left: 0px;
padding-right: 12px;
line-height: 41px;
user-select: none;
}

.tableHeader.hasSorter .textCell {
padding-right: 6px;
}

.titleHeader + .titleHeader::before {
content: '';
position: absolute;
height: 18px;
width: 1px;
top: 50%;
left: 0;
transform: translateY(-50%);
background-color: var(--harmony-n-100);
}

.textCell {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}

.headerContent {
display: flex;
align-items: center;
gap: 4px;
width: 100%;
min-width: 0;
}

.tableHeader.leftAlign .headerContent {
justify-content: flex-start;
padding-left: 12px;
}

.tableHeader.rightAlign .headerContent {
justify-content: flex-end;
}

.tableHeader:not(.leftAlign):not(.rightAlign) .headerContent {
justify-content: center;
}

.sortCaretContainer {
position: absolute;
display: flex;
flex-direction: column;
top: 50%;
right: 6px;
transform: translateY(-50%);
flex: 0 0 auto;
justify-content: center;
}

.sortCaret {
Expand Down Expand Up @@ -259,15 +263,6 @@
text-overflow: ellipsis;
}

.resizer {
position: absolute;
z-index: 1;
top: 0;
bottom: 0;
right: -2px;
width: 6px;
}

.leftAlign {
text-align: left;
justify-content: left;
Expand Down
Loading
Loading