Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
39caa0d
feat: Add admin custom Stripe product creation support
athul-rs Nov 10, 2025
f703008
Merge branch 'main' into feature/custom-stripe-products-backend
athul-rs Nov 10, 2025
ca4b8f6
chore: Add NOSONAR comments for plugin loading pattern
athul-rs Nov 10, 2025
306ddd9
style: Fix Prettier formatting for NOSONAR comments
athul-rs Nov 10, 2025
8fa0f53
fix: Correct NOSONAR comment placement for SonarQube
athul-rs Nov 11, 2025
f824c5c
fix: Add NOSONAR comments to suppress empty catch warnings
athul-rs Nov 11, 2025
b0df47b
Merge branch 'main' into feature/custom-stripe-products-backend
athul-rs Nov 11, 2025
40dea8c
Merge branch 'main' of github.com:Zipstack/unstract into feature/cust…
athul-rs Nov 11, 2025
dfc3f5a
path modified admin cusotm plans
athul-rs Nov 12, 2025
3f8cb53
UN-2861 [FEAT] Add RequireStaff permission for custom plans administr…
athul-rs Nov 12, 2025
fb8107a
Remove unused RequireStaff component
athul-rs Nov 12, 2025
51e1a92
Remove RequireStaff dependency from OSS routes
athul-rs Nov 13, 2025
c93cba0
Fix Prettier formatting for staff check return statement
athul-rs Nov 13, 2025
bf3732d
Merge branch 'main' into feature/custom-stripe-products-backend
athul-rs Nov 13, 2025
5c1d740
Refactor inline CSS to classes in UnstractAdministrationPage
athul-rs Nov 13, 2025
433b0b1
Fix React Rules of Hooks violation in useMainAppRoutes
athul-rs Nov 13, 2025
388fc2c
Fix admin route loading by always registering route
athul-rs Nov 13, 2025
ba5dbf4
Merge main into fix/custom-stripe-products-backend
athul-rs Nov 13, 2025
8463654
Add loading state check to UnstractAdministrationPage
athul-rs Nov 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions frontend/src/pages/UnstractAdministrationPage.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import "./UnstractAdministrationPage.css";
import { useSessionStore } from "../store/session-store";

let UnstractAdministration;

Expand All @@ -11,6 +12,28 @@ try {
}

function UnstractAdministrationPage() {
const { sessionDetails } = useSessionStore();

// Wait for session to load before making authorization decisions
if (!sessionDetails) {
return null;
}

const isStaff = sessionDetails?.isStaff || sessionDetails?.is_staff;
const orgName = sessionDetails?.orgName;
const isOpenSource = orgName === "mock_org";

// Staff permission check - protects route at component level
if (!isStaff || isOpenSource) {
return (
<div className="administration-fallback">
<h2>Access Denied</h2>
<p>This feature requires staff permissions.</p>
</div>
);
}

// Cloud-only feature check
if (!UnstractAdministration) {
return (
<div className="administration-fallback">
Expand All @@ -19,6 +42,7 @@ function UnstractAdministrationPage() {
</div>
);
}

return <UnstractAdministration />;
}

Expand Down
16 changes: 4 additions & 12 deletions frontend/src/routes/useMainAppRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { ToolsSettingsPage } from "../pages/ToolsSettingsPage.jsx";
import { SettingsPage } from "../pages/SettingsPage.jsx";
import { PlatformSettings } from "../components/settings/platform/PlatformSettings.jsx";
import { RequireAdmin } from "../components/helpers/auth/RequireAdmin.js";
import { useSessionStore } from "../store/session-store";
import { UsersPage } from "../pages/UsersPage.jsx";
import { InviteEditUserPage } from "../pages/InviteEditUserPage.jsx";
import { DefaultTriad } from "../components/settings/default-triad/DefaultTriad.jsx";
Expand Down Expand Up @@ -100,11 +99,6 @@ try {
}

function useMainAppRoutes() {
const { sessionDetails } = useSessionStore();
const isStaff = sessionDetails?.isStaff || sessionDetails?.is_staff;
const orgName = sessionDetails?.orgName;
const isOpenSource = orgName === "mock_org";

const routes = (
<>
<Route path=":orgName" element={<FullPageLayout />}>
Expand All @@ -124,12 +118,10 @@ function useMainAppRoutes() {
<Route path="pricing" element={<UnstractSubscriptionPage />} />
</Route>
)}
{isStaff && !isOpenSource && (
<Route
path="admin/custom-plans"
element={<UnstractAdministrationPage />}
/>
)}
<Route
path="admin/custom-plans"
element={<UnstractAdministrationPage />}
/>
<Route path="profile" element={<ProfilePage />} />
<Route
path="api"
Expand Down