[Customer Portal][FE][Web] Add Project Hub, UI Shell, and Routing Infrastructure - #73
Merged
Rashmika998 merged 48 commits intoFeb 3, 2026
Conversation
Introduces a new Header component with sidebar toggle, brand, project switcher, search bar, and action buttons. Integrates project selection and navigation logic, and fetches project data using custom hooks.
Introduces a new Brand component in the header, displaying the WSO2 logo and 'Customer Portal' title using Oxygen UI components.
Introduces a new Actions component for the header, including a join community button, theme switcher, divider, and user profile menu. This modularizes header actions for improved maintainability and reusability.
Introduces a new ProjectSwitcher React component for the customer portal header, allowing users to switch between projects using a dropdown menu. The component displays project names and descriptions and notifies parent components when the selected project changes.
Introduces a new SearchBar component for the header using the Oxygen UI library. The component provides a small-sized search input with a placeholder for searching cases, tickets, or users.
Introduces a new UserProfile component that displays a user menu using the Oxygen UI library. The component handles profile, settings, and logout actions, integrating navigation for logout.
Introduces a new Footer component that utilizes the Oxygen UI Footer and pulls company name, terms, and privacy URLs from constants. This provides a reusable footer for the customer portal application.
Introduces tests for the Footer component to verify rendering of company name, terms of service, and privacy policy links with correct URLs. Mocks the @wso2/oxygen-ui Footer for isolated testing.
Introduces TypeScript interfaces for project list items, paginated project search responses, and user profile information. These models will be used to type API responses in the customer portal webapp.
Introduces TypeScript interfaces for pagination metadata and project search requests in the customer portal webapp. These models will help standardize request payloads for searching projects with pagination support.
Introduced mockProjects and mockUser exports in mockData.ts to provide sample data for project switcher and user menu components.
Introduces the ProjectHub component for displaying and navigating between projects. Handles loading, error, and empty states, and integrates logging for project loading events.
Introduces a new ProjectPage component that displays the project title and project ID from the URL. This component uses Oxygen UI components and is intended for the customer portal webapp.
Introduces the AppLayout component using Oxygen UI's AppShell. Integrates Header, Footer, and conditional SideBar components, and sets up routing with React Router's Outlet.
Adds empty CSS include array and configures server dependencies to inline '@wso2/oxygen-ui' and '@wso2/oxygen-ui-icons-react' for improved test environment setup.
Added inline documentation to the useLogger hook to clarify the purpose of context retrieval and error handling. This improves code readability and maintainability.
Added a JSDoc @returns annotation to the LoggerContext definition for improved documentation and type clarity.
Changed the import path from AppShellConstants to appLayoutConstants in Footer.tsx to reflect the updated file naming or structure.
Changed the import in Footer.test.tsx from AppShellConstants to appLayoutConstants to reflect the updated file naming or structure.
Introduces a new constants file defining navigation items, company information, and key URLs for the customer portal app layout.
Introduces a new constants file for API-related query keys, starting with the 'PROJECTS' key for project search API calls.
Replaces the placeholder App component with a full routing setup using react-router. Adds routes for ProjectHub, project-specific pages, and a fallback redirect. Wraps routes with AppLayout for consistent layout across pages.
Moved the import of the App component below other imports for improved readability and consistency with import grouping.
Introduces a new SideBar component with navigation and footer sections, supporting collapsed state, menu expansion, and project-based routing. Integrates navigation items from constants and includes a subscription widget and settings link.
Introduces a new SubscriptionWidget component for the side navigation bar. The widget displays subscription information and a 'View Details' button, and is hidden when the sidebar is collapsed.
Updated the import of JOIN_COMMUNITY_URL to use the correct path '@/constants/appLayoutConstants' instead of '@/constants/AppShellConstants'.
Refreshed pnpm-lock.yaml to include new and updated dependencies such as @asgardeo/react-router, react-router, esbuild, and related packages. This update ensures compatibility with recent package requirements and resolves dependency versions for the customer portal webapp.
Added @asgardeo/react-router@^1.0.31 and react-router@^7.1.5 to the dependencies in package.json to support routing and authentication integration.
Updated the SideBar component to render item icons without forcing a size of 20, allowing icons to use their default or inherited sizing.
Introduces unit tests for the SubscriptionWidget component to verify rendering behavior when collapsed and not collapsed, including UI elements and icon presence.
Changed the mock user's name, email, and avatar to generic values for improved anonymization and consistency in sample data.
v15a1
reviewed
Jan 30, 2026
Explicitly types the 'results' object as SearchProjectsResponse in useSearchProjects to improve type safety and clarity.
Contributor
Author
Note for reviewers:The ProjectHub and ProjectPage.tsx files have been added temporarily. |
cloby99
reviewed
Feb 2, 2026
Rashmika998
merged commit Feb 3, 2026
f70b132
into
wso2-open-operations:customer-portal-milestone-1
1 check passed
This was referenced Feb 3, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Purpose
This PR implements the first milestone of the customer portal, establishing the foundational application structure with routing, layout components, and project management features.
Goals
react-routerand@asgardeo/react-router.Approach
/leads to the Project Hub, and/:projectId/*handles project-specific dashboards.useInfiniteQuery) for theuseSearchProjectshook to support paginated project listing.AppLayoutcomponent that conditionally renders the Sidebar only when a specific project is selected.User stories
Walkthrough
Adds a router-based app structure for the customer portal: routing and App layout, header/sidebar/footer UI, project listing and pages, a paginated projects API hook with mocks, new constants/models, comprehensive tests, and updated test/vite config and package dependencies.
Changes
package.json,App.tsx,AppWithConfig.tsxreact-routerand@asgardeo/react-router; replaced placeholder App with a router implementation.useSearchProjects.ts,useSearchProjects.test.tsxuseSearchProjectshook usinguseInfiniteQuerywith paginated mock responses and tests.requests.ts,responses.ts,mockData.tsmockProjects/mockUsertest data.appLayoutConstants.ts,apiQueryKeys.tsAPP_SHELL_NAV_ITEMS, footer/company constants, andApiQueryKeys.AppLayout.tsx,ProjectHub.tsx,ProjectPage.tsxAppLayoutcomposing Header, SideBar, and Footer; ProjectHub page listing projects; ProjectPage template.Header.tsx,Brand.tsx,Actions.tsx,ProjectSwitcher.tsx,SearchBar.tsx,UserProfile.tsxSideBar.tsx,SubscriptionWidget.tsxSubscriptionWidget.Footer.tsx,LoggerContext.tsx,useLogger.tsuseLogger.vite.config.ts@wso2/oxygen-uidependencies in Vitest.Sequence Diagram
sequenceDiagram participant User participant App as App (Router) participant Header participant ProjectSwitcher participant API as useSearchProjects participant Router as React Router participant ProjectPage User->>App: Load application App->>Header: Render with onToggleSidebar Header->>API: Fetch projects (infinite) API-->>Header: Return paginated projects Header->>ProjectSwitcher: Provide projects + selection User->>ProjectSwitcher: Select project ProjectSwitcher->>Header: onProjectChange(key) Header->>Router: Navigate to /{key}/dashboard Router->>ProjectPage: Render project page ProjectPage-->>User: Display project view User->>Header: Navigate to Project Hub Header->>Router: Navigate to / Router->>App: Render ProjectHub App-->>User: Show project listAutomation tests
ScreenRecordings and screenshots
ProjectHub Page
ProjectHub to Project Dashboard Navigation
Screen.Recording.2026-01-29.at.22.18.02.mov
Project Dashboard Page
Light mode:

Dark Mode:

User Profile Dropdown
Light Mode

Dark Mode

Navigation between side nav bar tabs
Screen.Recording.2026-01-29.at.22.19.40.1.mov
Dark / Light / System mode toggle
Screen.Recording.2026-01-29.at.22.40.57.mov
Join Community Navigation
Screen.Recording.2026-01-29.at.22.44.50.mov
Terms and Conditions Navigation
Screen.Recording.2026-01-29.at.22.45.43.mov
Privacy Policy Navigation
Screen.Recording.2026-01-29.at.22.45.17.mov
Close(#49, #21)
Summary by CodeRabbit
New Features
Tests
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.