diff --git a/src/api/plugins.ts b/src/api/plugins.ts index 372b039..2bc8b12 100644 --- a/src/api/plugins.ts +++ b/src/api/plugins.ts @@ -1,4 +1,4 @@ -import { EarningTransaction, InviteInfo, Plugin, PluginApiKey, PluginPricing, TeamMember, TeamMemberRole } from "@/utils/types"; +import { EarningsSummary, EarningTransaction, InviteInfo, Plugin, PluginApiKey, PluginPricing, TeamMember, TeamMemberRole } from "@/utils/types"; import { apiClient } from "./client"; @@ -172,16 +172,8 @@ export const getEarnings = async (filters?: EarningsFilters): Promise; -}> => { - const response = await apiClient.get<{ - totalEarnings: number; - totalTransactions: number; - earningsByPlugin: Record; - }>("/earnings/summary"); +export const getEarningsSummary = async (): Promise => { + const response = await apiClient.get("/earnings/summary"); return response.data; }; diff --git a/src/data/mockData.ts b/src/data/mockData.ts index 27fe067..8947dc1 100644 --- a/src/data/mockData.ts +++ b/src/data/mockData.ts @@ -1,5 +1,13 @@ import { EarningTransaction, Plugin, PluginApiKey, PluginPricing } from "@/utils/types"; +// Default USDC fee asset for mock data +const mockFeeAsset = { + symbol: "USDC", + addr: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + decimals: 6, + network: "ethereum", +}; + // Mock Plugins based on seed data export const mockPlugins: Plugin[] = [ { @@ -64,42 +72,42 @@ export const mockPlugins: Plugin[] = [ }, ]; -// Mock Pricing based on seed data +// Mock Pricing based on seed data (amounts in minimal units) export const mockPricings: PluginPricing[] = [ { id: "00000000-0000-0000-0000-000000000002", pluginId: "vultisig-dca-0000", - asset: "usdc", type: "per-tx", frequency: null, - amount: 10000, // 1 cent in micro units + amount: "10000", // 0.01 USDC + fee_asset: mockFeeAsset, metric: "fixed", }, { id: "00000000-0000-0000-0000-000000000003", pluginId: "vultisig-payroll-0000", - asset: "usdc", type: "once", frequency: null, - amount: 50000, // 5 cents + amount: "50000", // 0.05 USDC + fee_asset: mockFeeAsset, metric: "fixed", }, { id: "00000000-0000-0000-0000-000000000004", pluginId: "vultisig-payroll-0000", - asset: "usdc", type: "recurring", frequency: "monthly", - amount: 30000, // 3 cents + amount: "30000", // 0.03 USDC + fee_asset: mockFeeAsset, metric: "fixed", }, { id: "00000000-0000-0000-0000-000000000005", pluginId: "vultisig-copytrader-0000", - asset: "usdc", type: "per-tx", frequency: null, - amount: 10000, // 1 cent + amount: "10000", // 0.01 USDC + fee_asset: mockFeeAsset, metric: "fixed", }, ]; @@ -132,14 +140,14 @@ export const mockApiKeys: PluginApiKey[] = [ }, ]; -// Mock Earning Transactions +// Mock Earning Transactions (amounts in minimal units, e.g., 10000 = 0.01 USDC) export const mockEarnings: EarningTransaction[] = [ { id: "tx-001", pluginId: "vultisig-dca-0000", pluginName: "Vultisig DCA Plugin", - amount: 10000, - asset: "usdc", + amount: "10000", + fee_asset: mockFeeAsset, type: "per-tx", createdAt: "2024-04-10T14:32:00Z", fromAddress: "0x1234...5678", @@ -150,8 +158,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-002", pluginId: "vultisig-dca-0000", pluginName: "Vultisig DCA Plugin", - amount: 10000, - asset: "usdc", + amount: "10000", + fee_asset: mockFeeAsset, type: "per-tx", createdAt: "2024-04-10T12:15:00Z", fromAddress: "0x8765...4321", @@ -162,8 +170,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-003", pluginId: "vultisig-payroll-0000", pluginName: "Vultisig Payroll Plugin", - amount: 50000, - asset: "usdc", + amount: "50000", + fee_asset: mockFeeAsset, type: "once", createdAt: "2024-04-09T10:00:00Z", fromAddress: "0xabcd...efgh", @@ -174,8 +182,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-004", pluginId: "vultisig-payroll-0000", pluginName: "Vultisig Payroll Plugin", - amount: 30000, - asset: "usdc", + amount: "30000", + fee_asset: mockFeeAsset, type: "recurring", createdAt: "2024-04-01T00:00:00Z", fromAddress: "0xijkl...mnop", @@ -186,8 +194,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-005", pluginId: "vultisig-copytrader-0000", pluginName: "Vultisig Copytrader Plugin", - amount: 10000, - asset: "usdc", + amount: "10000", + fee_asset: mockFeeAsset, type: "per-tx", createdAt: "2024-04-08T16:45:00Z", fromAddress: "0xqrst...uvwx", @@ -198,8 +206,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-006", pluginId: "vultisig-dca-0000", pluginName: "Vultisig DCA Plugin", - amount: 10000, - asset: "usdc", + amount: "10000", + fee_asset: mockFeeAsset, type: "per-tx", createdAt: "2024-04-07T09:20:00Z", fromAddress: "0xyzab...cdef", @@ -210,8 +218,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-007", pluginId: "vultisig-copytrader-0000", pluginName: "Vultisig Copytrader Plugin", - amount: 10000, - asset: "usdc", + amount: "10000", + fee_asset: mockFeeAsset, type: "per-tx", createdAt: "2024-04-06T11:30:00Z", fromAddress: "0xghij...klmn", @@ -222,8 +230,8 @@ export const mockEarnings: EarningTransaction[] = [ id: "tx-008", pluginId: "vultisig-payroll-0000", pluginName: "Vultisig Payroll Plugin", - amount: 30000, - asset: "usdc", + amount: "30000", + fee_asset: mockFeeAsset, type: "recurring", createdAt: "2024-03-01T00:00:00Z", fromAddress: "0xopqr...stuv", diff --git a/src/pages/Earnings.tsx b/src/pages/Earnings.tsx index 838804b..f18f72a 100644 --- a/src/pages/Earnings.tsx +++ b/src/pages/Earnings.tsx @@ -10,7 +10,7 @@ import { useCore } from "@/hooks/useCore"; import { Spin } from "@/toolkits/Spin"; import { HStack, Stack, VStack } from "@/toolkits/Stack"; import { formatCurrency, formatDate, truncateAddress } from "@/utils/functions"; -import { EarningTransaction, Plugin } from "@/utils/types"; +import { EarningsSummary, EarningTransaction, Plugin } from "@/utils/types"; const { RangePicker } = DatePicker; @@ -20,11 +20,7 @@ export const EarningsPage = () => { const [loading, setLoading] = useState(true); const [earnings, setEarnings] = useState([]); const [plugins, setPlugins] = useState([]); - const [summary, setSummary] = useState<{ - totalEarnings: number; - totalTransactions: number; - earningsByPlugin: Record; - } | null>(null); + const [summary, setSummary] = useState(null); // Pagination const [page, setPage] = useState(1); @@ -86,9 +82,9 @@ export const EarningsPage = () => { title: "Amount", dataIndex: "amount", key: "amount", - render: (amount: number, record) => ( + render: (amount: string, record) => ( - +{formatCurrency(amount, 4)} {record.asset.toUpperCase()} + +{formatCurrency(amount, record.fee_asset.decimals)} {record.fee_asset.symbol} ), }, @@ -210,7 +206,7 @@ export const EarningsPage = () => { Total Earnings - {formatCurrency(summary.totalEarnings, 4)} + {formatCurrency(summary.totalEarnings.amount, summary.totalEarnings.fee_asset.decimals)} diff --git a/src/pages/PluginEdit.tsx b/src/pages/PluginEdit.tsx index 15ddf6e..143e830 100644 --- a/src/pages/PluginEdit.tsx +++ b/src/pages/PluginEdit.tsx @@ -625,11 +625,11 @@ export const PluginEditPage = () => { {pricing.frequency && ` (${pricing.frequency})`} - {pricing.asset.toUpperCase()} - {pricing.metric} + {pricing.fee_asset.symbol} - {pricing.metric} - {formatCurrency(pricing.amount, 4)} + {formatCurrency(pricing.amount, pricing.fee_asset.decimals)} ))} diff --git a/src/pages/Plugins.tsx b/src/pages/Plugins.tsx index 91f152f..ad0b2db 100644 --- a/src/pages/Plugins.tsx +++ b/src/pages/Plugins.tsx @@ -93,7 +93,7 @@ export const PluginsPage = () => { {record.pricings.length > 0 ? ( record.pricings.map((pricing) => ( - {formatCurrency(pricing.amount, 4)} {pricing.asset.toUpperCase()} / {pricing.type} + {formatCurrency(pricing.amount, pricing.fee_asset.decimals)} {pricing.fee_asset.symbol} / {pricing.type} {pricing.frequency && ` (${pricing.frequency})`} )) diff --git a/src/utils/functions.ts b/src/utils/functions.ts index bcca38a..3f4ba54 100644 --- a/src/utils/functions.ts +++ b/src/utils/functions.ts @@ -80,8 +80,12 @@ export const formatDate = (dateString: string): string => { }); }; -export const formatCurrency = (amount: number, decimals = 6): string => { - const value = amount / Math.pow(10, decimals); +export const formatCurrency = (amount: string | number, decimals = 6): string => { + const parsed = typeof amount === "string" ? parseFloat(amount) : amount; + if (isNaN(parsed)) { + return "$0.00"; + } + const value = parsed / Math.pow(10, decimals); return `$${value.toFixed(2)}`; }; diff --git a/src/utils/types.ts b/src/utils/types.ts index c4e8714..475bb92 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -18,10 +18,10 @@ export type Plugin = { export type PluginPricing = { id: string; pluginId: string; - asset: string; type: "per-tx" | "once" | "recurring"; frequency: string | null; - amount: number; + amount: string; + fee_asset: FeeAsset; metric: string; }; @@ -45,12 +45,19 @@ export type PluginApiKey = { status: number; }; +export type FeeAsset = { + symbol: string; + addr: string; + decimals: number; + network: string; +}; + export type EarningTransaction = { id: string; pluginId: string; pluginName: string; - amount: number; - asset: string; + amount: string; + fee_asset: FeeAsset; type: "per-tx" | "once" | "recurring"; createdAt: string; fromAddress: string; @@ -58,6 +65,17 @@ export type EarningTransaction = { status: "pending" | "completed" | "failed"; }; +export type PluginEarning = { + amount: string; + fee_asset: FeeAsset; +}; + +export type EarningsSummary = { + totalEarnings: PluginEarning; + totalTransactions: number; + earningsByPlugin: Record; +}; + export type Tag = { id: string; name: string;