frontend/src/contexts/CoursesProvider.tsx

320 lines
10 KiB
TypeScript
Raw Normal View History

2020-11-22 18:22:07 +01:00
import React, { useState, createContext, useEffect, ReactNode } from 'react';
2021-01-05 23:46:51 +01:00
import { Course, Group, Basket, GroupType, SchedulerEvent, TimetableHistory } from '../types';
import { useSnackbar } from 'notistack';
2020-11-21 04:02:38 +01:00
import { axiosInstance } from '../utils/axiosInstance';
2020-11-25 04:16:22 +01:00
import CloseIcon from '@material-ui/icons/Close';
import styled from 'styled-components';
const StyledCloseIcon = styled(CloseIcon)`
2020-12-02 09:04:06 +01:00
color: #000000;
2020-11-25 04:16:22 +01:00
&:hover {
2020-12-02 09:04:06 +01:00
color: white;
2020-11-25 04:16:22 +01:00
cursor: pointer;
}
`;
2020-08-17 23:56:34 +02:00
interface CourseContext {
2020-08-12 20:52:53 +02:00
courses: Array<Course>;
2020-08-23 16:10:10 +02:00
basket: Array<Basket>;
2021-01-05 23:46:51 +01:00
timetableHistory: Array<TimetableHistory>;
hoveredGroup: Group | undefined | null;
2020-12-12 17:54:13 +01:00
userID: string;
isDataLoading: boolean;
2021-01-12 22:59:12 +01:00
historyBasket: Array<Basket>;
2020-11-21 04:02:38 +01:00
addCourseToBasket: (courses: Course) => void;
changeHoveredGroup: (group: Group | null) => void;
2021-01-12 22:59:12 +01:00
changeGroupInBasket: (group: any, courseId: number) => void;
restoreGroupInBasket: (restoreGroup: Group, courseId: number) => void;
2020-09-28 18:36:38 +02:00
deleteFromBasket: (id: number) => void;
2020-12-12 17:54:13 +01:00
saveBasket: (userID: string) => Promise<void>;
2020-12-12 20:32:09 +01:00
changeStudent: (studentId: string) => void;
2020-11-21 04:02:38 +01:00
selectSchedulerEvents: () => Array<SchedulerEvent>;
2021-01-12 22:59:12 +01:00
selectHistorySchedulerEvents: () => Array<SchedulerEvent>;
2020-11-21 04:02:38 +01:00
selectBasketNames: () => Array<string>;
selectBasketCourses: () => Array<Course>;
2020-12-02 09:04:06 +01:00
selectBasketCourseGroups: (courseId: number) => { lecture: Group | undefined; classes: Group | undefined };
2021-01-18 00:57:01 +01:00
selectGroups: () => Array<Group>;
2020-12-12 20:32:09 +01:00
getNewestStudentTimetable: (studentId: string) => void;
2021-01-05 23:46:51 +01:00
getStudentTimetablesHistory: (studentId: string) => void;
2020-12-12 20:32:09 +01:00
changeDataLoading: (isLoading: boolean) => void;
2021-01-12 22:59:12 +01:00
setHistoryBasketFromHistoryGroups: (groupsIds: Array<number>) => void;
2020-08-12 20:52:53 +02:00
}
export const coursesContext = createContext<CourseContext | undefined>(undefined);
2020-08-12 20:52:53 +02:00
interface CoursesProviderProps {
children: ReactNode;
2020-08-12 20:52:53 +02:00
}
export const CoursesProvider = ({ children }: CoursesProviderProps) => {
2020-11-21 04:02:38 +01:00
const { enqueueSnackbar } = useSnackbar();
const { closeSnackbar } = useSnackbar();
2020-08-23 16:02:52 +02:00
//fetch courses with groups
2020-08-12 20:52:53 +02:00
const [courses, setCourses] = useState<Array<Course>>([]);
2020-08-23 16:10:10 +02:00
const [basket, setBasket] = useState<Array<Basket>>([]);
2021-01-12 22:59:12 +01:00
const [historyBasket, setHistoryBasket] = useState<Array<Basket>>([]);
2021-01-05 23:46:51 +01:00
const [timetableHistory, setTimetableHistory] = useState<Array<TimetableHistory>>([]);
2020-12-12 17:54:13 +01:00
const [userID, setUserID] = useState('');
const [hoveredGroup, setHoveredGroup] = useState<Group | undefined | null>(null);
2020-12-12 17:54:13 +01:00
const [isDataLoading, setIsDataLoading] = useState(false);
2020-11-21 04:02:38 +01:00
const selectBasketIds = () => {
const classesIds = basket.map((course) => course?.classes?.id).filter((course) => course !== undefined);
const lecturesIds = basket.map((course) => course?.lecture?.id).filter((course) => course !== undefined);
return [...classesIds, ...lecturesIds];
};
2020-11-21 04:02:38 +01:00
const selectBasketNames = () => basket.map(({ name }) => name);
2020-11-21 04:02:38 +01:00
const selectBasketCourses = () => {
const basketNames = selectBasketNames();
return basketNames.reduce((sum, basketName) => {
const course = courses.find(({ name }) => basketName === name);
return course === undefined ? sum : [...sum, course];
}, [] as Array<Course>);
};
2020-11-21 04:02:38 +01:00
const selectSchedulerEvents = () => {
return basket.reduce((res, el) => {
const { name } = el;
if (el.classes) {
2020-12-29 01:06:39 +01:00
res.push({ ...el.classes, name });
2020-11-21 04:02:38 +01:00
}
if (el.lecture) {
2020-12-29 01:06:39 +01:00
res.push({ ...el.lecture, name });
2020-11-21 04:02:38 +01:00
}
return res;
}, [] as Array<SchedulerEvent>);
};
2020-12-29 01:06:39 +01:00
2021-01-12 22:59:12 +01:00
const selectHistorySchedulerEvents = () => {
return historyBasket.reduce((res, el) => {
const { name } = el;
if (el.classes) {
res.push({ ...el.classes, name });
}
if (el.lecture) {
2020-12-29 01:06:39 +01:00
res.push({ ...el.lecture, name });
2020-11-21 04:02:38 +01:00
}
return res;
}, [] as Array<SchedulerEvent>);
};
const selectBasketCourseGroups = (courseId: number) => {
const course = basket.find(({ id }) => id === courseId);
if (course !== undefined) {
2020-12-02 09:04:06 +01:00
return { lecture: course.lecture, classes: course.classes };
} else {
2020-12-02 09:04:06 +01:00
return { lecture: undefined, classes: undefined };
}
};
2021-01-18 00:57:01 +01:00
const selectGroups = () => {
const groups = [];
console.log('courses are: ', courses);
return (courses as unknown) as Array<Group>;
};
const changeHoveredGroup = (group: Group | null) => setHoveredGroup(group);
2020-12-12 20:32:09 +01:00
const changeDataLoading = (isLoading: boolean) => setIsDataLoading(isLoading);
2020-11-21 04:02:38 +01:00
const addCourseToBasket = (course: Course) => {
2020-10-21 20:42:18 +02:00
const courseToBasket: Basket = {
name: course.name,
id: course.id,
2020-11-21 04:02:38 +01:00
classes: course.classes !== undefined ? course.classes[0] : undefined,
lecture: course.lectures !== undefined ? course.lectures[0] : undefined,
2020-10-21 20:42:18 +02:00
};
setBasket([...basket, courseToBasket]);
};
2020-10-21 20:42:18 +02:00
const deleteFromBasket = (id: number) => setBasket(basket.filter((course) => course.id !== id));
2020-09-28 18:36:38 +02:00
2020-12-12 20:32:09 +01:00
const changeStudent = async (studentId: string) => {
setUserID(studentId);
setTimeout(() => {
getNewestStudentTimetable(studentId);
2021-01-05 23:46:51 +01:00
getStudentTimetablesHistory(studentId);
2020-12-12 20:32:09 +01:00
}, 100);
2020-12-12 17:54:13 +01:00
};
2020-12-10 21:26:09 +01:00
2020-12-12 17:54:13 +01:00
const saveBasket = async (userID: string) => {
2020-11-21 04:02:38 +01:00
const basketIds = selectBasketIds();
2020-10-28 00:07:23 +01:00
const action = (key: any) => (
<>
2020-11-25 04:16:22 +01:00
<StyledCloseIcon
2020-10-28 00:07:23 +01:00
onClick={() => {
closeSnackbar(key);
}}
2020-11-25 04:16:22 +01:00
></StyledCloseIcon>
2020-10-28 00:07:23 +01:00
</>
);
try {
2020-12-12 17:54:13 +01:00
await axiosInstance.post(
`${process.env.REACT_APP_API_URL}/api/v1/commisions/user/${userID}`,
JSON.stringify(basketIds),
);
2021-01-13 19:05:11 +01:00
enqueueSnackbar('Ustawienia zostały zapisane', {
variant: 'success',
2020-10-28 00:07:23 +01:00
action,
});
} catch (e) {
2020-11-21 04:02:38 +01:00
console.log('error: ', e);
2021-01-13 19:05:11 +01:00
enqueueSnackbar('Ustawienia nie zostały zapisane', {
variant: 'error',
2020-10-28 00:07:23 +01:00
action,
});
}
getStudentTimetablesHistory(userID);
2020-10-01 20:06:38 +02:00
};
2020-08-23 16:02:52 +02:00
2021-01-12 22:59:12 +01:00
const changeGroupInBasket = (choosenGroup: any, courseId: number) => {
const basketCourse = basket.filter((course) => course.id === courseId)[0];
2021-01-18 00:57:01 +01:00
if (choosenGroup.lecture && choosenGroup.classes) {
const prev = choosenGroup.prev === 'lecture' ? choosenGroup.lecture : choosenGroup.classes;
setBasket(
2021-01-18 00:57:01 +01:00
basket.map((basket) =>
basket.id === basketCourse.id
? { ...basket, lecture: choosenGroup.lecture, classes: choosenGroup.classes }
: basket,
),
);
2021-01-12 22:59:12 +01:00
changeHoveredGroup(prev);
2021-01-18 00:57:01 +01:00
}
2020-08-12 20:52:53 +02:00
};
const restoreGroupInBasket = (restoreGroup: Group, courseId: number) => {
const basketCourse = basket.filter((course) => course.id === courseId)[0];
const { type } = restoreGroup;
if (type === GroupType.CLASS) {
setBasket(
basket.map((basket) => (basket.id === basketCourse.id ? { ...basket, classes: restoreGroup } : basket)),
);
} else if (type === GroupType.LECTURE) {
setBasket(
basket.map((basket) => (basket.id === basketCourse.id ? { ...basket, lecture: restoreGroup } : basket)),
);
}
};
2020-10-27 10:42:22 +01:00
const getNewestTimetable = async () => {
try {
2020-12-29 01:06:39 +01:00
const { data } = await axiosInstance.get<Array<Basket> | ''>(
`${process.env.REACT_APP_API_URL}/api/v1/commisions/user/schedule`,
);
2020-11-21 04:02:38 +01:00
const basket = data === '' ? [] : data;
2020-11-01 20:57:08 +01:00
setBasket(basket);
2020-10-27 10:42:22 +01:00
} catch (e) {
console.log(e);
}
};
2020-12-12 20:32:09 +01:00
const getNewestStudentTimetable = async (studentId: string) => {
2020-12-05 18:32:37 +01:00
try {
2020-12-12 20:32:09 +01:00
const { data } = await axiosInstance.get(
`${process.env.REACT_APP_API_URL}/api/v1/commisions/user/${studentId}/schedule`,
);
const basket = data === '' ? [] : data;
2020-12-29 01:06:39 +01:00
2020-12-12 20:32:09 +01:00
setBasket(basket);
2020-12-05 18:32:37 +01:00
} catch (e) {
console.log(e);
}
2020-12-12 17:54:13 +01:00
};
2020-12-05 18:32:37 +01:00
2021-01-05 23:46:51 +01:00
const getStudentTimetablesHistory = async (studentId: string) => {
try {
const { data } = await axiosInstance.get<Array<TimetableHistory> | []>(
`${process.env.REACT_APP_API_URL}/api/v1/commisions/user/${studentId}?groups=true`,
);
setTimetableHistory(data);
} catch (e) {
console.log(e);
}
};
2020-11-21 14:15:58 +01:00
const fetchCourses = async () => {
2020-10-27 10:42:22 +01:00
try {
2020-11-21 04:02:38 +01:00
const { data: courses } = await axiosInstance.get<Array<Course>>(
2020-12-29 01:06:39 +01:00
`${process.env.REACT_APP_API_URL}/api/v1/courses/all?groups=true&takenPlaces=true`,
);
2020-11-21 04:02:38 +01:00
const sortedCourses = courses.sort((a, b) => (a.name > b.name ? 1 : -1));
setCourses(sortedCourses);
2020-10-27 10:42:22 +01:00
} catch (e) {
2020-11-22 17:21:22 +01:00
console.log(e);
2021-01-05 23:46:51 +01:00
}
};
2021-01-12 22:59:12 +01:00
const setHistoryBasketFromHistoryGroups = (groupsIds: Array<number>) => {
2021-01-05 23:46:51 +01:00
const basket: Array<Basket> = [];
for (const groupId of groupsIds) {
for (const course of courses) {
const { lectures, classes, name, id } = course;
let basketElement: Basket = { name: name, id: id };
if (lectures) {
for (const lecture of lectures) {
if (groupId === lecture.id) {
basketElement = { ...basketElement, lecture: lecture };
}
}
}
if (classes) {
for (const singleClass of classes) {
if (groupId === singleClass.id) {
basketElement = { ...basketElement, classes: singleClass };
}
}
}
if (basketElement.classes !== undefined || basketElement.lecture !== undefined) {
basket.push(basketElement);
}
}
}
2021-01-12 22:59:12 +01:00
setHistoryBasket(basket);
2020-10-27 10:42:22 +01:00
};
useEffect(() => {
2020-12-12 17:54:13 +01:00
setIsDataLoading(true);
2020-11-22 17:21:22 +01:00
setTimeout(() => {
fetchCourses();
getNewestTimetable();
2020-12-12 17:54:13 +01:00
setIsDataLoading(false);
2020-12-14 17:20:44 +01:00
}, 600);
2020-11-21 04:02:38 +01:00
}, []);
2020-08-17 23:56:34 +02:00
2020-08-12 20:52:53 +02:00
return (
2020-11-21 04:02:38 +01:00
<coursesContext.Provider
value={{
2020-12-10 21:51:01 +01:00
userID,
2020-11-21 04:02:38 +01:00
courses,
basket,
hoveredGroup,
2021-01-05 23:46:51 +01:00
timetableHistory,
2020-12-12 17:54:13 +01:00
isDataLoading,
2021-01-12 22:59:12 +01:00
historyBasket,
2020-11-21 04:02:38 +01:00
addCourseToBasket,
changeHoveredGroup,
2020-11-21 04:02:38 +01:00
changeGroupInBasket,
deleteFromBasket,
restoreGroupInBasket,
2020-11-21 04:02:38 +01:00
saveBasket,
selectSchedulerEvents,
2021-01-12 22:59:12 +01:00
selectHistorySchedulerEvents,
2020-11-21 04:02:38 +01:00
selectBasketNames,
selectBasketCourses,
selectBasketCourseGroups,
2021-01-18 00:57:01 +01:00
selectGroups,
2020-12-12 20:32:09 +01:00
getNewestStudentTimetable,
changeStudent,
2021-01-05 23:46:51 +01:00
getStudentTimetablesHistory,
2021-01-12 22:59:12 +01:00
setHistoryBasketFromHistoryGroups,
2020-12-12 20:32:09 +01:00
changeDataLoading,
2020-11-21 04:02:38 +01:00
}}
>
{children}
</coursesContext.Provider>
2020-08-12 20:52:53 +02:00
);
};