Difficulty: Intermediate
Type: feature
Background
The README lists "upgrade/renew placeholders" among the member-dashboard MVP features, and the mock developer controls include a "Denied Resource" scenario preset (free tier user denied access to Alpha Docs) specifically for testing this state.
Problem
The denied-resource state currently shows an upgrade/renew placeholder with no real interaction — it doesn't link anywhere or explain what upgrading/renewing would involve, leaving a dead-end UX for members who hit a gate.
Expected outcome
When a member is denied access to a gated resource due to tier/expiration, the denied state clearly explains why (using policy/membership data already available from /v1/policies and /v1/members/:address/membership) and the CTA button leads to a dedicated (still-placeholder-content-fine) upgrade/renew info page instead of doing nothing.
Suggested implementation
- Update the
components/gated.tsx denied-state rendering to surface the specific reason (expired vs. insufficient tier vs. no roles) using existing membership/policy data.
- Add a simple
/upgrade (or similar) route explaining next steps, linked from the CTA.
- Verify the "Denied Resource" and "Expired Member" mock scenario presets both route to sensible denied-state copy.
- Add tests (or Storybook-style manual verification steps in the PR) covering each denial reason.
Acceptance criteria
Likely affected files/directories
components/gated.tsx
app/ (new upgrade/renew route)
lib/api/mock.ts
Difficulty: Intermediate
Type: feature
Background
The README lists "upgrade/renew placeholders" among the member-dashboard MVP features, and the mock developer controls include a "Denied Resource" scenario preset (free tier user denied access to Alpha Docs) specifically for testing this state.
Problem
The denied-resource state currently shows an upgrade/renew placeholder with no real interaction — it doesn't link anywhere or explain what upgrading/renewing would involve, leaving a dead-end UX for members who hit a gate.
Expected outcome
When a member is denied access to a gated resource due to tier/expiration, the denied state clearly explains why (using policy/membership data already available from
/v1/policiesand/v1/members/:address/membership) and the CTA button leads to a dedicated (still-placeholder-content-fine) upgrade/renew info page instead of doing nothing.Suggested implementation
components/gated.tsxdenied-state rendering to surface the specific reason (expired vs. insufficient tier vs. no roles) using existing membership/policy data./upgrade(or similar) route explaining next steps, linked from the CTA.Acceptance criteria
Likely affected files/directories
components/gated.tsxapp/(new upgrade/renew route)lib/api/mock.ts