Skip to content

feat(web): Add banner to notify user when permissions are syncing for the first time#852

Merged
brendan-kellam merged 3 commits intomainfrom
bkellam/fix-SOU-314
Feb 4, 2026
Merged

feat(web): Add banner to notify user when permissions are syncing for the first time#852
brendan-kellam merged 3 commits intomainfrom
bkellam/fix-SOU-314

Conversation

@brendan-kellam
Copy link
Contributor

@brendan-kellam brendan-kellam commented Feb 4, 2026

Problem

There can be a delay between when a account is created and it's permissions are synced for the first time. This creates user confusion since all repositories will not be visible until this permission sync completes.

Solution

This PR adds a notification banner that is displayed at the top while permissions are syncing for the first time for the user.

permission-syncing.mp4

Fixes #817

Summary by CodeRabbit

  • New Features
    • Added an in-app notification banner that informs users when repository permissions are being synced for the first time.
    • Introduced a new alert UI component to standardize and improve informational and status messages across the app.
    • Updated entitlements to enable "anonymous-access" for the self-hosted Enterprise Unlimited plan.

@github-actions

This comment has been minimized.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2026

Caution

Review failed

The pull request is closed.

Walkthrough

Adds a permission-sync notification banner and supporting API/UI: server route to report first-time permission sync status, client polling and banner component, new Alert UI primitives, entitlement update, and changelog entry.

Changes

Cohort / File(s) Summary
Changelog
CHANGELOG.md
Added Unreleased "Added" entry documenting the permission-sync notification banner (refs PR #852).
Entitlements
packages/shared/src/entitlements.ts
Updated plan entitlements: added anonymous-access to self-hosted:enterprise-unlimited; arrays reformatted to multiline.
Server API
packages/web/src/app/api/(server)/ee/permissionSyncStatus/route.ts
New GET route returning PermissionSyncStatusResponse { hasPendingFirstSync }; validates permission-syncing entitlement, queries accounts and latest permissionSyncJobs to determine pending-first-sync state; returns structured service errors for auth/entitlement failures.
Client API
packages/web/src/app/api/(client)/client.ts
Added getPermissionSyncStatus() client function calling /api/ee/permissionSyncStatus, returns typed PermissionSyncStatusResponse or ServiceError.
Permission Sync UI
packages/web/src/app/[domain]/components/permissionSyncBanner.tsx, packages/web/src/app/[domain]/layout.tsx
New PermissionSyncBanner component using react-query to poll status (conditional refetch), tracks prior state to trigger router.refresh() when sync completes; layout imports and conditionally renders banner based on session and permission-syncing entitlement.
UI primitives
packages/web/src/components/ui/alert.tsx
New Alert component suite (Alert, AlertTitle, AlertDescription, AlertAction) with variant styling and accessibility attributes; used by the banner.

Sequence Diagram(s)

sequenceDiagram
    participant Browser as Browser/Client
    participant Banner as PermissionSyncBanner
    participant ReactQuery as React Query
    participant APIClient as API Client
    participant Server as Server API
    participant DB as Database

    Browser->>Banner: Mount
    Banner->>ReactQuery: useQuery(getPermissionSyncStatus)
    loop while hasPendingFirstSync
        ReactQuery->>APIClient: getPermissionSyncStatus()
        APIClient->>Server: GET /api/ee/permissionSyncStatus
        Server->>DB: Query accounts + latest permissionSyncJobs
        DB-->>Server: account sync data
        Server-->>APIClient: PermissionSyncStatusResponse(hasPendingFirstSync)
        APIClient-->>ReactQuery: response
        ReactQuery-->>Banner: update status
        alt pending
            Banner->>Browser: show Alert banner (spinner)
        else completed
            Banner->>Browser: router.refresh(), hide banner
        end
    end
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly Related PRs

Suggested Reviewers

  • msukkari
🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly and specifically describes the main change: adding a banner to notify users when permissions are syncing for the first time, which directly aligns with the primary objective of the changeset.
Linked Issues check ✅ Passed The PR partially addresses issue #817 by providing visual feedback (a notification banner) during permission syncing, but does not implement pre-fetching/prioritizing repos or progress metrics as suggested in the feature request.
Out of Scope Changes check ✅ Passed All changes are directly related to implementing the permission sync banner feature: UI component, server endpoint, client API call, entitlements mapping, and layout integration. The new Alert component provides necessary UI foundation for the banner.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bkellam/fix-SOU-314

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 and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In `@packages/web/src/app/`[domain]/components/permissionSyncBanner.tsx:
- Around line 23-27: The refetchInterval callback currently checks
query.state.data for truthiness, but that is the raw response object and always
truthy once loaded, causing infinite polling; update the logic in the
refetchInterval function to inspect the hasPendingFirstSync property on the data
(e.g., return query.state.data?.hasPendingFirstSync ? POLL_INTERVAL_MS : false)
so polling continues only while hasPendingFirstSync is true; reference symbols:
refetchInterval, query.state.data, hasPendingFirstSync, POLL_INTERVAL_MS.

In `@packages/web/src/app/api/`(server)/ee/permissionSyncStatus/route.ts:
- Around line 16-18: Update the JSDoc comment on the permission sync route so
the grammar is correct: change "Returns whether a user has a account that has
it's permissions synced for the first time." to "Returns whether a user has an
account that has its permissions synced for the first time." — edit the comment
above the exported route handler in route.ts (the file-level JSDoc for the
permissionSyncStatus endpoint).
- Around line 23-27: Replace the incorrect error code used in the permission
sync route: in the code path that returns serviceErrorResponse with statusCode
StatusCodes.FORBIDDEN and ErrorCode.NOT_FOUND, change the error code to
ErrorCode.INSUFFICIENT_PERMISSIONS (keep the existing message and status);
update the call in the route handler (the function returning
serviceErrorResponse in route.ts) so the error code matches the 403 semantics
and existing entitlement/plan denial conventions.
🧹 Nitpick comments (1)
packages/web/src/app/api/(server)/ee/permissionSyncStatus/route.ts (1)

1-1: Unnecessary 'use server' directive for route handlers.

Route handlers in Next.js App Router are server-side by default. The 'use server' directive is specifically for Server Actions (functions called from client components). This directive is unnecessary here and could cause confusion.

🔧 Suggested fix
-'use server';
-
 import { apiHandler } from "@/lib/apiHandler";

@brendan-kellam brendan-kellam merged commit fb358d8 into main Feb 4, 2026
8 of 9 checks passed
@brendan-kellam brendan-kellam deleted the bkellam/fix-SOU-314 branch February 4, 2026 23:59
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.

[FR] Improve initial login experience during permission syncing (repo sync delay)

1 participant