fix: BIG-337 Display billing page once the organization subscription is inactive.

This commit is contained in:
a.bouhuolia
2022-02-21 14:38:41 +02:00
parent e874b89d2d
commit 8e6b0b496f
4 changed files with 39 additions and 16 deletions

View File

@@ -1,7 +1,8 @@
import React from 'react'; import React from 'react';
import { Ability } from '@casl/ability'; import { Ability } from '@casl/ability';
import { createContextualCan } from '@casl/react'; import { createContextualCan } from '@casl/react';
import { useDashboardMeta } from '../../hooks/query';
import { useDashboardMetaBoot } from './DashboardBoot';
export const AbilityContext = React.createContext(); export const AbilityContext = React.createContext();
export const Can = createContextualCan(AbilityContext.Consumer); export const Can = createContextualCan(AbilityContext.Consumer);
@@ -11,8 +12,8 @@ export const Can = createContextualCan(AbilityContext.Consumer);
*/ */
export function DashboardAbilityProvider({ children }) { export function DashboardAbilityProvider({ children }) {
const { const {
data: { abilities }, meta: { abilities },
} = useDashboardMeta(); } = useDashboardMetaBoot();
// Ability instance. // Ability instance.
const ability = new Ability(abilities); const ability = new Ability(abilities);

View File

@@ -6,18 +6,26 @@ import {
} from '../../hooks/query'; } from '../../hooks/query';
import { useSplashLoading } from '../../hooks/state'; import { useSplashLoading } from '../../hooks/state';
import { useWatch, useWatchImmediate, useWhen } from '../../hooks'; import { useWatch, useWatchImmediate, useWhen } from '../../hooks';
import { useSubscription } from '../../hooks/state';
import { setCookie, getCookie } from '../../utils'; import { setCookie, getCookie } from '../../utils';
/** /**
* Dashboard meta async booting. * Dashboard meta async booting.
* - Fetches the dashboard meta only if the organization subscribe is active.
* - Once the dashboard meta query is loading display dashboard splash screen.
*/ */
export function useDashboardMetaBoot() { export function useDashboardMetaBoot() {
const { isSubscriptionActive } = useSubscription();
const { const {
data: dashboardMeta, data: dashboardMeta,
isLoading: isDashboardMetaLoading, isLoading: isDashboardMetaLoading,
isSuccess: isDashboardMetaSuccess, isSuccess: isDashboardMetaSuccess,
} = useDashboardMeta({ } = useDashboardMeta({
keepPreviousData: true, keepPreviousData: true,
// Avoid run the query if the organization subscription is not active.
enabled: isSubscriptionActive,
}); });
const [startLoading, stopLoading] = useSplashLoading(); const [startLoading, stopLoading] = useSplashLoading();
@@ -30,20 +38,12 @@ export function useDashboardMetaBoot() {
}, isDashboardMetaSuccess); }, isDashboardMetaSuccess);
return { return {
meta: dashboardMeta,
isLoading: isDashboardMetaLoading, isLoading: isDashboardMetaLoading,
isSuccess: isDashboardMetaSuccess
}; };
} }
/**
* Dashboard async booting.
* @returns {{ isLoading: boolean }}
*/
export function useDashboardBoot() {
const { isLoading } = useDashboardMetaBoot();
return { isLoading };
}
/** /**
* Application async booting. * Application async booting.
*/ */

View File

@@ -1,12 +1,12 @@
import React from 'react'; import React from 'react';
import { DashboardAbilityProvider } from '../../components'; import { DashboardAbilityProvider } from '../../components';
import { useDashboardBoot } from './DashboardBoot'; import { useDashboardMetaBoot } from './DashboardBoot';
/** /**
* Dashboard provider. * Dashboard provider.
*/ */
export default function DashboardProvider({ children }) { export default function DashboardProvider({ children }) {
const { isLoading } = useDashboardBoot(); const { isLoading } = useDashboardMetaBoot();
// Avoid display any dashboard component before complete booting. // Avoid display any dashboard component before complete booting.
if (isLoading) { if (isLoading) {

View File

@@ -1,6 +1,11 @@
import { useCallback } from "react" import { useCallback } from "react"
import { useDispatch } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { setSubscriptions } from 'store/subscription/subscription.actions'; import { setSubscriptions } from 'store/subscription/subscription.actions';
import {
isSubscriptionOnTrialFactory,
isSubscriptionInactiveFactory,
isSubscriptionActiveFactory,
} from 'store/subscription/subscription.selectors';
/** /**
* Sets subscriptions. * Sets subscriptions.
@@ -12,3 +17,20 @@ export const useSetSubscriptions = () => {
dispatch(setSubscriptions(subscriptions)); dispatch(setSubscriptions(subscriptions));
}, [dispatch]); }, [dispatch]);
} }
/**
* The organization subscription selector.
* @param {string} slug
* @returns {}
*/
export const useSubscription = (slug = 'main') => {
const isSubscriptionOnTrial = useSelector(isSubscriptionOnTrialFactory(slug));
const isSubscriptionInactive = useSelector(isSubscriptionInactiveFactory(slug));
const isSubscriptionActive = useSelector(isSubscriptionActiveFactory(slug));
return {
isSubscriptionActive,
isSubscriptionInactive,
isSubscriptionOnTrial
}
}