frontend/src/components/TopBar/Results/index.tsx

123 lines
3.7 KiB
TypeScript
Raw Normal View History

2020-08-12 04:13:14 +02:00
import React, { useState, useContext, useEffect } from 'react';
import axios from 'axios';
import { Input } from '@material-ui/core';
import './index.scss';
import ClickAwayListener from '@material-ui/core/ClickAwayListener';
import { LecturesContext } from '../../../contexts/LecturesProvider';
import { Lecture, Group } from '../../../types';
2020-07-24 18:59:45 +02:00
interface LectureData {
name: string;
id: number;
}
2020-06-30 22:09:13 +02:00
2020-06-30 19:22:32 +02:00
export const Results: React.FC = () => {
2020-08-12 04:13:14 +02:00
const [input, setInput] = useState<string>('');
2020-07-24 18:59:45 +02:00
const [lecturesData, setLecturesData] = useState<Array<LectureData>>([]);
2020-08-12 04:13:14 +02:00
const [filteredLecturesData, setFilteredLecturesData] = useState<Array<LectureData>>([]);
2020-06-30 19:22:32 +02:00
const [open, setOpen] = React.useState(false);
2020-08-12 04:13:14 +02:00
const lecturesContext = useContext(LecturesContext)!;
2020-06-30 22:09:13 +02:00
2020-07-24 17:00:06 +02:00
//fetch lectures ids and lectures names
// useEffect(() => {
// const fetchData = async () => {
// const {lecturesData } = await axios.get(
// `http://localhost:1287/getCourses?name=""`
// );
// setLecturesData(lecturesData);
// };
// fetchData();
// }, []);
useEffect(() => {
const fetchData = async () => {
2020-08-09 20:44:35 +02:00
const results = await axios.get(`http://localhost:1287/getCourses?name=`);
2020-08-12 04:13:14 +02:00
const lecturesData = results.data.map((result: { id: number; name: string }) => ({
id: result.id,
name: result.name,
}));
2020-07-21 21:00:34 +02:00
2020-07-24 17:00:06 +02:00
setLecturesData(lecturesData);
};
fetchData();
}, []);
useEffect(() => {
2020-07-30 18:06:27 +02:00
const names = lecturesContext.lectures.map((lecture) => lecture.name);
2020-07-24 17:00:06 +02:00
const filterLectures = (value: string) => {
2020-08-12 04:13:14 +02:00
let filteredLectures = lecturesData.filter(
(lecture) => lecture.name.toLowerCase().includes(value.toLowerCase()) && !names.includes(lecture.name),
2020-07-24 17:01:35 +02:00
);
2020-07-24 18:59:45 +02:00
setFilteredLecturesData(filteredLectures);
2020-07-24 17:00:06 +02:00
};
filterLectures(input);
2020-07-30 18:06:27 +02:00
}, [input, open]);
2020-07-24 17:00:06 +02:00
2020-07-24 18:59:45 +02:00
const getLecturesById = async (id: string) => {
2020-08-12 04:13:14 +02:00
const { data } = await axios.get(`http://localhost:1287/getClassesByCourseId?id=${id}`);
2020-07-24 17:00:06 +02:00
return data;
};
2020-06-30 22:09:13 +02:00
2020-06-30 19:22:32 +02:00
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setInput(event.target.value);
};
const handleClick = () => {
setOpen(true);
};
const handleClickAway = () => {
setOpen(false);
};
2020-07-24 17:00:06 +02:00
const onLectureClick = async (e: React.MouseEvent) => {
const target = e.currentTarget as HTMLElement;
2020-06-30 22:09:13 +02:00
const id = target.id;
2020-07-24 17:00:06 +02:00
const result = await getLecturesById(id);
2020-07-30 18:06:27 +02:00
2020-07-24 18:59:45 +02:00
let groups: Array<Group> = [];
let lecture = { groups: groups } as Lecture;
lecture.id = result[0].course.id;
lecture.name = result[0].course.name;
for (let i = 0; i < result.length; i++) {
let group = {} as Group;
group.id = result[i].id;
group.day = result[i].day;
group.time = result[i].time;
2020-08-12 04:13:14 +02:00
group.lecturer = result[i].lecturer.title + ' ' + result[i].lecturer.name + ' ' + result[i].lecturer.surname;
2020-08-09 20:44:35 +02:00
group.room = result[i].room.trim();
2020-07-24 18:59:45 +02:00
lecture.groups.push(group);
}
console.log(result);
console.log(result[0].course.name);
2020-08-09 20:44:35 +02:00
lecturesContext.addLecture(lecture);
2020-06-30 22:09:13 +02:00
setOpen(false);
2020-07-24 17:00:06 +02:00
};
2020-06-30 22:09:13 +02:00
2020-06-30 19:22:32 +02:00
return (
<ClickAwayListener onClickAway={handleClickAway}>
<div>
<Input
placeholder="Wyszukaj..."
2020-08-12 04:13:14 +02:00
inputProps={{ 'aria-label': 'description' }}
2020-06-30 19:22:32 +02:00
className="top-bar__input-field"
onChange={handleChange}
onClick={handleClick}
2020-07-01 00:59:19 +02:00
value={input}
2020-06-30 19:22:32 +02:00
/>
{open ? (
<div className="dropdown">
2020-07-24 18:59:45 +02:00
{filteredLecturesData.map((lecture, index) => (
2020-08-12 04:13:14 +02:00
<div className="lecture" key={index} id={String(lecture.id)} onClick={onLectureClick}>
2020-06-30 22:09:13 +02:00
<p>{lecture.name} </p>
2020-06-30 19:22:32 +02:00
</div>
))}
</div>
) : null}
</div>
</ClickAwayListener>
);
};