Add subcription level filtering
This commit is contained in:
69
frontend/src/hooks/useSubscriptionAwareRoutes.ts
Normal file
69
frontend/src/hooks/useSubscriptionAwareRoutes.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
/**
|
||||
* Hook for filtering routes based on subscription features
|
||||
*/
|
||||
|
||||
import { useMemo } from 'react';
|
||||
import { RouteConfig } from '../router/routes.config';
|
||||
import { useSubscription } from './useSubscription';
|
||||
|
||||
export const useSubscriptionAwareRoutes = (routes: RouteConfig[]) => {
|
||||
const { subscriptionInfo, canAccessAnalytics } = useSubscription();
|
||||
|
||||
const filteredRoutes = useMemo(() => {
|
||||
const filterRoutesBySubscription = (routeList: RouteConfig[]): RouteConfig[] => {
|
||||
return routeList.reduce((filtered, route) => {
|
||||
// Check if route requires subscription features
|
||||
if (route.requiredAnalyticsLevel) {
|
||||
const hasAccess = canAccessAnalytics(route.requiredAnalyticsLevel);
|
||||
if (!hasAccess) {
|
||||
return filtered; // Skip this route
|
||||
}
|
||||
}
|
||||
|
||||
// Handle specific analytics routes
|
||||
if (route.path === '/app/analytics') {
|
||||
// Only show analytics if user has at least basic access
|
||||
if (!canAccessAnalytics('basic')) {
|
||||
return filtered; // Skip analytics entirely
|
||||
}
|
||||
}
|
||||
|
||||
// Filter children recursively
|
||||
const filteredRoute = {
|
||||
...route,
|
||||
children: route.children ? filterRoutesBySubscription(route.children) : route.children
|
||||
};
|
||||
|
||||
// Only include parent if it has accessible children or is accessible itself
|
||||
if (route.children) {
|
||||
if (filteredRoute.children && filteredRoute.children.length > 0) {
|
||||
filtered.push(filteredRoute);
|
||||
} else if (!route.requiredAnalyticsLevel) {
|
||||
// Include parent without children if it doesn't require subscription
|
||||
filtered.push({ ...route, children: [] });
|
||||
}
|
||||
} else {
|
||||
filtered.push(filteredRoute);
|
||||
}
|
||||
|
||||
return filtered;
|
||||
}, [] as RouteConfig[]);
|
||||
};
|
||||
|
||||
if (subscriptionInfo.loading) {
|
||||
// While loading, show basic routes only
|
||||
return routes.filter(route =>
|
||||
!route.requiredAnalyticsLevel &&
|
||||
route.path !== '/app/analytics'
|
||||
);
|
||||
}
|
||||
|
||||
return filterRoutesBySubscription(routes);
|
||||
}, [routes, subscriptionInfo, canAccessAnalytics]);
|
||||
|
||||
return {
|
||||
filteredRoutes,
|
||||
subscriptionInfo,
|
||||
isLoading: subscriptionInfo.loading
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user