diff --git a/src/app/profile/[address]/page.tsx b/src/app/profile/[address]/page.tsx index 834a3841..c3b85763 100644 --- a/src/app/profile/[address]/page.tsx +++ b/src/app/profile/[address]/page.tsx @@ -170,7 +170,7 @@ export default function ProfilePage() { : "text-muted hover:text-foreground" }`} > - {t === "stories" ? "Writer" : t === "portfolio" ? "Portfolio" : "Activity"} + {t === "stories" ? "Writer" : t === "portfolio" ? "Reader" : "Activity"} ))} @@ -1356,10 +1356,11 @@ function PortfolioTab({ address, isOwnProfile }: { address: string; isOwnProfile return (
- {/* Portfolio summary — structured grid */} + {/* Portfolio summary */} {hasHoldings && ( + <> +

Portfolio

-

Portfolio

Value:{" "} @@ -1380,54 +1381,84 @@ function PortfolioTab({ address, isOwnProfile }: { address: string; isOwnProfile )}
+ )} - {/* Token holdings — structured cards */} - {hasHoldings && holdings!.map((h) => ( + {/* Token holdings */} + {hasHoldings && ( + <> +

Token Holdings

+ {holdings!.map((h) => (
- {/* Title + genre */} -
+ {/* Moleskine book (left) + Info (right) */} +
- {h.storyline.title} +
+
+
+ + {h.storyline.genre || "Uncategorized"} + +
+
+ + {h.storyline.title} + +
+
+ + {h.storyline.plot_count} {h.storyline.plot_count === 1 ? "plot" : "plots"} + +
+
- {h.storyline.genre && ( - {h.storyline.genre} - )} -
- {/* Stats */} -
-
- Value:{" "} - {formatPrice(formatUnits(h.value, h.reserveDecimals))} {RESERVE_LABEL} - {plotUsd && ({formatUsdValue(Number(formatUnits(h.value, h.reserveDecimals)) * plotUsd)})} - {h.priceChange !== null && ( - = 0 ? "text-accent" : "text-error"}`}> - {h.priceChange >= 0 ? "+" : ""}{h.priceChange.toFixed(1)}% - - )} -
-
Balance: {formatPrice(formatUnits(h.balance, 18))} tokens
-
- Price:{" "} - {formatPrice(formatUnits(h.price, 18))} {RESERVE_LABEL} - {plotUsd != null && ({formatUsdValue(Number(formatUnits(h.price, 18)) * plotUsd)})} -
- {h.entryPrice !== null && h.entryPrice > 0 && ( +
- Entry:{" "} - {formatPrice(h.entryPrice)} {RESERVE_LABEL} - {plotUsd != null && ({formatUsdValue(h.entryPrice * plotUsd)})} + {formatPrice(formatUnits(h.value, h.reserveDecimals))} {RESERVE_LABEL} + {plotUsd && ({formatUsdValue(Number(formatUnits(h.value, h.reserveDecimals)) * plotUsd)})} + {h.priceChange !== null && ( + = 0 ? "text-accent" : "text-error"}`}> + {h.priceChange >= 0 ? "+" : ""}{h.priceChange.toFixed(1)}% + + )}
- )} - {h.lastTraded && ( -
Traded: {new Date(h.lastTraded).toLocaleDateString("en-US", { month: "short", day: "numeric" })}
- )} +
Balance: {formatPrice(formatUnits(h.balance, 18))} tokens
+
+ Price:{" "} + {formatPrice(formatUnits(h.price, 18))} {RESERVE_LABEL} + {plotUsd != null && ({formatUsdValue(Number(formatUnits(h.price, 18)) * plotUsd)})} +
+ {h.entryPrice !== null && h.entryPrice > 0 && ( +
+ Entry:{" "} + {formatPrice(h.entryPrice)} {RESERVE_LABEL} + {plotUsd != null && ({formatUsdValue(h.entryPrice * plotUsd)})} +
+ )} + {h.lastTraded && ( +
Traded: {new Date(h.lastTraded).toLocaleDateString("en-US", { month: "short", day: "numeric" })}
+ )} +
))} + + )} {/* Donations — structured card */} {(hasDonationsReceived || (isOwnProfile && hasDonationsGiven)) && (