2023-07-25 20:27:29 +03:00
|
|
|
import { createContext, useCallback, useContext, useEffect, useState } from 'react';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-07-25 20:27:29 +03:00
|
|
|
import { getActiveUsers } from '../utils/backendAPI';
|
|
|
|
import { type IUserInfo } from '../utils/models';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
interface IUsersContext {
|
|
|
|
users: IUserInfo[]
|
2023-07-23 21:38:04 +03:00
|
|
|
reload: () => Promise<void>
|
2023-07-15 17:46:19 +03:00
|
|
|
getUserLabel: (userID?: number) => string
|
|
|
|
}
|
|
|
|
|
2023-07-25 20:27:29 +03:00
|
|
|
const UsersContext = createContext<IUsersContext | null>(null)
|
|
|
|
export const useUsers = (): IUsersContext => {
|
2023-07-25 00:20:37 +03:00
|
|
|
const context = useContext(UsersContext);
|
2023-07-25 20:27:29 +03:00
|
|
|
if (context == null) {
|
2023-07-25 00:20:37 +03:00
|
|
|
throw new Error(
|
|
|
|
'useUsers has to be used within <UsersState.Provider>'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
return context;
|
|
|
|
}
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
interface UsersStateProps {
|
|
|
|
children: React.ReactNode
|
|
|
|
}
|
|
|
|
|
|
|
|
export const UsersState = ({ children }: UsersStateProps) => {
|
2023-07-25 20:27:29 +03:00
|
|
|
const [users, setUsers] = useState<IUserInfo[]>([])
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
const getUserLabel = (userID?: number) => {
|
2023-07-25 20:27:29 +03:00
|
|
|
const user = users.find(({ id }) => id === userID)
|
|
|
|
if (user == null) {
|
|
|
|
return (userID !== undefined ? userID.toString() : 'Отсутствует');
|
2023-07-15 17:46:19 +03:00
|
|
|
}
|
2023-07-25 20:27:29 +03:00
|
|
|
const hasFirstName = user.first_name != null && user.first_name !== '';
|
|
|
|
const hasLastName = user.last_name != null && user.last_name !== '';
|
|
|
|
if (hasFirstName || hasLastName) {
|
|
|
|
if (!hasLastName) {
|
2023-07-15 17:46:19 +03:00
|
|
|
return user.first_name;
|
|
|
|
}
|
2023-07-25 20:27:29 +03:00
|
|
|
if (!hasFirstName) {
|
2023-07-15 17:46:19 +03:00
|
|
|
return user.last_name;
|
|
|
|
}
|
2023-07-25 20:27:29 +03:00
|
|
|
return user.first_name + ' ' + user.last_name;
|
2023-07-15 17:46:19 +03:00
|
|
|
}
|
|
|
|
return user.username;
|
2023-07-25 20:27:29 +03:00
|
|
|
}
|
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
const reload = useCallback(
|
|
|
|
async () => {
|
2023-07-25 20:27:29 +03:00
|
|
|
await getActiveUsers({
|
2023-07-15 17:57:25 +03:00
|
|
|
showError: true,
|
2023-07-25 20:27:29 +03:00
|
|
|
onError: () => { setUsers([]); },
|
|
|
|
onSucccess: response => { setUsers(response.data); }
|
2023-07-15 17:46:19 +03:00
|
|
|
});
|
|
|
|
}, [setUsers]
|
2023-07-25 20:27:29 +03:00
|
|
|
)
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-25 20:27:29 +03:00
|
|
|
reload().catch(console.error);
|
|
|
|
}, [reload])
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
<UsersContext.Provider value={{
|
|
|
|
users,
|
2023-07-25 20:27:29 +03:00
|
|
|
reload,
|
|
|
|
getUserLabel
|
2023-07-15 17:46:19 +03:00
|
|
|
}}>
|
|
|
|
{ children }
|
|
|
|
</UsersContext.Provider>
|
2023-07-25 20:27:29 +03:00
|
|
|
);
|
|
|
|
}
|