11import { createSlice , PayloadAction , createAction } from '@reduxjs/toolkit' ;
22
33import { EDeleteUserModalState , IAccounts , IAccountPlan } from '../../types/redux' ;
4- import { EUserListSorting , TUserListItem , ICreateUserRequest } from '../../types/user' ;
4+ import { EUserListSorting , EUserStatus , TUserListItem , ICreateUserRequest } from '../../types/user' ;
55import { ESubscriptionPlan } from '../../types/account' ;
66
77import {
@@ -59,6 +59,35 @@ function setUserProperties(users: TUserListItem[], userId: number, changedProps:
5959 } ) ;
6060}
6161
62+ const getUserNameForSorting = ( user : TUserListItem ) => ( user . firstName || user . email ) . toLowerCase ( ) ;
63+
64+ function sortUsers ( users : TUserListItem [ ] , sorting : EUserListSorting ) {
65+ const sorted = users . slice ( ) . sort ( ( user1 , user2 ) => {
66+ if ( getUserNameForSorting ( user1 ) === getUserNameForSorting ( user2 ) ) return 0 ;
67+
68+ return getUserNameForSorting ( user1 ) > getUserNameForSorting ( user2 ) ? 1 : - 1 ;
69+ } ) ;
70+
71+ if ( sorting === EUserListSorting . NameDesc ) {
72+ return sorted . reverse ( ) ;
73+ }
74+
75+ if ( sorting === EUserListSorting . Status ) {
76+ return sorted . sort ( ( user1 , user2 ) => {
77+ const user1Status = user1 . status === EUserStatus . Invited ? 1 : 0 ;
78+ const user2Status = user2 . status === EUserStatus . Invited ? 1 : 0 ;
79+
80+ return user1Status - user2Status ;
81+ } ) ;
82+ }
83+
84+ return sorted ;
85+ }
86+
87+ const getActiveUsersCount = ( users : TUserListItem [ ] ) => users . filter (
88+ ( user ) => user . status === EUserStatus . Active && user . type === 'user' ,
89+ ) . length ;
90+
6291const accountsSlice = createSlice ( {
6392 name : 'accounts' ,
6493 initialState,
@@ -79,6 +108,7 @@ const accountsSlice = createSlice({
79108 teamFetchFinished : ( state , action : PayloadAction < TUserListItem [ ] > ) => {
80109 state . team . isLoading = false ;
81110 state . team . list = action . payload ;
111+ state . planInfo . activeUsers = getActiveUsersCount ( action . payload ) ;
82112 } ,
83113
84114 usersFetchFailed : ( state ) => {
@@ -89,10 +119,12 @@ const accountsSlice = createSlice({
89119 usersFetchFinished : ( state , action : PayloadAction < TUserListItem [ ] > ) => {
90120 state . isLoading = false ;
91121 state . users = action . payload ;
122+ state . planInfo . activeUsers = getActiveUsersCount ( action . payload ) ;
92123 } ,
93124
94125 activeUsersCountFetchFinished : ( state , action : PayloadAction < TActiveUsersCountFetchFinishedPayload > ) => {
95126 state . planInfo . activeUsers = action . payload . activeUsers ;
127+ state . planInfo . tenantsActiveUsers = action . payload . tenantsActiveUsers ;
96128 } ,
97129
98130 setCurrentPlan : ( state , action : PayloadAction < IAccountPlan > ) => {
@@ -195,22 +227,31 @@ const accountsSlice = createSlice({
195227
196228 upsertUserFromWs : ( state , action : PayloadAction < TUserListItem > ) => {
197229 const user = action . payload ;
230+ const hasLocalUsers = Boolean ( state . users . length || state . team . list . length ) ;
198231 const upsertList = ( list : TUserListItem [ ] ) => {
199232 const hasUser = list . some ( ( item ) => item . id === user . id ) ;
200- if ( ! hasUser ) {
201- return [ ...list , user ] ;
202- }
203- return list . map ( ( item ) => ( item . id === user . id ? { ...item , ...user } : item ) ) ;
233+ const nextList = hasUser
234+ ? list . map ( ( item ) => ( item . id === user . id ? { ...item , ...user } : item ) )
235+ : [ ...list , user ] ;
236+
237+ return sortUsers ( nextList , state . userListSorting ) ;
204238 } ;
205239
206240 state . users = upsertList ( state . users ) ;
207241 state . team . list = upsertList ( state . team . list ) ;
242+ if ( hasLocalUsers ) {
243+ state . planInfo . activeUsers = getActiveUsersCount ( state . team . list . length ? state . team . list : state . users ) ;
244+ }
208245 } ,
209246
210247 removeUserFromWs : ( state , action : PayloadAction < number > ) => {
248+ const hasLocalUsers = Boolean ( state . users . length || state . team . list . length ) ;
211249 const removeFromList = ( list : TUserListItem [ ] ) => list . filter ( ( item ) => item . id !== action . payload ) ;
212250 state . users = removeFromList ( state . users ) ;
213251 state . team . list = removeFromList ( state . team . list ) ;
252+ if ( hasLocalUsers ) {
253+ state . planInfo . activeUsers = getActiveUsersCount ( state . team . list . length ? state . team . list : state . users ) ;
254+ }
214255 } ,
215256 } ,
216257} ) ;
0 commit comments