import { create } from 'zustand' import { UserResponse } from '../client/response' import { GetUserTable, SetUserPosition, PromoteUser, DemoteUser, DeactivateUser, CreatePosition, ActivateUser } from '../client/controllers' type UserData = { tableUsers: UserResponse[] } type UsersActions = { sync: (page: number) => Promise setUserPosition: (userId: number, positionName: string) => Promise promoteUser: (userId: number) => Promise demoteUser: (userId: number) => Promise deactivateUser: (userId: number) => Promise activateUser: (userId: number) => Promise createPosition: (positionName: string) => Promise } export const useUserStore = create((set) => ({ sync: async (page: number): Promise => { const users_in_page = await GetUserTable(page) set((state) => ({ ... state, tableUsers: users_in_page, })) return users_in_page }, tableUsers: [] as UserResponse[], setUserPosition: async (userId, positionName): Promise => { await SetUserPosition(userId, positionName) set((state) => { const match_user = state.tableUsers.filter((u) => u.Id === userId)[0] match_user.JobPosition = positionName return { ... state, tableUsers: [...state.tableUsers, match_user] } }) }, promoteUser: async (userId: number): Promise => { await PromoteUser(userId) set((state) => { const users = state.tableUsers.filter((u) => u.Id === userId) if(users.length > 0) { const user = users[0] const tableUsersWithoutUser = state.tableUsers.filter((u) => u.Id !== userId) user.Admin = true return { ...state, tableUsers: [...tableUsersWithoutUser, user] } } return state }) }, demoteUser: async (userId: number): Promise => { await DemoteUser(userId) set((state) => { const users = state.tableUsers.filter((u) => u.Id === userId) if(users.length > 0) { const user = users[0] const tableUsersWithoutUser = state.tableUsers.filter((u) => u.Id !== userId) user.Admin = false return { ...state, tableUsers: [...tableUsersWithoutUser, user] } } return state }) }, deactivateUser: async (userId: number): Promise => { await DeactivateUser(userId) set((state) => { const users = state.tableUsers.filter((u) => u.Id === userId) if(users.length > 0) { const user = users[0] const tableUsersWithoutUser = state.tableUsers.filter((u) => u.Id !== userId) user.Active = false return { ...state, tableUsers: [...tableUsersWithoutUser, user] } } return state }) }, activateUser: async (userId: number): Promise => { await ActivateUser(userId) set((state) => { const users = state.tableUsers.filter((u) => u.Id === userId) if(users.length > 0) { const user = users[0] const tableUsersWithoutUser = state.tableUsers.filter((u) => u.Id !== userId) user.Active = true return { ...state, tableUsers: [...tableUsersWithoutUser, user] } } return state }) }, createPosition: async (positionName: string): Promise => { await CreatePosition(positionName) } }))