ConceptPortal-public/rsconcept/frontend/src/context/UsersContext.tsx

99 lines
2.5 KiB
TypeScript
Raw Normal View History

'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
2024-04-24 10:27:17 +03:00
import { getActiveUsers } from '@/app/backendAPI';
import { IUserInfo } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
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 => {
const context = useContext(UsersContext);
if (context === null) {
throw new Error(contextOutsideScope('useUsers', 'UsersState'));
}
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);
if (!user) {
2023-12-28 14:04:44 +03:00
return userID ? userID.toString() : 'Отсутствует';
2023-07-15 17:46:19 +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;
}
2024-05-27 20:57:17 +03:00
return user.last_name + ' ' + user.first_name;
2023-07-15 17:46:19 +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 => {
2024-05-27 20:57:17 +03:00
newData.sort((a, b) => {
if (a.last_name === '') {
if (b.last_name === '') {
return a.id - b.id;
} else {
return 1;
}
} else if (b.last_name === '') {
if (a.last_name === '') {
return a.id - b.id;
} else {
return -1;
}
} else if (a.last_name !== b.last_name) {
return a.last_name.localeCompare(b.last_name);
} else {
return a.first_name.localeCompare(b.first_name);
}
});
2023-12-28 14:04:44 +03:00
setUsers(newData);
if (callback) callback();
}
});
},
[setUsers]
);
2023-07-15 17:46:19 +03:00
useEffect(() => {
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>
);
};