Files
bakery-ia/frontend/src/hooks/useSubscriptionAwareRoutes.ts

70 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-09-21 13:27:50 +02:00
/**
* Hook for filtering routes based on subscription features
*/
import { useMemo } from 'react';
import { RouteConfig } from '../router/routes.config';
2025-09-23 22:11:34 +02:00
import { useSubscription } from '../api/hooks/subscription';
2025-09-21 13:27:50 +02:00
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
};
2025-10-29 06:58:05 +01:00
};