69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
/**
|
|
* 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
|
|
};
|
|
}; |