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))