import { IUser } from 'interfaces/user'; import { useMemo } from 'react'; import { useInstanceStatus } from './api/getters/useInstanceStatus/useInstanceStatus'; import { InstancePlan } from 'interfaces/instance'; import useUiConfig from './api/getters/useUiConfig/useUiConfig'; export interface IUsersPlanOutput { planUsers: IUser[]; isBillingUsers: boolean; seats: number; extraSeats: number; } export const useUsersPlan = (users: IUser[]): IUsersPlanOutput => { const { instanceStatus } = useInstanceStatus(); const { uiConfig } = useUiConfig(); const isBillingUsers = Boolean( uiConfig?.flags?.proPlanAutoCharge && instanceStatus?.plan === InstancePlan.PRO ); const seats = instanceStatus?.seats ?? 5; const planUsers = useMemo( () => calculatePaidUsers(users, isBillingUsers, seats), [users, isBillingUsers, seats] ); const extraSeats = planUsers.filter(user => user.paid).length; return { seats, extraSeats, planUsers, isBillingUsers, }; }; const calculatePaidUsers = ( users: IUser[], isBillingUsers: boolean, seats: number = 0 ) => { if (!isBillingUsers || !seats) return users; users .sort((a, b) => a.createdAt.localeCompare(b.createdAt)) .forEach((user, index) => { user.paid = false; // If index is greater or equal to seat, the // user isn't paid for and we will add use this // to add costs and icons in the userlist if (index >= seats) { user.paid = true; } }); return users; };