-
-
Notifications
You must be signed in to change notification settings - Fork 654
/
useUsersPlan.ts
57 lines (47 loc) · 1.57 KB
/
useUsersPlan.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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(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;
};