Skip to content

feat(frontend): add illustrated empty states for registry and agents pages - #498

Open
MissBlue00 wants to merge 3 commits into
Stellar-Ecosystem:mainfrom
MissBlue00:feat/empty-states-registry-agents
Open

feat(frontend): add illustrated empty states for registry and agents pages#498
MissBlue00 wants to merge 3 commits into
Stellar-Ecosystem:mainfrom
MissBlue00:feat/empty-states-registry-agents

Conversation

@MissBlue00

@MissBlue00 MissBlue00 commented Jul 29, 2026

Copy link
Copy Markdown

Closes #392

Replaces bare text empty states with the new EmptyState reusable component, featuring inline SVG illustrations, clear explanations, and contextual CTA buttons.

Registry page:

  • Empty registry -> 'The registry is empty' with CTA to register a service
  • No search results -> 'No matching services' with CTA to clear search
  • Empty category -> 'Empty category' with CTA to show all categories

Agents page:

  • No agents -> 'No agents registered' with CTA to register an agent

Distinct from loading (skeletons) and error (error card + retry) states.

Summary by CodeRabbit

  • New Features
    • Added consistent empty-state screens for the agents and service registries.
    • Added reusable layouts with contextual icons, titles, messages, and actions.
    • Added clearer guidance for empty listings, searches, and category-filtered results.
    • Added actions to register an agent or service, clear searches, and view all categories.

…pages

Replaces bare text empty states with illustrated EmptyState component
featuring inline SVG icons, clear explanations, and contextual CTAs.

Changes:
- EmptyState reusable component (card, icon circle, title, message, action CTA)
- emptyStateIcons: EmptyRegistryIcon, EmptyAgentsIcon, SearchEmptyIcon, CategoryEmptyIcon
- Registry page: empty, search-no-results, and empty-category states
- Agents page: empty-registry state

Closes Stellar-Ecosystem#392
@drips-wave

drips-wave Bot commented Jul 29, 2026

Copy link
Copy Markdown

@MissBlue00 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@coderabbitai

coderabbitai Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The frontend adds a reusable EmptyState component and four shared SVG icons. The agents page uses a registration empty state. The registry page renders distinct empty states for search results, category filters, and an empty registry.

Changes

Empty-state UI

Layer / File(s) Summary
Reusable empty-state component
frontend/components/EmptyState.tsx
Defines shared empty-state content and optional link or button actions.
Empty-state icon set
frontend/lib/emptyStateIcons.tsx
Adds a shared SVG helper and four themed empty-state icons.
Agents and registry integrations
frontend/app/agents/page.tsx, frontend/app/registry/page.tsx
The pages render contextual empty-state content with registration or recovery actions.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related issues

Possibly related PRs

Suggested reviewers: ritik4ever

Sequence Diagram(s)

sequenceDiagram
  participant RegistryPage
  participant EmptyState
  participant LinkOrButton
  RegistryPage->>EmptyState: Provide contextual icon, message, and action
  EmptyState->>LinkOrButton: Render link or button action
  LinkOrButton-->>RegistryPage: Clear filters or navigate to registration
Loading
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: illustrated empty states for the registry and agents pages.
Linked Issues check ✅ Passed The changes satisfy issue #392 by adding distinct empty states, preserving loading and error states, and providing relevant actions.
Out of Scope Changes check ✅ Passed The shared component, icons, and contextual registry states directly support the empty-state requirements in issue #392.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
frontend/components/EmptyState.tsx (1)

7-11: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Enforce exactly one action mode.

Both href and onClick are optional, so invalid objects such as { label } compile and render a button with no handler, while { href, onClick } silently ignores onClick. Use a discriminated union requiring either href or onClick.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/components/EmptyState.tsx` around lines 7 - 11, Update the action
type in EmptyState to a discriminated union that requires exactly one mode: an
action with label and href but no onClick, or an action with label and onClick
but no href. Ensure the component’s rendering logic handles both variants
without allowing an action with neither or both properties.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@frontend/components/EmptyState.tsx`:
- Around line 7-11: Update the action type in EmptyState to a discriminated
union that requires exactly one mode: an action with label and href but no
onClick, or an action with label and onClick but no href. Ensure the component’s
rendering logic handles both variants without allowing an action with neither or
both properties.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 4f8394f2-91fe-4db3-9436-197f3892f4d5

📥 Commits

Reviewing files that changed from the base of the PR and between a3fd824 and 450b522.

📒 Files selected for processing (4)
  • frontend/app/agents/page.tsx
  • frontend/app/registry/page.tsx
  • frontend/components/EmptyState.tsx
  • frontend/lib/emptyStateIcons.tsx

@ritik4ever

Copy link
Copy Markdown
Collaborator

Hi @MissBlue00,

This PR could not be merged because it has merge conflicts with the target branch.

Please resolve the merge conflicts, push the updated changes, and the PR can be reviewed and merged.

Thank you!

@MissBlue00
MissBlue00 requested a review from ritik4ever as a code owner August 1, 2026 09:59
@MissBlue00

Copy link
Copy Markdown
Author

@ritik4ever The conflict has been resolved, please review and merge

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
frontend/app/registry/page.tsx (1)

147-156: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Render the contextual EmptyState variants.

This branch still renders the old plain message. It never uses EmptyState, EmptyRegistryIcon, SearchEmptyIcon, or CategoryEmptyIcon, and it provides no CTA. Replace this branch with:

  • Search results: SearchEmptyIcon and an action that clears query.
  • Category results: CategoryEmptyIcon and an action that selects 'all'.
  • Empty registry: EmptyRegistryIcon and a link to the existing service-registration route.

Keep the loading and error branches unchanged.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/app/registry/page.tsx` around lines 147 - 156, Replace the plain
no-results markup in the registry page’s empty branch with the contextual
EmptyState variants: use SearchEmptyIcon with an action clearing query for
searches, CategoryEmptyIcon with an action selecting 'all' for category filters,
and EmptyRegistryIcon with a link to the existing service-registration route
when the registry is empty. Keep the loading and error branches unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@frontend/app/registry/page.tsx`:
- Around line 147-156: Replace the plain no-results markup in the registry
page’s empty branch with the contextual EmptyState variants: use SearchEmptyIcon
with an action clearing query for searches, CategoryEmptyIcon with an action
selecting 'all' for category filters, and EmptyRegistryIcon with a link to the
existing service-registration route when the registry is empty. Keep the loading
and error branches unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 00b88d24-da74-45ee-a94d-2dc39265020d

📥 Commits

Reviewing files that changed from the base of the PR and between 450b522 and 4bbeeee.

📒 Files selected for processing (1)
  • frontend/app/registry/page.tsx

…nent

- Add SearchEmptyIcon with 'Clear search' action for no search results
- Add CategoryEmptyIcon with 'Show all categories' action for empty category filter
- Add EmptyRegistryIcon with 'Register a Service' link for empty registry
- Matches the pattern used in agents page

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@frontend/app/registry/page.tsx`:
- Around line 158-160: Update the empty-state message in the category view to
resolve the active category through the matching CATEGORY_FILTERS entry and
interpolate its user-facing label instead of activeCategory, while preserving
the existing fallback behavior and action.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6766b388-ef8e-4fff-9d73-cdc292c4c8d0

📥 Commits

Reviewing files that changed from the base of the PR and between 4bbeeee and 6f8059f.

📒 Files selected for processing (1)
  • frontend/app/registry/page.tsx

Comment on lines +158 to +160
title="Empty category"
message={`No active services in the "${activeCategory}" category.`}
action={{ label: 'Show all categories', onClick: () => setActive('all') }}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the category display label in the empty-state copy.

activeCategory stores c.value, while the tabs already expose a separate c.label at Lines 112-123. If the value is an internal slug, this message shows the slug to users instead of the category name. Resolve the matching CATEGORY_FILTERS entry and interpolate its label.

Proposed fix
-              message={`No active services in the "${activeCategory}" category.`}
+              message={`No active services in the "${
+                CATEGORY_FILTERS.find((c) => c.value === activeCategory)?.label ?? activeCategory
+              }" category.`}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
title="Empty category"
message={`No active services in the "${activeCategory}" category.`}
action={{ label: 'Show all categories', onClick: () => setActive('all') }}
title="Empty category"
message={`No active services in the "${
CATEGORY_FILTERS.find((c) => c.value === activeCategory)?.label ?? activeCategory
}" category.`}
action={{ label: 'Show all categories', onClick: () => setActive('all') }}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/app/registry/page.tsx` around lines 158 - 160, Update the
empty-state message in the category view to resolve the active category through
the matching CATEGORY_FILTERS entry and interpolate its user-facing label
instead of activeCategory, while preserving the existing fallback behavior and
action.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Frontend: no empty states for a registry or agent list with no entries

2 participants