ReviewOS

stacks/bench-review

home: empty state for first-time + zero-review visitors

#43
Closed glennmichael123 opened this 10 days ago ·
10 days ago

First-time visitors who aren't logged in see the same hero + recent reviews as everyone else, with no obvious next step. We should call out what the site does and where to start.

Scope

  • When !auth.isAuthenticated() on the home page:
    • Replace the hero CTA with a clear "Find a judge" / "Browse courthouses" pair
    • Add a "How it works" three-step section: 1. Find your judge / courthouse, 2. Read what others said, 3. Share your own experience
    • Surface the "Sign up to share your experience" CTA at the section break, not just in the nav
  • When auth.isAuthenticated() but they have zero reviews of their own: surface a "Write your first review" CTA above the recently-published feed.
  • Once MyReviewsView ships, link "Your reviews" prominently for return visitors.

Acceptance

  • A logged-out visitor lands on a home page that explains the site and gives a clear next click.
  • A logged-in visitor with zero reviews gets a personalized nudge to participate.
  • The visual hierarchy makes "what to do next" obvious within 3 seconds of landing.
9 days ago

Shipped — personalized empty-state CTA band on the home page.

Three tiers of personalization in resources/views/home.stx:

  • Anonymous visitor → amber-toned banner: "Help others see the bench more clearly. Sign up in a minute and share what working with a judge was actually like. Anonymous if you prefer." Paired CTAs: `Create an account` + `Browse the directory`.
  • Signed in with zero reviews → emerald-toned banner: "Write your first review. Pick a judge you've appeared before..." Paired CTAs: `Write a review` + `Find a judge first`.
  • Signed in with at least one review → both banners hidden. The recent-reviews feed below is the real signal for this audience; no CTA noise needed.

Plumbing:

  • Pulled in useStore('auth') + useStore('profile').
  • onMount now triggers profileStore.fetchMyReviews() when authenticated (skipped for anonymous so we don't 401 needlessly).
  • Two derived signals — isAnonymous and showWriteFirstCta — gate the banners via x-class hidden so the inner bindings stay subscribed across auth-state changes.
  • showWriteFirstCta requires profileStore.loaded() to be true so the banner doesn't flash before the fetch resolves.

The "How Bench Review works" 3-step section was already on the page — I didn't replicate it. It correctly stays visible to everyone (anonymous + signed-in) as background context. The personalization is downstream of it, at the section break, exactly where the original issue called for the social proof CTA.

Anonymous mention: the copy says "Anonymous if you prefer" pre-emptively — the actual anonymous-review feature lives in #36 and is the followup that makes that promise real.

Sign in to comment on this issue.