2023-12-13 14:32:57 +03:00
|
|
|
'use client';
|
|
|
|
|
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-12-13 14:32:57 +03:00
|
|
|
import { type IUserInfo } from '@/models/library';
|
2024-04-24 10:27:17 +03:00
|
|
|
import { getActiveUsers } from '@/app/backendAPI';
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
interface IUsersContext {
|
2023-12-28 14:04:44 +03:00
|
|
|
users: IUserInfo[];
|
|
|
|
reload: (callback?: () => void) => void;
|
|
|
|
getUserLabel: (userID: number | null) => string;
|
2023-07-15 17:46:19 +03:00
|
|
|
}
|
|
|
|
|
2023-12-28 14:04:44 +03:00
|
|
|
const UsersContext = createContext<IUsersContext | null>(null);
|
2023-07-25 20:27:29 +03:00
|
|
|
export const useUsers = (): IUsersContext => {
|
2023-07-25 00:20:37 +03:00
|
|
|
const context = useContext(UsersContext);
|
2023-08-22 20:29:07 +03:00
|
|
|
if (context === null) {
|
2023-08-27 15:39:49 +03:00
|
|
|
throw new Error('useUsers has to be used within <UsersState.Provider>');
|
2023-07-25 00:20:37 +03:00
|
|
|
}
|
|
|
|
return context;
|
2023-12-28 14:04:44 +03:00
|
|
|
};
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
interface UsersStateProps {
|
2023-12-28 14:04:44 +03:00
|
|
|
children: React.ReactNode;
|
2023-07-15 17:46:19 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
export const UsersState = ({ children }: UsersStateProps) => {
|
2023-12-28 14:04:44 +03:00
|
|
|
const [users, setUsers] = useState<IUserInfo[]>([]);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
2023-08-01 20:14:03 +03:00
|
|
|
function getUserLabel(userID: number | null) {
|
2023-12-28 14:04:44 +03:00
|
|
|
const user = users.find(({ id }) => id === userID);
|
2023-07-26 23:11:00 +03:00
|
|
|
if (!user) {
|
2023-12-28 14:04:44 +03:00
|
|
|
return userID ? userID.toString() : 'Отсутствует';
|
2023-07-15 17:46:19 +03:00
|
|
|
}
|
2023-07-26 23:11:00 +03:00
|
|
|
const hasFirstName = user.first_name !== '';
|
|
|
|
const hasLastName = user.last_name !== '';
|
2023-07-25 20:27:29 +03:00
|
|
|
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
|
|
|
}
|
2024-02-22 19:09:24 +03:00
|
|
|
return `Аноним ${userID}`;
|
2023-07-25 20:27:29 +03:00
|
|
|
}
|
|
|
|
|
2023-07-15 17:46:19 +03:00
|
|
|
const reload = useCallback(
|
2023-12-28 14:04:44 +03:00
|
|
|
(callback?: () => void) => {
|
|
|
|
getActiveUsers({
|
|
|
|
showError: true,
|
|
|
|
onError: () => setUsers([]),
|
|
|
|
onSuccess: newData => {
|
|
|
|
setUsers(newData);
|
|
|
|
if (callback) callback();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
|
|
|
[setUsers]
|
|
|
|
);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
useEffect(() => {
|
2023-07-26 23:11:00 +03:00
|
|
|
reload();
|
2023-08-01 20:14:03 +03:00
|
|
|
}, [reload]);
|
2023-07-15 17:46:19 +03:00
|
|
|
|
|
|
|
return (
|
2023-12-28 14:04:44 +03:00
|
|
|
<UsersContext.Provider
|
|
|
|
value={{
|
|
|
|
users,
|
|
|
|
reload,
|
|
|
|
getUserLabel
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{children}
|
|
|
|
</UsersContext.Provider>
|
|
|
|
);
|
|
|
|
};
|