refactor family utils
This commit is contained in:
parent
c1614d1c04
commit
e48465c242
|
@ -3,7 +3,7 @@ import VerticallyCentered, { FlexWrapper } from 'components/Container';
|
||||||
import { AppContext } from 'pages/_app';
|
import { AppContext } from 'pages/_app';
|
||||||
import React, { useContext, useEffect } from 'react';
|
import React, { useContext, useEffect } from 'react';
|
||||||
import billingService from 'services/billingService';
|
import billingService from 'services/billingService';
|
||||||
import { getFamilyPlanAdmin } from 'utils/billing';
|
import { getFamilyPlanAdmin } from 'utils/user/family';
|
||||||
import { preloadImage } from 'utils/common';
|
import { preloadImage } from 'utils/common';
|
||||||
import constants from 'utils/strings/constants';
|
import constants from 'utils/strings/constants';
|
||||||
import DialogTitleWithCloseButton from './DialogBox/TitleWithCloseButton';
|
import DialogTitleWithCloseButton from './DialogBox/TitleWithCloseButton';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import React, { useMemo } from 'react';
|
import React, { useMemo } from 'react';
|
||||||
import { UserDetails } from 'types/user';
|
import { UserDetails } from 'types/user';
|
||||||
import { isPartOfFamily } from 'utils/billing';
|
import { isPartOfFamily } from 'utils/user/family';
|
||||||
import StorageSection from '../storageSection';
|
import StorageSection from '../storageSection';
|
||||||
import { FamilyUsageSection } from './usageSection';
|
import { FamilyUsageSection } from './usageSection';
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { IndividualSubscriptionCardContent } from './individual';
|
import { IndividualSubscriptionCardContent } from './individual';
|
||||||
import { FamilySubscriptionCardContent } from './family';
|
import { FamilySubscriptionCardContent } from './family';
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { hasNonAdminFamilyMembers } from 'utils/billing';
|
import { hasNonAdminFamilyMembers } from 'utils/user/family';
|
||||||
import { Overlay, SpaceBetweenFlex } from 'components/Container';
|
import { Overlay, SpaceBetweenFlex } from 'components/Container';
|
||||||
import { UserDetails } from 'types/user';
|
import { UserDetails } from 'types/user';
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,7 @@ import { GalleryContext } from 'pages/gallery';
|
||||||
import React, { MouseEventHandler, useContext, useMemo } from 'react';
|
import React, { MouseEventHandler, useContext, useMemo } from 'react';
|
||||||
import {
|
import {
|
||||||
hasPaidSubscription,
|
hasPaidSubscription,
|
||||||
isFamilyAdmin,
|
|
||||||
isOnFreePlan,
|
isOnFreePlan,
|
||||||
isPartOfFamily,
|
|
||||||
hasExceededStorageQuota,
|
hasExceededStorageQuota,
|
||||||
isSubscriptionActive,
|
isSubscriptionActive,
|
||||||
isSubscriptionCancelled,
|
isSubscriptionCancelled,
|
||||||
|
@ -15,6 +13,7 @@ import { UserDetails } from 'types/user';
|
||||||
import constants from 'utils/strings/constants';
|
import constants from 'utils/strings/constants';
|
||||||
import { Typography } from '@mui/material';
|
import { Typography } from '@mui/material';
|
||||||
import billingService from 'services/billingService';
|
import billingService from 'services/billingService';
|
||||||
|
import { isPartOfFamily, isFamilyAdmin } from 'utils/user/family';
|
||||||
|
|
||||||
export default function SubscriptionStatus({
|
export default function SubscriptionStatus({
|
||||||
userDetails,
|
userDetails,
|
||||||
|
|
|
@ -9,7 +9,7 @@ import SubscriptionStatus from './SubscriptionStatus';
|
||||||
import { Box, Skeleton } from '@mui/material';
|
import { Box, Skeleton } from '@mui/material';
|
||||||
import { MemberSubscriptionManage } from '../MemberSubscriptionManage';
|
import { MemberSubscriptionManage } from '../MemberSubscriptionManage';
|
||||||
import { GalleryContext } from 'pages/gallery';
|
import { GalleryContext } from 'pages/gallery';
|
||||||
import { isPartOfFamily, isFamilyAdmin } from 'utils/billing';
|
import { isFamilyAdmin, isPartOfFamily } from 'utils/user/family';
|
||||||
|
|
||||||
export default function UserDetailsSection({ sidebarView }) {
|
export default function UserDetailsSection({ sidebarView }) {
|
||||||
const galleryContext = useContext(GalleryContext);
|
const galleryContext = useContext(GalleryContext);
|
||||||
|
|
|
@ -11,8 +11,6 @@ import {
|
||||||
hasMobileSubscription,
|
hasMobileSubscription,
|
||||||
getLocalUserSubscription,
|
getLocalUserSubscription,
|
||||||
hasPaidSubscription,
|
hasPaidSubscription,
|
||||||
getTotalFamilyUsage,
|
|
||||||
isPartOfFamily,
|
|
||||||
isSubscriptionActive,
|
isSubscriptionActive,
|
||||||
} from 'utils/billing';
|
} from 'utils/billing';
|
||||||
import { reverseString } from 'utils/common';
|
import { reverseString } from 'utils/common';
|
||||||
|
@ -28,6 +26,7 @@ import { getLocalUserDetails } from 'utils/user';
|
||||||
import { PLAN_PERIOD } from 'constants/gallery';
|
import { PLAN_PERIOD } from 'constants/gallery';
|
||||||
import FreeSubscriptionPlanSelectorCard from './free';
|
import FreeSubscriptionPlanSelectorCard from './free';
|
||||||
import PaidSubscriptionPlanSelectorCard from './paid';
|
import PaidSubscriptionPlanSelectorCard from './paid';
|
||||||
|
import { isPartOfFamily, getTotalFamilyUsage } from 'utils/user/family';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
closeModal: any;
|
closeModal: any;
|
||||||
|
|
|
@ -18,12 +18,12 @@ import {
|
||||||
UserDetails,
|
UserDetails,
|
||||||
DeleteChallengeResponse,
|
DeleteChallengeResponse,
|
||||||
} from 'types/user';
|
} from 'types/user';
|
||||||
import { getLocalFamilyData, isPartOfFamily } from 'utils/billing';
|
|
||||||
import { ServerErrorCodes } from 'utils/error';
|
import { ServerErrorCodes } from 'utils/error';
|
||||||
import isElectron from 'is-electron';
|
import isElectron from 'is-electron';
|
||||||
import safeStorageService from './electron/safeStorage';
|
import safeStorageService from './electron/safeStorage';
|
||||||
import { deleteThumbnailCache } from './cacheService';
|
import { deleteThumbnailCache } from './cacheService';
|
||||||
import { B64EncryptionResult } from 'types/crypto';
|
import { B64EncryptionResult } from 'types/crypto';
|
||||||
|
import { isPartOfFamily, getLocalFamilyData } from 'utils/user/family';
|
||||||
|
|
||||||
const ENDPOINT = getEndpoint();
|
const ENDPOINT = getEndpoint();
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,9 @@ import { CustomError } from '../error';
|
||||||
import { logError } from '../sentry';
|
import { logError } from '../sentry';
|
||||||
import { SetDialogBoxAttributes } from 'types/dialogBox';
|
import { SetDialogBoxAttributes } from 'types/dialogBox';
|
||||||
import { getFamilyPortalRedirectURL } from 'services/userService';
|
import { getFamilyPortalRedirectURL } from 'services/userService';
|
||||||
import { FamilyData, FamilyMember, User, UserDetails } from 'types/user';
|
|
||||||
import { openLink } from 'utils/common';
|
import { openLink } from 'utils/common';
|
||||||
|
import { isPartOfFamily, getTotalFamilyUsage } from 'utils/user/family';
|
||||||
|
import { UserDetails } from 'types/user';
|
||||||
|
|
||||||
const PAYMENT_PROVIDER_STRIPE = 'stripe';
|
const PAYMENT_PROVIDER_STRIPE = 'stripe';
|
||||||
const PAYMENT_PROVIDER_APPSTORE = 'appstore';
|
const PAYMENT_PROVIDER_APPSTORE = 'appstore';
|
||||||
|
@ -97,52 +98,10 @@ export function isSubscriptionCancelled(subscription: Subscription) {
|
||||||
return subscription && subscription.attributes.isCancelled;
|
return subscription && subscription.attributes.isCancelled;
|
||||||
}
|
}
|
||||||
|
|
||||||
// isPartOfFamily return true if the current user is part of some family plan
|
|
||||||
export function isPartOfFamily(familyData: FamilyData): boolean {
|
|
||||||
return Boolean(
|
|
||||||
familyData && familyData.members && familyData.members.length > 0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// hasNonAdminFamilyMembers return true if the admin user has members in his family
|
|
||||||
export function hasNonAdminFamilyMembers(familyData: FamilyData): boolean {
|
|
||||||
return Boolean(isPartOfFamily(familyData) && familyData.members.length > 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isFamilyAdmin(familyData: FamilyData): boolean {
|
|
||||||
const familyAdmin: FamilyMember = getFamilyPlanAdmin(familyData);
|
|
||||||
const user: User = getData(LS_KEYS.USER);
|
|
||||||
return familyAdmin.email === user.email;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getFamilyPlanAdmin(familyData: FamilyData): FamilyMember {
|
|
||||||
if (isPartOfFamily(familyData)) {
|
|
||||||
return familyData.members.find((x) => x.isAdmin);
|
|
||||||
} else {
|
|
||||||
logError(
|
|
||||||
Error(
|
|
||||||
'verify user is part of family plan before calling this method'
|
|
||||||
),
|
|
||||||
'invalid getFamilyPlanAdmin call'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getTotalFamilyUsage(familyData: FamilyData): number {
|
|
||||||
return familyData.members.reduce(
|
|
||||||
(sum, currentMember) => sum + currentMember.usage,
|
|
||||||
0
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getLocalUserSubscription(): Subscription {
|
export function getLocalUserSubscription(): Subscription {
|
||||||
return getData(LS_KEYS.SUBSCRIPTION);
|
return getData(LS_KEYS.SUBSCRIPTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getLocalFamilyData(): FamilyData {
|
|
||||||
return getData(LS_KEYS.FAMILY_DATA);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isUserSubscribedPlan(plan: Plan, subscription: Subscription) {
|
export function isUserSubscribedPlan(plan: Plan, subscription: Subscription) {
|
||||||
return (
|
return (
|
||||||
isSubscriptionActive(subscription) &&
|
isSubscriptionActive(subscription) &&
|
||||||
|
|
45
src/utils/user/family.ts
Normal file
45
src/utils/user/family.ts
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
import { FamilyData, FamilyMember, User } from 'types/user';
|
||||||
|
import { logError } from 'utils/sentry';
|
||||||
|
import { getData, LS_KEYS } from 'utils/storage/localStorage';
|
||||||
|
|
||||||
|
export function getLocalFamilyData(): FamilyData {
|
||||||
|
return getData(LS_KEYS.FAMILY_DATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
// isPartOfFamily return true if the current user is part of some family plan
|
||||||
|
export function isPartOfFamily(familyData: FamilyData): boolean {
|
||||||
|
return Boolean(
|
||||||
|
familyData && familyData.members && familyData.members.length > 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// hasNonAdminFamilyMembers return true if the admin user has members in his family
|
||||||
|
export function hasNonAdminFamilyMembers(familyData: FamilyData): boolean {
|
||||||
|
return Boolean(isPartOfFamily(familyData) && familyData.members.length > 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isFamilyAdmin(familyData: FamilyData): boolean {
|
||||||
|
const familyAdmin: FamilyMember = getFamilyPlanAdmin(familyData);
|
||||||
|
const user: User = getData(LS_KEYS.USER);
|
||||||
|
return familyAdmin.email === user.email;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFamilyPlanAdmin(familyData: FamilyData): FamilyMember {
|
||||||
|
if (isPartOfFamily(familyData)) {
|
||||||
|
return familyData.members.find((x) => x.isAdmin);
|
||||||
|
} else {
|
||||||
|
logError(
|
||||||
|
Error(
|
||||||
|
'verify user is part of family plan before calling this method'
|
||||||
|
),
|
||||||
|
'invalid getFamilyPlanAdmin call'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTotalFamilyUsage(familyData: FamilyData): number {
|
||||||
|
return familyData.members.reduce(
|
||||||
|
(sum, currentMember) => sum + currentMember.usage,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in a new issue