Update selected item color in Pass menu
[ProtonMail-WebClient.git] / packages / pass / store / selectors / limits.ts
blob36feee03453edd70a0f7016996063a5552b6e967
1 import { createSelector } from '@reduxjs/toolkit';
3 import { sortItems } from '@proton/pass/lib/items/item.utils';
4 import { PlanType } from '@proton/pass/types';
6 import { selectAliasItems, selectLoginItems } from './items';
7 import { selectAllVaults } from './shares';
8 import { selectUserPlan } from './user';
10 export const selectVaultLimits = createSelector([selectAllVaults, selectUserPlan], (vaults, plan) => {
11     const vaultLimit = plan?.VaultLimit ?? Number.MAX_SAFE_INTEGER;
13     return {
14         vaultLimit,
15         vaultTotalCount: vaults.length,
16         vaultLimitReached: vaults.length >= vaultLimit,
17         didDowngrade: vaults.length > vaultLimit && plan?.Type === PlanType.free,
18     };
19 });
21 export const selectAliasLimits = createSelector([selectAliasItems, selectUserPlan], (alias, plan) => {
22     const aliasLimit = plan?.AliasLimit ?? Number.MAX_SAFE_INTEGER;
24     return {
25         aliasLimit,
26         aliasLimited: typeof plan?.AliasLimit === 'number',
27         aliasTotalCount: alias.length,
28         needsUpgrade: alias.length >= aliasLimit,
29         didDowngrade: alias.length > aliasLimit,
30     };
31 });
33 export const selectTOTPLimits = createSelector([selectLoginItems, selectUserPlan], (loginItems, plan) => {
34     const totpLimit = plan?.TotpLimit;
35     let needsUpgrade = false;
36     let didDowngrade = false;
37     let totpAllowed: (itemId: string) => boolean = () => true;
39     if (typeof totpLimit === 'number') {
40         const totpItems = loginItems.filter((item) => Boolean(item.data.content.totpUri.v));
41         const totpTotalCount = totpItems.length;
43         needsUpgrade = totpTotalCount >= totpLimit;
44         didDowngrade = totpTotalCount > totpLimit;
45         totpAllowed = (itemId: string) =>
46             sortItems('createTimeASC')(totpItems)
47                 .slice(0, totpLimit)
48                 .some((item) => item.itemId === itemId);
49     }
51     return {
52         totpLimit,
53         needsUpgrade,
54         didDowngrade,
55         totpAllowed,
56     };
57 });
59 export const selectExtraFieldLimits = createSelector([selectUserPlan], (plan) => {
60     return {
61         needsUpgrade: plan?.Type === PlanType.free,
62     };
63 });