diff --git a/src/components/layout/node-preview-panel.tsx b/src/components/layout/node-preview-panel.tsx index 994dc54..2ccf4a2 100644 --- a/src/components/layout/node-preview-panel.tsx +++ b/src/components/layout/node-preview-panel.tsx @@ -753,7 +753,7 @@ export function NodePreviewPanel({ node, onBack, schemas }: NodePreviewPanelProp {dateStr && ( {dateStr} )} - {sats !== null && ( + {!hideBoost && sats !== null && (
{sats} diff --git a/src/lib/__tests__/my-content-page.test.tsx b/src/lib/__tests__/my-content-page.test.tsx index 59b00ba..b6942ee 100644 --- a/src/lib/__tests__/my-content-page.test.tsx +++ b/src/lib/__tests__/my-content-page.test.tsx @@ -87,6 +87,7 @@ describe("MyContentPanel", () => { beforeEach(() => { vi.clearAllMocks() myContentUserOverrides = {} + mockGetL402Value = "" }) it("renders items with processing banner", async () => { @@ -189,7 +190,7 @@ describe("MyContentPanel", () => { expect(screen.queryByText("sats")).not.toBeInTheDocument() }) - it("hides boost sats display when isAdmin is true", async () => { + it("hides boost sats display for admin", async () => { mockApiGet.mockResolvedValue({ nodes: [ { @@ -213,6 +214,28 @@ describe("MyContentPanel", () => { }) expect(screen.queryByText("sats")).not.toBeInTheDocument() }) + + it("hides boost sats display for L402-only user (no pubkey)", async () => { + mockApiGet.mockResolvedValue({ + nodes: [ + { + node_type: "Tweet", + ref_id: "ref-1", + properties: { name: "Bitcoin is freedom", status: "complete", boost: 75 }, + }, + ], + totalCount: 1, + totalProcessing: 0, + }) + // L402-only: no pubKey but has a valid L402 token + myContentUserOverrides = { pubKey: "", routeHint: "", isAdmin: false } + mockGetL402Value = "l402-token-abc" + render( {}} />) + await waitFor(() => { + expect(screen.getByText("Bitcoin is freedom")).toBeInTheDocument() + }) + expect(screen.queryByText("sats")).not.toBeInTheDocument() + }) }) describe("MyContentPanel – Stakwork badge link", () => { diff --git a/src/lib/__tests__/node-preview-panel.test.tsx b/src/lib/__tests__/node-preview-panel.test.tsx index 31fca5a..3203cb9 100644 --- a/src/lib/__tests__/node-preview-panel.test.tsx +++ b/src/lib/__tests__/node-preview-panel.test.tsx @@ -385,9 +385,10 @@ describe("NodePreviewPanel – core property rendering", () => { }) }) - it("shows sats counter when boost is a positive number", async () => { + it("shows sats counter when boost is a positive number (non-contributor, non-admin)", async () => { const node = makeUnlockedNode({ boost: 50 }) mockApiGet.mockResolvedValue(makeGraphData(node)) + userStoreOverrides = { pubKey: "03other", routeHint: "", isAdmin: false } render() @@ -397,6 +398,32 @@ describe("NodePreviewPanel – core property rendering", () => { }) }) + it("hides sats counter when contributor (hideBoost=true)", async () => { + const nodeWithPubkey = makeUnlockedNode({ boost: 50, pubkey: "03abc" }) + mockApiGet.mockResolvedValue(makeGraphData(nodeWithPubkey)) + userStoreOverrides = { pubKey: "03abc", routeHint: "", isAdmin: false } + + render() + + await waitFor(() => { + expect(screen.getByText("Test Node")).toBeInTheDocument() + }) + expect(screen.queryByText("sats")).toBeNull() + }) + + it("hides sats counter when admin (hideBoost=true)", async () => { + const node = makeUnlockedNode({ boost: 99 }) + mockApiGet.mockResolvedValue(makeGraphData(node)) + userStoreOverrides = { pubKey: "03admin", routeHint: "", isAdmin: true } + + render() + + await waitFor(() => { + expect(screen.getByText("Test Node")).toBeInTheDocument() + }) + expect(screen.queryByText("sats")).toBeNull() + }) + it("does not render core properties row when none of status/date/boost are present", async () => { const node = makeUnlockedNode({}) mockApiGet.mockResolvedValue(makeGraphData(node))