Skip to content

Commit fc062ea

Browse files
authored
feat: activity panel enhancements (#4694)
1 parent d7783a4 commit fc062ea

9 files changed

Lines changed: 92 additions & 49 deletions

File tree

src/components/ProtocolActivity/utils/translateEventDataToProtocolPresenter.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function translateEventDataToProtocolPresenter(event: AnyEvent) {
2020
header: 'Added to balance',
2121
subject: `${formatActivityAmount(event.amount.value)} ETH`,
2222
}
23-
case 'mintTokensEvent':
23+
case 'manualMintTokensEvent':
2424
return {
2525
event,
2626
header: 'Minted tokens',
@@ -74,7 +74,7 @@ export function translateEventDataToProtocolPresenter(event: AnyEvent) {
7474
header: 'Used allowance',
7575
subject: `${formatActivityAmount(event.amount.value)} ETH`,
7676
}
77-
case 'burnEvent':
77+
case 'manualBurnEvent':
7878
return {
7979
event,
8080
header: 'Burned',

src/locales/messages.pot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,9 @@ msgstr ""
788788
msgid "<0/>{0} distributed"
789789
msgstr ""
790790

791+
msgid "Create NFT Rewards"
792+
msgstr ""
793+
791794
msgid "Project ownership has been successfully transferred to {toAddress} on all chains."
792795
msgstr ""
793796

@@ -2141,6 +2144,9 @@ msgstr ""
21412144
msgid "Unlimited payouts"
21422145
msgstr ""
21432146

2147+
msgid "Add NFT Tier"
2148+
msgstr ""
2149+
21442150
msgid "Configuration rules"
21452151
msgstr ""
21462152

src/packages/v4v5/graphql/queries/activityEvents.graphql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ query ActivityEvents(
4848
amount
4949
memo
5050
}
51-
mintTokensEvent {
51+
manualMintTokensEvent {
5252
id
5353
projectId
5454
timestamp
@@ -158,7 +158,7 @@ query ActivityEvents(
158158
netAmountPaidOut
159159
memo
160160
}
161-
burnEvent {
161+
manualBurnEvent {
162162
id
163163
projectId
164164
timestamp

src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectDashboard.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export default function V4V5ProjectDashboard() {
4141
<div
4242
className={twMerge(
4343
'flex flex-col gap-8',
44-
'[@media(min-width:960px)]:order-last [@media(min-width:960px)]:min-w-[340px] [@media(min-width:960px)]:max-w-md',
44+
'[@media(min-width:960px)]:order-last [@media(min-width:960px)]:min-w-[320px] [@media(min-width:960px)]:max-w-[400px]',
4545
)}
4646
>
4747
<V4V5PayRedeemCard className="mt-10" />

src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/V4V5ActivityList.tsx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export function V4V5ActivityList() {
9191

9292
return (
9393
<div>
94-
<h2 className="mb-6 font-heading text-2xl font-medium">Activity</h2>
94+
<h2 className="mb-6 font-heading text-xl font-medium">Activity</h2>
9595
<div className="flex flex-col gap-3">
9696
<JuiceListbox
9797
className="mb-5"
@@ -130,7 +130,7 @@ export function V4V5ActivityList() {
130130
)}
131131
</>
132132
) : (
133-
<span className="text-zinc-500 text-sm">No activity yet.</span>
133+
<span className="text-zinc-500 text-xs">No activity yet.</span>
134134
)}
135135
</div>
136136
</div>
@@ -148,7 +148,7 @@ export function translateEventDataToPresenter(
148148
event,
149149
header: 'Paid',
150150
subject: (
151-
<span className="font-heading text-lg">
151+
<span className="font-heading text-base">
152152
{formatActivityAmount(event.amount.value)} ETH
153153
</span>
154154
),
@@ -159,18 +159,18 @@ export function translateEventDataToPresenter(
159159
event,
160160
header: 'Added to balance',
161161
subject: (
162-
<span className="font-heading text-lg">
162+
<span className="font-heading text-base">
163163
{formatActivityAmount(event.amount.value)} ETH
164164
</span>
165165
),
166166
extra: event.note ? <RichNote note={event.note} /> : null,
167167
}
168-
case 'mintTokensEvent':
168+
case 'manualMintTokensEvent':
169169
return {
170170
event,
171171
header: 'Minted tokens',
172172
subject: (
173-
<span className="font-heading text-lg">
173+
<span className="font-heading text-base">
174174
{event.amount.format()}{' '}
175175
{tokenSymbolText({
176176
capitalize: true,
@@ -186,7 +186,7 @@ export function translateEventDataToPresenter(
186186
event,
187187
header: 'Cashed out',
188188
subject: (
189-
<span className="font-heading text-lg">
189+
<span className="font-heading text-base">
190190
{formatActivityAmount(event.reclaimAmount.value)} ETH
191191
</span>
192192
),
@@ -195,7 +195,7 @@ export function translateEventDataToPresenter(
195195
return {
196196
event,
197197
header: 'Deployed ERC20',
198-
subject: <span className="font-heading text-lg">{event.symbol}</span>,
198+
subject: <span className="font-heading text-base">{event.symbol}</span>,
199199
extra: <RichNote note={event.address} />,
200200
}
201201
case 'projectCreateEvent':
@@ -210,7 +210,7 @@ export function translateEventDataToPresenter(
210210
event,
211211
header: 'Send payouts',
212212
subject: (
213-
<span className="font-heading text-lg">
213+
<span className="font-heading text-base">
214214
{formatActivityAmount(event.amount.value)} ETH
215215
</span>
216216
),
@@ -225,7 +225,7 @@ export function translateEventDataToPresenter(
225225
event,
226226
header: 'Send reserved tokens',
227227
subject: (
228-
<span className="font-heading text-lg">
228+
<span className="font-heading text-base">
229229
{fromWad(event.tokenCount)}{' '}
230230
{tokenSymbolText({ tokenSymbol, plural: event.tokenCount > 1 })}
231231
</span>
@@ -237,7 +237,7 @@ export function translateEventDataToPresenter(
237237
event,
238238
header: 'Send to reserved token split',
239239
subject: (
240-
<span className="font-heading text-lg">
240+
<span className="font-heading text-base">
241241
{fromWad(event.tokenCount)}{' '}
242242
{tokenSymbolText({ tokenSymbol, plural: event.tokenCount > 1 })}
243243
</span>
@@ -255,7 +255,7 @@ export function translateEventDataToPresenter(
255255
event,
256256
header: 'Send to payout split',
257257
subject: (
258-
<span className="font-heading text-lg">
258+
<span className="font-heading text-base">
259259
{formatActivityAmount(event.amount.value)} ETH
260260
</span>
261261
),
@@ -272,18 +272,18 @@ export function translateEventDataToPresenter(
272272
event,
273273
header: 'Used allowance',
274274
subject: (
275-
<span className="font-heading text-lg">
275+
<span className="font-heading text-base">
276276
{formatActivityAmount(event.amount.value)} ETH
277277
</span>
278278
),
279279
extra: <RichNote note={event.note} />,
280280
}
281-
case 'burnEvent':
281+
case 'manualBurnEvent':
282282
return {
283283
event,
284284
header: 'Burned',
285285
subject: (
286-
<span className="font-heading text-lg">
286+
<span className="font-heading text-base">
287287
{Number(event.amount.toFloat())}{' '}
288288
{tokenSymbolText({
289289
tokenSymbol,
@@ -402,7 +402,7 @@ const ACTIVITY_OPTIONS = [
402402
{ label: 'All activity', value: 'all' },
403403
{ label: 'Paid', value: 'payEvent' },
404404
{ label: 'Added to balance', value: 'addToBalanceEvent' },
405-
{ label: 'Minted tokens', value: 'mintTokensEvent' },
405+
{ label: 'Minted tokens', value: 'manualMintTokensEvent' },
406406
{ label: 'Cashed out', value: 'cashOutEvent' },
407407
{ label: 'Deployed ERC20', value: 'deployedERC20Event' },
408408
{ label: 'Project created', value: 'projectCreateEvent' },
@@ -420,7 +420,7 @@ const ACTIVITY_OPTIONS = [
420420
value: 'sendPayoutsToSplitEvent',
421421
},
422422
{ label: 'Used allowance', value: 'useAllowanceEvent' },
423-
{ label: 'Burned', value: 'burnEvent' },
423+
{ label: 'Burned', value: 'manualBurnEvent' },
424424
]
425425

426426
const CHAIN_OPTIONS = Object.entries(NETWORKS).map(

src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/activityEventElems/ActivityElement.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function TimestampVersion({
128128
}
129129

130130
function Subject({ subject }: { subject: string | JSX.Element | null }) {
131-
return <div className="text-sm">{subject}</div>
131+
return <div className="text-xs">{subject}</div>
132132
}
133133

134134
/**

src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5ActivityPanel/utils/transformEventsData.ts

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { ActivityEventsQuery } from 'packages/v4v5/graphql/client/graphql'
66
export type EventType =
77
| 'payEvent'
88
| 'addToBalanceEvent'
9-
| 'mintTokensEvent'
9+
| 'manualMintTokensEvent'
1010
| 'cashOutEvent'
1111
| 'deployedERC20Event'
1212
| 'projectCreateEvent'
@@ -15,7 +15,7 @@ export type EventType =
1515
| 'distributeToReservedTokenSplitEvent'
1616
| 'distributeToPayoutSplitEvent'
1717
| 'useAllowanceEvent'
18-
| 'burnEvent'
18+
| 'manualBurnEvent'
1919

2020
export interface Event {
2121
id: string
@@ -46,8 +46,8 @@ export interface AddToBalanceEvent extends Event {
4646
note: string | null
4747
}
4848

49-
export interface MintTokensEvent extends Event {
50-
type: 'mintTokensEvent'
49+
export interface ManualMintTokensEvent extends Event {
50+
type: 'manualMintTokensEvent'
5151
amount: Ether
5252
beneficiary: string
5353
note: string
@@ -118,8 +118,8 @@ export interface UseAllowanceEvent extends Event {
118118
note: string
119119
}
120120

121-
export interface BurnEvent extends Event {
122-
type: 'burnEvent'
121+
export interface ManualBurnEvent extends Event {
122+
type: 'manualBurnEvent'
123123
holder: string
124124
amount: Ether
125125
stakedAmount: Ether
@@ -136,7 +136,7 @@ export interface BurnEvent extends Event {
136136
export type AnyEvent =
137137
| PayEvent
138138
| AddToBalanceEvent
139-
| MintTokensEvent
139+
| ManualMintTokensEvent
140140
| CashOutEvent
141141
| DeployedERC20Event
142142
| ProjectCreateEvent
@@ -145,7 +145,7 @@ export type AnyEvent =
145145
| DistributeToReservedTokenSplitEvent
146146
| DistributeToPayoutSplitEvent
147147
| UseAllowanceEvent
148-
| BurnEvent
148+
| ManualBurnEvent
149149

150150
// eslint-disable-next-line @typescript-eslint/no-explicit-any
151151
function extractBaseEventData(event: any, projectName?: string | null, projectHandle?: string | null): AnyEvent {
@@ -204,14 +204,14 @@ export function transformEventData(
204204
note: data.addToBalanceEvent.memo,
205205
}
206206
}
207-
if (data.mintTokensEvent) {
207+
if (data.manualMintTokensEvent) {
208208
return {
209-
...extractBaseEventData(data.mintTokensEvent, projectName, projectHandle),
209+
...extractBaseEventData(data.manualMintTokensEvent, projectName, projectHandle),
210210
chainId: data.chainId,
211-
type: 'mintTokensEvent',
212-
amount: new Ether(BigInt(data.mintTokensEvent.tokenCount)),
213-
beneficiary: data.mintTokensEvent.beneficiary,
214-
note: data.mintTokensEvent.memo || '',
211+
type: 'manualMintTokensEvent',
212+
amount: new Ether(BigInt(data.manualMintTokensEvent.tokenCount)),
213+
beneficiary: data.manualMintTokensEvent.beneficiary,
214+
note: data.manualMintTokensEvent.memo || '',
215215
}
216216
}
217217
if (data.cashOutTokensEvent) {
@@ -309,15 +309,15 @@ export function transformEventData(
309309
note: data.useAllowanceEvent.memo || '',
310310
}
311311
}
312-
if (data.burnEvent) {
312+
if (data.manualBurnEvent) {
313313
return {
314-
...extractBaseEventData(data.burnEvent, projectName, projectHandle),
314+
...extractBaseEventData(data.manualBurnEvent, projectName, projectHandle),
315315
chainId: data.chainId,
316-
type: 'burnEvent',
317-
holder: data.burnEvent.from,
318-
amount: new Ether(BigInt(data.burnEvent.amount)),
319-
stakedAmount: new Ether(BigInt(data.burnEvent.creditAmount)),
320-
erc20Amount: new Ether(BigInt(data.burnEvent.erc20Amount)),
316+
type: 'manualBurnEvent',
317+
holder: data.manualBurnEvent.from,
318+
amount: new Ether(BigInt(data.manualBurnEvent.amount)),
319+
stakedAmount: new Ether(BigInt(data.manualBurnEvent.creditAmount)),
320+
erc20Amount: new Ether(BigInt(data.manualBurnEvent.erc20Amount)),
321321
}
322322
}
323323
console.warn('Unknown event type', data)

src/packages/v4v5/views/V4V5ProjectDashboard/V4V5ProjectTabs/V4V5NftRewardsPanel/V4V5NftRewardsPanel.tsx

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import { Trans, t } from '@lingui/macro'
22
import { forwardRef } from 'react'
33
import { NftReward, NftRewardSkeleton } from './NftReward/NftReward'
44

5+
import { Button } from 'antd'
56
import { EmptyScreen } from 'components/Project/ProjectTabs/EmptyScreen'
7+
import { useWallet } from 'hooks/Wallet/useWallet'
8+
import useV4V5ProjectOwnerOf from 'packages/v4v5/hooks/useV4V5ProjectOwnerOf'
9+
import { useV4V5ProjectHeader } from 'packages/v4v5/views/V4V5ProjectDashboard/hooks/useV4V5ProjectHeader'
10+
import { useSettingsPagePath } from 'packages/v4v5/views/V4V5ProjectSettings/hooks/useSettingsPagePath'
11+
import { useRouter } from 'next/router'
612
import { RedeemNftsSection } from './RedeemNftsSection/RedeemNftsSection'
713
import { useNftRewardsPanel } from './hooks/useNftRewardsPanel'
814

@@ -14,11 +20,31 @@ export const V4V5NftRewardsPanel = forwardRef<HTMLDivElement>((props, ref) => {
1420
loading: nftsLoading,
1521
} = useNftRewardsPanel()
1622

23+
const router = useRouter()
24+
const { userAddress } = useWallet()
25+
const { data: projectOwnerAddress } = useV4V5ProjectOwnerOf()
26+
const { isRevnet, operatorAddress } = useV4V5ProjectHeader()
27+
const nftSettingsPath = useSettingsPagePath('nfts')
28+
29+
// Check if user can add NFTs (project owner or revnet operator)
30+
const canAddNfts =
31+
userAddress &&
32+
(userAddress.toLowerCase() === projectOwnerAddress?.toLowerCase() ||
33+
(isRevnet &&
34+
userAddress.toLowerCase() === operatorAddress?.toLowerCase()))
35+
1736
return (
1837
<div ref={ref} className="flex w-full flex-col gap-5">
19-
<h2 className="font-heading text-2xl font-medium">
20-
<Trans>NFTs</Trans>
21-
</h2>
38+
<div className="flex items-center justify-between">
39+
<h2 className="font-heading text-2xl font-medium">
40+
<Trans>NFTs</Trans>
41+
</h2>
42+
{canAddNfts && rewardTiers?.length && nftSettingsPath ? (
43+
<Button type="primary" onClick={() => router.push(nftSettingsPath)}>
44+
<Trans>Add NFT Tier</Trans>
45+
</Button>
46+
) : null}
47+
</div>
2248
<RedeemNftsSection />
2349

2450
{!nftsLoading && rewardTiers?.length ? (
@@ -41,6 +67,17 @@ export const V4V5NftRewardsPanel = forwardRef<HTMLDivElement>((props, ref) => {
4167
<NftRewardSkeleton key={i} />
4268
))}
4369
</div>
70+
) : canAddNfts && nftSettingsPath ? (
71+
<div className="flex flex-col items-center gap-4">
72+
<EmptyScreen subtitle={t`This project has no NFTs`} />
73+
<Button
74+
type="primary"
75+
size="large"
76+
onClick={() => router.push(nftSettingsPath)}
77+
>
78+
<Trans>Create NFT Rewards</Trans>
79+
</Button>
80+
</div>
4481
) : (
4582
<EmptyScreen subtitle={t`This project has no NFTs`} />
4683
)}

0 commit comments

Comments
 (0)