diff --git a/web/src/app/manage/Manage.tsx b/web/src/app/manage/Manage.tsx index 1aed57a9..742039dc 100644 --- a/web/src/app/manage/Manage.tsx +++ b/web/src/app/manage/Manage.tsx @@ -19,8 +19,7 @@ fAbioarvxMkYAsBAwg5Tmd5cipU8ZHxdmK47jqZWtpv export const Manage = () => { const mockApiData = [ { - id: "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2", - symbol: "iBTC", + id: "IBIT", name: "iShares Bitcoin Trust", aum: 15941890385, nav: 39.72, @@ -28,8 +27,7 @@ export const Manage = () => { 'url("https://api.glam.systems/image/EMAbk6kYhQbvtpqWyfvDPVJBvD5isMZvQT5aM4TyCAeG.png")' }, { - id: "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2", - symbol: "iETH", + id: "IETH", name: "iShares Ethereum Trust", aum: 15941890385, nav: 39.72, @@ -37,8 +35,7 @@ export const Manage = () => { 'url("https://api.glam.systems/image/yurUzfjdrUH2ujsWwQkFsv8eQJiJwgbHQFUZtf5yqoV.png")' }, { - id: "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2", - symbol: "iSOL", + id: "ISOL", name: "iShares Solana Trust", aum: 15941890385, nav: 39.72, @@ -46,8 +43,7 @@ export const Manage = () => { 'url("https://api.glam.systems/image/fAbioarvxMkYAsBAwg5Tmd5cipU8ZHxdmK47jqZWtpv.png")' }, { - id: "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2", - symbol: "iBONK", + id: "IBNK", name: "iShares Bonk Trust", aum: 15941890385, nav: 39.72, @@ -75,7 +71,7 @@ export const Manage = () => { >
{position.symbol}
+{position.id}
{position.name}{` / ${fund.name}`}
Fees
Management Fee
{formatPercent(fund.fees.management)}Performance Fee
{formatPercent(fund.fees.performance)}Subscription Fee
{formatPercent(fund.fees.subscription)}Redemption Fee
{formatPercent(fund.fees.redemption)}Facts
-Share Class Asset
{fund.facts.fundAsset} @@ -373,9 +378,11 @@ export default function ProductPage() {Terms
-Terms
+High-Water Mark
diff --git a/web/src/app/products/products-overview.tsx b/web/src/app/products/products-overview.tsx index e3ef18bf..5fd30c0d 100644 --- a/web/src/app/products/products-overview.tsx +++ b/web/src/app/products/products-overview.tsx @@ -13,42 +13,37 @@ import { TableToolbarSearch } from "@carbon/react"; -import { formatDateFromTimestamp } from "../utils/format-number"; -import { useGlamProgram } from "../glam/glam-data-access"; +import { PublicKey } from "@solana/web3.js"; + import { useNavigate } from "react-router-dom"; -export default function ProductsOverview() { - const { accounts } = useGlamProgram(); - const navigate = useNavigate(); +import { + useGlamProgramAccount, + useFundPerfChartData +} from "../glam/glam-data-access"; +import { TextAlignCenter } from "@carbon/icons-react"; - let rows: any[] = []; - if (accounts.data) { - rows = accounts.data.map((account) => { - const fund = account.account; - const imageKey = - fund.shareClasses[0].toBase58() || "1111111111111111111111111111111111"; - return { - imageURL: `https://api.glam.systems/image/${imageKey}.png`, - id: account.publicKey.toBase58(), - name: fund.name, - symbol: fund.symbol, - share_classes_len: fund.shareClassesLen, - assets_len: fund.assetsLen, - fees_management: - fund.shareClassesMetadata[0].feeManagement / 1_000_000.0, - fees_performance: - fund.shareClassesMetadata[0].feePerformance / 1_000_000.0, - inception: Math.floor( - new Date(fund.shareClassesMetadata[0].launchDate).getTime() / 1000 - ), - status: fund.shareClassesMetadata[0].lifecycle.toUpperCase() - }; - }); - } +export default function ProductsOverview() { + const defaultFund = "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2"; + const rows = [ + { + id: defaultFund, + name: "Glam Investment Fund", + symbol: "GBS", + /*nav: 100.1, + aum: 13796.12,*/ + share_classes_len: 1, + assets_len: 3, + fees_management: 1.5, + fees_performance: 10, + inception: 1712189348, + status: "Active" + } + ]; const headers = [ { - key: "imageURL", + key: "", header: "" }, { @@ -93,6 +88,62 @@ export default function ProductsOverview() { } ]; + const navigate = useNavigate(); + + class FundModel { + key: PublicKey; + data: any; + + constructor(key: PublicKey, data: any) { + this.key = key; + this.data = data || {}; + } + + getImageUrl() { + const pubkey = + this.data?.shareClasses[0].toBase58() || + "1111111111111111111111111111111111"; + return `https://api.glam.systems/image/${pubkey}.png`; + } + + getManagementFee() { + return this.data?.shareClassesMetadata[0].feeManagement / 1_000_000.0; + } + getPerformanceFee() { + return this.data?.shareClassesMetadata[0].feePerformance / 1_000_000.0; + } + } + + let id = "AdXkDnJpFKqZeoUygLvm5dp2b5JGVPz3rEWfGCtB5Kc2"; + + let fundKey = new PublicKey(defaultFund); + try { + fundKey = new PublicKey(id || defaultFund); + } catch (_e) { + // pass + } + const fundId = fundKey.toString(); + + const { account } = useGlamProgramAccount({ fundKey }); + if (account.isLoading) { + return ""; //spinner + } + + const fundModel = new FundModel(fundKey, account.data); + + function formatNumber(value: number): string { + return new Intl.NumberFormat("en-US").format(value); + } + + function formatDateFromTimestamp(timestampStr: string): string { + const date = new Date(Number(timestampStr) * 1000); + return new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric" + }).format(date); + } + return (