2020-11-22 18:22:07 +01:00
|
|
|
import React, { useState, createContext, useEffect, ReactNode } from 'react';
|
2020-11-21 04:02:38 +01:00
|
|
|
import { Course, Group, Basket, GroupType, SchedulerEvent } from '../types';
|
2020-10-27 01:24:35 +01:00
|
|
|
import { useSnackbar } from 'notistack';
|
2020-11-21 04:02:38 +01:00
|
|
|
import { createClassTime } from '../utils';
|
|
|
|
import { axiosInstance } from '../utils/axiosInstance';
|
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>;
|
2020-11-21 04:02:38 +01:00
|
|
|
addCourseToBasket: (courses: Course) => void;
|
|
|
|
changeGroupInBasket: (group: Group, id: number) => void;
|
2020-09-28 18:36:38 +02:00
|
|
|
deleteFromBasket: (id: number) => void;
|
2020-10-01 20:06:38 +02:00
|
|
|
saveBasket: () => void;
|
2020-11-21 04:02:38 +01:00
|
|
|
selectSchedulerEvents: () => Array<SchedulerEvent>;
|
|
|
|
selectBasketNames: () => Array<string>;
|
|
|
|
selectBasketCourses: () => Array<Course>;
|
2020-08-12 20:52:53 +02:00
|
|
|
}
|
2020-10-21 18:34:59 +02:00
|
|
|
export const coursesContext = createContext<CourseContext | undefined>(undefined);
|
2020-08-12 20:52:53 +02:00
|
|
|
|
|
|
|
interface CoursesProviderProps {
|
2020-09-18 23:00:11 +02:00
|
|
|
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>>([]);
|
2020-08-12 20:52:53 +02:00
|
|
|
|
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-10-27 01:24:35 +01:00
|
|
|
|
2020-11-21 04:02:38 +01:00
|
|
|
const selectBasketNames = () => basket.map(({ name }) => name);
|
2020-10-21 18:34:59 +02:00
|
|
|
|
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-10-27 01:24:35 +01:00
|
|
|
|
2020-11-21 04:02:38 +01:00
|
|
|
const selectSchedulerEvents = () => {
|
|
|
|
return basket.reduce((res, el) => {
|
|
|
|
const { name } = el;
|
|
|
|
if (el.classes) {
|
|
|
|
const { time } = el.classes;
|
|
|
|
res.push({ ...el.classes, name, time: createClassTime(time) });
|
|
|
|
}
|
|
|
|
if (el.lecture) {
|
|
|
|
const { time } = el.lecture;
|
|
|
|
res.push({ ...el.lecture, name, time: createClassTime(time) });
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}, [] as Array<SchedulerEvent>);
|
2020-10-27 01:24:35 +01:00
|
|
|
};
|
|
|
|
|
2020-11-21 04:02:38 +01:00
|
|
|
const addCourseToBasket = (course: Course) => {
|
2020-10-21 20:42:18 +02:00
|
|
|
const courseToBasket: Basket = {
|
2020-10-01 19:51:06 +02:00
|
|
|
name: course.name,
|
|
|
|
id: course.id,
|
2020-11-21 04:02:38 +01:00
|
|
|
classes: course.classes !== undefined ? course.classes[0] : undefined,
|
2020-10-01 19:51:06 +02:00
|
|
|
lecture: course.lectures !== undefined ? course.lectures[0] : undefined,
|
2020-10-21 20:42:18 +02:00
|
|
|
};
|
2020-10-01 19:51:06 +02:00
|
|
|
setBasket([...basket, courseToBasket]);
|
|
|
|
};
|
2020-10-21 20:42:18 +02:00
|
|
|
|
2020-10-01 19:51:06 +02:00
|
|
|
const deleteFromBasket = (id: number) => setBasket(basket.filter((course) => course.id !== id));
|
2020-09-28 18:36:38 +02:00
|
|
|
|
2020-10-21 18:34:59 +02:00
|
|
|
const saveBasket = async () => {
|
2020-11-21 04:02:38 +01:00
|
|
|
const basketIds = selectBasketIds();
|
2020-10-28 00:07:23 +01:00
|
|
|
const action = (key: any) => (
|
|
|
|
<>
|
|
|
|
<button
|
|
|
|
onClick={() => {
|
|
|
|
closeSnackbar(key);
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
X
|
|
|
|
</button>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
|
2020-10-21 18:34:59 +02:00
|
|
|
try {
|
2020-11-21 04:02:38 +01:00
|
|
|
await axiosInstance.post(`${process.env.REACT_APP_API_URL}/api/v1/commisions/add?`, JSON.stringify(basketIds));
|
2020-10-27 01:24:35 +01:00
|
|
|
enqueueSnackbar('Plan został zapisany', {
|
|
|
|
variant: 'success',
|
2020-10-28 00:07:23 +01:00
|
|
|
action,
|
2020-10-27 01:24:35 +01:00
|
|
|
});
|
2020-10-21 18:34:59 +02:00
|
|
|
} catch (e) {
|
2020-11-21 04:02:38 +01:00
|
|
|
console.log('error: ', e);
|
2020-10-27 01:24:35 +01:00
|
|
|
enqueueSnackbar('Zapisywanie planu nie powiodło się', {
|
|
|
|
variant: 'error',
|
2020-10-28 00:07:23 +01:00
|
|
|
action,
|
2020-10-27 01:24:35 +01:00
|
|
|
});
|
2020-10-21 18:34:59 +02:00
|
|
|
}
|
2020-10-01 20:06:38 +02:00
|
|
|
};
|
2020-08-23 16:02:52 +02:00
|
|
|
|
2020-11-21 04:02:38 +01:00
|
|
|
const changeGroupInBasket = (choosenGroup: Group, id: number) => {
|
2020-08-23 17:22:50 +02:00
|
|
|
const basketCourse = basket.filter((course) => course.id === id)[0];
|
2020-10-27 01:24:35 +01:00
|
|
|
const { type } = choosenGroup;
|
2020-08-23 17:22:50 +02:00
|
|
|
if (type === GroupType.CLASS) {
|
|
|
|
setBasket(
|
|
|
|
basket.map((basket) => (basket.id === basketCourse.id ? { ...basket, classes: choosenGroup } : basket)),
|
|
|
|
);
|
|
|
|
} else if (type === GroupType.LECTURE) {
|
|
|
|
setBasket(
|
|
|
|
basket.map((basket) => (basket.id === basketCourse.id ? { ...basket, lecture: choosenGroup } : basket)),
|
|
|
|
);
|
2020-08-23 16:02:52 +02:00
|
|
|
}
|
2020-08-12 20:52:53 +02:00
|
|
|
};
|
|
|
|
|
2020-10-27 10:42:22 +01:00
|
|
|
const getNewestTimetable = async () => {
|
|
|
|
try {
|
2020-11-21 04:02:38 +01:00
|
|
|
const { data } = await axiosInstance.get(
|
|
|
|
`${process.env.REACT_APP_API_URL}/api/v1/assignments/getCurrentAssignments`,
|
|
|
|
);
|
|
|
|
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-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-10-01 19:51:06 +02:00
|
|
|
`${process.env.REACT_APP_API_URL}/api/v1/courses/getCoursesWithGroups`,
|
|
|
|
);
|
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);
|
2020-10-27 10:42:22 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
useEffect(() => {
|
2020-11-22 17:21:22 +01:00
|
|
|
setTimeout(() => {
|
|
|
|
fetchCourses();
|
|
|
|
getNewestTimetable();
|
|
|
|
}, 200);
|
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={{
|
|
|
|
courses,
|
|
|
|
basket,
|
|
|
|
addCourseToBasket,
|
|
|
|
changeGroupInBasket,
|
|
|
|
deleteFromBasket,
|
|
|
|
saveBasket,
|
|
|
|
selectSchedulerEvents,
|
|
|
|
selectBasketNames,
|
|
|
|
selectBasketCourses,
|
|
|
|
}}
|
|
|
|
>
|
2020-10-01 19:51:06 +02:00
|
|
|
{children}
|
|
|
|
</coursesContext.Provider>
|
2020-08-12 20:52:53 +02:00
|
|
|
);
|
|
|
|
};
|