Skip to content

Refactor/router create browser router - #1694

Open
TanCodeX wants to merge 11 commits into
durdana3105:mainfrom
TanCodeX:refactor/router-create-browser-router
Open

Refactor/router create browser router#1694
TanCodeX wants to merge 11 commits into
durdana3105:mainfrom
TanCodeX:refactor/router-create-browser-router

Conversation

@TanCodeX

@TanCodeX TanCodeX commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #1535

This PR refactors the application's routing architecture by migrating from a single, flat <Routes> configuration to React Router v6 Data Routers using createBrowserRouter.

The routing configuration is now organized into feature-specific modules with shared layouts, making the codebase significantly easier to maintain and extend while preserving the existing lazy-loading behavior.

What Changed

Routing Architecture

  • Replaced the existing <BrowserRouter><Routes> implementation with createBrowserRouter.
  • Introduced RouterProvider as the application's routing entry point.
  • Split the routing configuration into feature-based modules.

New Layout System

Added reusable layout components under src/layouts/:

  • RootLayout

    • Hosts global UI components including:

      • SplashScreen
      • Suspense boundary for lazy-loaded routes
      • CookieConsentBanner
      • Chatbot
  • MainLayout

    • Provides the shared application shell with:

      • Navbar
      • Conditional StreakBadge
  • Protected layout wrappers

    • ProtectedLayout
    • ProtectedMentorLayout
    • AdminLayout

These layouts centralize shared UI and authentication logic while reducing duplication across routes.

Feature-Based Route Modules

Created a dedicated src/router/ directory with modular route definitions:

  • public.routes.tsx
  • auth.routes.tsx
  • protected.routes.tsx
  • settings.routes.tsx
  • mentor.routes.tsx
  • admin.routes.tsx
  • index.tsx (aggregates all routes into a single router instance)

App Entry Point

Simplified App.tsx to focus exclusively on application-wide providers before rendering:

<RouterProvider router={router} />

Benefits

  • Improved route organization through feature-based modules.
  • Better separation of concerns using reusable layout components.
  • Easier maintenance as the application grows.
  • Cleaner scalability for future features and route additions.
  • Reduced likelihood of merge conflicts by avoiding a single monolithic routing file.
  • Preserved lazy loading while enabling cleaner nested routing boundaries.

Testing

  • Verified application startup with the new RouterProvider.
  • Confirmed navigation across public, authenticated, mentor, admin, and settings routes.
  • Verified authentication guards continue to function correctly.
  • Confirmed lazy-loaded pages render correctly within the shared Suspense boundary.
  • Ensured shared layouts (Navbar, SplashScreen, CookieConsentBanner, Chatbot, and StreakBadge) behave as expected.

Notes

  • Existing TypeScript issues in useResources and useSkillEndorsements were present prior to this refactor and are unrelated to the routing migration.
  • No functional changes were made to application behavior beyond the routing architecture refactor.

Checklist

  • Migrated to createBrowserRouter
  • Introduced nested layout components
  • Split routes into feature-specific modules
  • Preserved lazy loading
  • Verified existing routes continue to function

Summary by CodeRabbit

  • New Features

    • Implemented centralized routing using a router provider across public, auth, protected, mentor, admin, and settings pages.
    • Added shared root and role-aware layouts (protected, mentor, admin) with an auth-aware splash/loading experience.
    • Enabled lazy-loaded pages and suspense-based loading for improved navigation performance.
    • Redirect authenticated visitors from the public home to the dashboard.
  • Bug Fixes / Security

    • Enforced Row Level Security for peer submissions and peer reviews so policies are applied consistently.
  • Tests

    • Improved upload photo and Contact test setups for more reliable mocks and localStorage cleanup.

@vercel

vercel Bot commented Jul 5, 2026

Copy link
Copy Markdown

@TanCodeX is attempting to deploy a commit to the durdana3105's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@TanCodeX, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 48 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 919d13e7-1f5e-481a-8ff7-897198193f56

📥 Commits

Reviewing files that changed from the base of the PR and between c28c52f and e2a8b7c.

📒 Files selected for processing (4)
  • backend/tests/uploadPhoto.test.js
  • src/App.tsx
  • src/hooks/useSkillEndorsements.ts
  • supabase/migrations/20260617000000_consolidate_rls_policies.sql
📝 Walkthrough

Walkthrough

Routing is migrated from an in-component Routes tree to a createBrowserRouter configuration. Routes are split into feature modules, nested layouts provide shared UI and protection, and RouterProvider mounts the assembled router. Additional changes adjust Supabase typing, enforce peer-table RLS, and harden test setup.

Changes

Nested routing architecture

Layer / File(s) Summary
Shared and protected layout shells
src/layouts/*
Adds root, main, admin, protected, and mentor layouts for global UI, routed content, authentication, and role-based access.
Feature route definitions
src/router/*.routes.tsx
Splits public, authentication, protected, settings, mentor, and admin routes into lazy-loaded route configurations.
Router assembly and application wiring
src/router/index.tsx, src/App.tsx
Creates the browser router from feature route arrays and mounts it through RouterProvider within the existing providers.

Data access and security updates

Layer / File(s) Summary
Hook query adjustments
src/hooks/useResources.ts, src/hooks/useSkillEndorsements.ts
Adjusts saved-resource query typing and casts Supabase endorsement queries through any.
Peer table RLS enforcement
supabase/migrations/20260617000000_consolidate_rls_policies.sql
Enables RLS on public.peer_submissions and public.peer_reviews.

Test setup maintenance

Layer / File(s) Summary
Test setup corrections
backend/tests/uploadPhoto.test.js, src/pages/Contact.test.tsx
Updates the upload cleanup path and mock behavior, and guards localStorage clearing in Contact tests.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant App
  participant RouterProvider
  participant RootLayout
  participant RouteLayout
  participant LazyPage
  App->>RouterProvider: mount router
  RouterProvider->>RootLayout: render root route
  RootLayout->>RouteLayout: render matched nested layout
  RouteLayout->>LazyPage: render matched lazy page through Outlet
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also includes unrelated backend tests, hook tweaks, and an RLS migration that are outside the routing refactor scope. Move the backend test, hook, and migration changes into separate PRs so this PR stays focused on the routing architecture refactor.
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 (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and directly reflects the router refactor to createBrowserRouter.
Linked Issues check ✅ Passed The routing refactor matches the issue goals: nested data routers, feature modules, shared layouts, and lazy-loaded routes are introduced.
✨ 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.

@TanCodeX

TanCodeX commented Jul 6, 2026

Copy link
Copy Markdown
Contributor Author

@durdana3105 Please review!!

@TanCodeX

Copy link
Copy Markdown
Contributor Author

@durdana3105 Please review and merge!

@durdana3105

Copy link
Copy Markdown
Owner

PLEASE RESOLVE MERGE CONFLICTS

@TanCodeX

Copy link
Copy Markdown
Contributor Author

@durdana3105 Merge conflict resolved.

@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: 3

🤖 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 `@src/layouts/MainLayout.tsx`:
- Around line 1-2: Update MainLayout to import Suspense and wrap the Outlet
component with a Suspense boundary, using the existing or appropriate loading
fallback. Keep Navbar outside this boundary so it remains mounted during lazy
route transitions.

In `@src/layouts/ProtectedLayout.tsx`:
- Around line 7-9: Centralize MainLayout to prevent remounts across route
branches. In src/layouts/ProtectedLayout.tsx#L7-L9,
src/layouts/ProtectedMentorLayout.tsx#L7-L9, and
src/layouts/AdminLayout.tsx#L7-L9, replace MainLayout with Outlet and import
Outlet from react-router-dom. In src/router/public.routes.tsx#L19-L28, remove
the MainLayout parent route and export the public routes as a flat array; nest
the unified route tree under one top-level MainLayout parent in the central
router configuration.

In `@src/router/public.routes.tsx`:
- Around line 13-16: Update IndexRoute to use the loading state returned by
useAuth(); render the existing loading spinner while authentication is
unresolved, then preserve the current user-based redirect to /dashboard or Index
page once loading completes.
🪄 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: 2d87a971-e544-44fa-96c2-242635462c1c

📥 Commits

Reviewing files that changed from the base of the PR and between b703a23 and 9f3294d.

📒 Files selected for processing (13)
  • src/App.tsx
  • src/layouts/AdminLayout.tsx
  • src/layouts/MainLayout.tsx
  • src/layouts/ProtectedLayout.tsx
  • src/layouts/ProtectedMentorLayout.tsx
  • src/layouts/RootLayout.tsx
  • src/router/admin.routes.tsx
  • src/router/auth.routes.tsx
  • src/router/index.tsx
  • src/router/mentor.routes.tsx
  • src/router/protected.routes.tsx
  • src/router/public.routes.tsx
  • src/router/settings.routes.tsx

Comment on lines +1 to +2
import React from "react";
import { Outlet } from "react-router-dom";

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Wrap <Outlet /> with <Suspense> to handle lazy-loaded routes without unmounting the navigation.

The feature route modules use React.lazy() for page components. Without a <Suspense> boundary inside MainLayout, navigating to a lazy-loaded route will suspend the layout hierarchy up to the nearest root boundary (likely in App.tsx), causing the Navbar to completely unmount and flash during page transitions.

Wrapping <Outlet /> ensures the navigation UI remains visible while the lazy page loads.

🛠️ Proposed fix
-import React from "react";
+import React, { Suspense } from "react";
 import { Outlet } from "react-router-dom";
 
 // ... existing imports ...
 
 export default function MainLayout() {
   const { user } = useAuth();
   return (
     <>
       <Navbar />
       {user && <StreakBadge />}
-      <Outlet />
+      <Suspense fallback={
+        <div className="flex min-h-[calc(100vh-4rem)] items-center justify-center">
+          <div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" />
+        </div>
+      }>
+        <Outlet />
+      </Suspense>
     </>
   );
 }

Also applies to: 10-14

🤖 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 `@src/layouts/MainLayout.tsx` around lines 1 - 2, Update MainLayout to import
Suspense and wrap the Outlet component with a Suspense boundary, using the
existing or appropriate loading fallback. Keep Navbar outside this boundary so
it remains mounted during lazy route transitions.

Comment on lines +7 to +9
<ProtectedRoute>
<MainLayout />
</ProtectedRoute>

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.

🚀 Performance & Scalability | 🟠 Major | 🏗️ Heavy lift

Prevent layout remounts and duplicate API calls by centralizing MainLayout.

Because <MainLayout /> is independently defined as a nested element inside ProtectedLayout, ProtectedMentorLayout, AdminLayout, and the publicRoutes configuration, React Router evaluates each as a distinct layout branch. When a user navigates across these boundaries (e.g., from / to /dashboard, or /dashboard to /mentor-dashboard), React Router fully unmounts and remounts MainLayout. This destroys local Navbar state and triggers StreakBadge to unnecessarily re-fetch data from the backend on every layout transition.

To fix this, render <Outlet /> inside these layout guards instead of <MainLayout />. Then, in your central router configuration (e.g., src/router/index.tsx), wrap the unified route tree that requires the global shell with a single, top-level <MainLayout /> parent route.

  • src/layouts/ProtectedLayout.tsx#L7-L9: Replace <MainLayout /> with <Outlet /> (ensure Outlet is imported from react-router-dom).
  • src/layouts/ProtectedMentorLayout.tsx#L7-L9: Replace <MainLayout /> with <Outlet /> (ensure Outlet is imported).
  • src/layouts/AdminLayout.tsx#L7-L9: Replace <MainLayout /> with <Outlet /> (ensure Outlet is imported).
  • src/router/public.routes.tsx#L19-L28: Remove the <MainLayout /> parent object and directly export the flat array of public routes, so they can be nested under the central <MainLayout /> in your router configuration.
📍 Affects 4 files
  • src/layouts/ProtectedLayout.tsx#L7-L9 (this comment)
  • src/layouts/ProtectedMentorLayout.tsx#L7-L9
  • src/layouts/AdminLayout.tsx#L7-L9
  • src/router/public.routes.tsx#L19-L28
🤖 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 `@src/layouts/ProtectedLayout.tsx` around lines 7 - 9, Centralize MainLayout to
prevent remounts across route branches. In
src/layouts/ProtectedLayout.tsx#L7-L9,
src/layouts/ProtectedMentorLayout.tsx#L7-L9, and
src/layouts/AdminLayout.tsx#L7-L9, replace MainLayout with Outlet and import
Outlet from react-router-dom. In src/router/public.routes.tsx#L19-L28, remove
the MainLayout parent route and export the public routes as a flat array; nest
the unified route tree under one top-level MainLayout parent in the central
router configuration.

Comment on lines +13 to +16
const IndexRoute = () => {
const { user } = useAuth();
return user ? <Navigate to="/dashboard" replace /> : <Index />;
};

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

Handle the loading state to prevent unauthenticated UI flashing.

Because useAuth() loads asynchronously, user is initially null. When an authenticated user visits /, the application will briefly render the <Index /> page before user is populated and triggers the redirect to /dashboard.

Check the loading state and render a loading spinner until the authentication resolution is complete.

🛠️ Proposed fix
 const IndexRoute = () => {
-  const { user } = useAuth();
-  return user ? <Navigate to="/dashboard" replace /> : <Index />;
+  const { user, loading } = useAuth();
+  
+  if (loading) {
+    return (
+      <div className="flex min-h-screen items-center justify-center">
+        <div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" />
+      </div>
+    );
+  }
+  
+  return user ? <Navigate to="/dashboard" replace /> : <Index />;
 };
📝 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
const IndexRoute = () => {
const { user } = useAuth();
return user ? <Navigate to="/dashboard" replace /> : <Index />;
};
const IndexRoute = () => {
const { user, loading } = useAuth();
if (loading) {
return (
<div className="flex min-h-screen items-center justify-center">
<div className="h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent" />
</div>
);
}
return user ? <Navigate to="/dashboard" replace /> : <Index />;
};
🧰 Tools
🪛 GitHub Check: test

[warning] 13-13:
Fast refresh only works when a file only exports components. Move your component(s) to a separate file

🤖 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 `@src/router/public.routes.tsx` around lines 13 - 16, Update IndexRoute to use
the loading state returned by useAuth(); render the existing loading spinner
while authentication is unresolved, then preserve the current user-based
redirect to /dashboard or Index page once loading completes.

@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

🧹 Nitpick comments (1)
src/hooks/useSkillEndorsements.ts (1)

50-54: 🗄️ Data Integrity & Integration | 🔵 Trivial | ⚡ Quick win

Restore typed Supabase access across these hooks.

The changes bypass the generated database contract, allowing schema and payload mismatches to reach runtime.

  • src/hooks/useSkillEndorsements.ts#L50-L54: remove as any and restore typed endorsement reads.
  • src/hooks/useResources.ts#L66-L69: retain safeSupabaseCall<SavedResource[]>.
  • src/hooks/useSkillEndorsements.ts#L118-L125: type-check endorsement deletes.
  • src/hooks/useSkillEndorsements.ts#L128-L134: type-check endorsement inserts.
🤖 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 `@src/hooks/useSkillEndorsements.ts` around lines 50 - 54, Restore generated
Supabase typing across the affected hooks: in src/hooks/useSkillEndorsements.ts
lines 50-54 remove the any cast from the skill_endorsements read; retain
safeSupabaseCall<SavedResource[]> in src/hooks/useResources.ts lines 66-69; and
type-check the skill_endorsements delete and insert operations in
src/hooks/useSkillEndorsements.ts lines 118-125 and 128-134 using the generated
database contract.
🤖 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 `@supabase/migrations/20260617000000_consolidate_rls_policies.sql`:
- Around line 342-344: Replace the unrestricted USING (true) policies for
peer_submissions and the corresponding review policy with predicates limited to
the submission owner, participants, or authorized reviewers, then enable RLS
without exposing unrelated records. Add regression coverage confirming anonymous
and unrelated authenticated users cannot read these rows.

---

Nitpick comments:
In `@src/hooks/useSkillEndorsements.ts`:
- Around line 50-54: Restore generated Supabase typing across the affected
hooks: in src/hooks/useSkillEndorsements.ts lines 50-54 remove the any cast from
the skill_endorsements read; retain safeSupabaseCall<SavedResource[]> in
src/hooks/useResources.ts lines 66-69; and type-check the skill_endorsements
delete and insert operations in src/hooks/useSkillEndorsements.ts lines 118-125
and 128-134 using the generated database contract.
🪄 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: 9847d886-9863-4fda-a0b8-a75f23d67cdd

📥 Commits

Reviewing files that changed from the base of the PR and between 9f3294d and bdc5513.

📒 Files selected for processing (5)
  • backend/tests/uploadPhoto.test.js
  • src/hooks/useResources.ts
  • src/hooks/useSkillEndorsements.ts
  • src/pages/Contact.test.tsx
  • supabase/migrations/20260617000000_consolidate_rls_policies.sql

Comment on lines +342 to 344
ALTER TABLE public.peer_submissions ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users can view submissions"
ON public.peer_submissions FOR SELECT USING (true);

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.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Do not expose all peer data when enabling RLS.

These statements activate the adjacent USING (true) policies, allowing any role with table SELECT access—including Supabase API roles if granted—to read every submission and review, including unrelated users’ data. Scope the policies to the owner, participant, or authorized reviewer before enabling RLS, and add regression tests for anonymous and unrelated authenticated users.

Also applies to: 368-370

🤖 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 `@supabase/migrations/20260617000000_consolidate_rls_policies.sql` around lines
342 - 344, Replace the unrestricted USING (true) policies for peer_submissions
and the corresponding review policy with predicates limited to the submission
owner, participants, or authorized reviewers, then enable RLS without exposing
unrelated records. Add regression coverage confirming anonymous and unrelated
authenticated users cannot read these rows.

@TanCodeX TanCodeX left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

reviewed

@durdana3105

Copy link
Copy Markdown
Owner

RESOLVE MERGE CONFLICTS

@TanCodeX

Copy link
Copy Markdown
Contributor Author

RESOLVE MERGE CONFLICTS

@durdana3105 Done

@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)
backend/tests/uploadPhoto.test.js (1)

3-3: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Remove the unused once import
backend/tests/uploadPhoto.test.js:3 no longer references once, so the import can be dropped.

🤖 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 `@backend/tests/uploadPhoto.test.js` at line 3, Remove the unused once import
from the uploadPhoto test module, leaving the remaining imports and test logic
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.

Nitpick comments:
In `@backend/tests/uploadPhoto.test.js`:
- Line 3: Remove the unused once import from the uploadPhoto test module,
leaving the remaining imports and test logic unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: b49c79e4-f7aa-43ae-9353-375f6396d9a5

📥 Commits

Reviewing files that changed from the base of the PR and between bdc5513 and c28c52f.

📒 Files selected for processing (3)
  • backend/tests/uploadPhoto.test.js
  • src/App.tsx
  • src/hooks/useSkillEndorsements.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/hooks/useSkillEndorsements.ts
  • src/App.tsx

@durdana3105

Copy link
Copy Markdown
Owner

RESOLVE MERGE CONFLICTS

@TanCodeX

Copy link
Copy Markdown
Contributor Author

RESOLVE MERGE CONFLICTS

@durdana3105 Done.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[perf] Refactor Routing Architecture Using Nested Data Routers

2 participants