feat(Sidebar): filter sidebar items based on subscription state.

This commit is contained in:
a.bouhuolia
2022-04-18 01:24:11 +02:00
parent 8d1825a065
commit 52924383bd
3 changed files with 57 additions and 8 deletions

View File

@@ -4,6 +4,7 @@ import { Features } from '../common/features';
import { import {
ISidebarMenuItemType, ISidebarMenuItemType,
ISidebarMenuOverlayIds, ISidebarMenuOverlayIds,
ISidebarSubscriptionAbility,
} from '../containers/Dashboard/Sidebar/interfaces'; } from '../containers/Dashboard/Sidebar/interfaces';
import { import {
ReportsAction, ReportsAction,
@@ -75,7 +76,7 @@ export const SidebarMenu = [
text: <T id={'sidebar_warehouse_transfer'} />, text: <T id={'sidebar_warehouse_transfer'} />,
href: '/warehouses-transfers', href: '/warehouses-transfers',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
feature: Features.Warehouses feature: Features.Warehouses,
}, },
{ {
text: <T id={'category_list'} />, text: <T id={'category_list'} />,
@@ -107,7 +108,7 @@ export const SidebarMenu = [
), ),
href: '/warehouses-transfers/new', href: '/warehouses-transfers/new',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
feature: Features.Warehouses feature: Features.Warehouses,
}, },
{ {
text: <T id={'New service'} />, text: <T id={'New service'} />,
@@ -726,6 +727,10 @@ export const SidebarMenu = [
text: <T id={'billing'} />, text: <T id={'billing'} />,
href: '/billing', href: '/billing',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
subscription: [
ISidebarSubscriptionAbility.Expired,
ISidebarSubscriptionAbility.Active,
],
permission: { permission: {
subject: AbilitySubject.SubscriptionBilling, subject: AbilitySubject.SubscriptionBilling,
ability: SubscriptionBillingAbility.View, ability: SubscriptionBillingAbility.View,

View File

@@ -1,4 +1,4 @@
import _, { isEmpty } from 'lodash'; import _, { isEmpty, includes } from 'lodash';
import React from 'react'; import React from 'react';
import * as R from 'ramda'; import * as R from 'ramda';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
@@ -6,8 +6,15 @@ import { useHistory } from 'react-router-dom';
import { useAbilityContext } from 'hooks'; import { useAbilityContext } from 'hooks';
import { useSidebarSubmenu, useFeatureCan } from 'hooks/state'; import { useSidebarSubmenu, useFeatureCan } from 'hooks/state';
import { SidebarMenu } from 'config/sidebarMenu'; import { SidebarMenu } from 'config/sidebarMenu';
import { ISidebarMenuItemType } from './interfaces'; import {
import { useSidebarSubmnuActions, useDialogActions } from 'hooks/state'; ISidebarMenuItemType,
ISidebarSubscriptionAbility,
} from './interfaces';
import {
useSidebarSubmnuActions,
useDialogActions,
useSubscription,
} from 'hooks/state';
import { filterValuesDeep, deepdash } from 'utils'; import { filterValuesDeep, deepdash } from 'utils';
const deepDashConfig = { const deepDashConfig = {
@@ -75,6 +82,36 @@ function useFilterSidebarItemAbilityPredicater() {
}; };
} }
/**
* Filters the sidebar item based on the subscription state.
*/
function useFilterSidebarItemSubscriptionPredicater() {
const { isSubscriptionActive, isSubscriptionInactive } = useSubscription();
return {
predicate: (item) => {
const { subscription } = item;
if (subscription) {
const isActive = includes(subscription, [
ISidebarSubscriptionAbility.Active,
])
? isSubscriptionActive
: true;
const isInactive = includes(subscription, [
ISidebarSubscriptionAbility.Inactive,
])
? isSubscriptionInactive
: true;
return isActive && isInactive;
}
return true;
},
};
}
/** /**
* Filters sidebar menu items based on ability of the item permission. * Filters sidebar menu items based on ability of the item permission.
* @param {*} menu * @param {*} menu
@@ -83,11 +120,13 @@ function useFilterSidebarItemAbilityPredicater() {
function useFilterSidebarMenuAbility(menu) { function useFilterSidebarMenuAbility(menu) {
const { predicate: predFeature } = useFilterSidebarItemFeaturePredicater(); const { predicate: predFeature } = useFilterSidebarItemFeaturePredicater();
const { predicate: predAbility } = useFilterSidebarItemAbilityPredicater(); const { predicate: predAbility } = useFilterSidebarItemAbilityPredicater();
const { predicate: predSubscription } =
useFilterSidebarItemSubscriptionPredicater();
return deepdash.filterDeep( return deepdash.filterDeep(
menu, menu,
(item) => { (item) => {
return predFeature(item) && predAbility(item); return predFeature(item) && predAbility(item) && predSubscription(item);
}, },
deepDashConfig, deepDashConfig,
); );
@@ -128,7 +167,7 @@ function useBindSidebarItemLinkClick() {
} }
/** /**
* Bind sidebar dialog item click action. * Bind sidebar dialog item click action.
* @param {ISidebarMenuItem} item * @param {ISidebarMenuItem} item
*/ */
function useBindSidebarItemDialogClick() { function useBindSidebarItemDialogClick() {

View File

@@ -68,5 +68,10 @@ export enum ISidebarMenuOverlayIds {
Financial = 'Financial', Financial = 'Financial',
Contacts = 'Contacts', Contacts = 'Contacts',
Cashflow = 'Cashflow', Cashflow = 'Cashflow',
Expenses = 'Expenses' Expenses = 'Expenses',
}
export enum ISidebarSubscriptionAbility {
Expired = 'SubscriptionExpired',
Active = 'SubscriptionActive',
} }