source: reactapp/src/Pages/Professor.js@ 62b653f

main
Last change on this file since 62b653f was 62b653f, checked in by unknown <mlviktor23@…>, 22 months ago

implemented upvote/downvote func. in react

  • Property mode set to 100644
File size: 4.9 KB
Line 
1import React, { useEffect, useState, useContext } from "react";
2import { Outlet, useParams } from "react-router-dom";
3import JSOG from "jsog";
4import OpinionTree from "../Components/OpinionTree";
5import {
6 AddOpinionButton,
7 Modal,
8 ModalContent,
9 ModalClose,
10 ModalHeader,
11 ModalBody,
12 ModalInput,
13 ModalTextarea,
14 ModalFooter,
15} from "../Components/Styled/Modal.style";
16import {
17 ProfessorCard,
18 ProfessorCardDetails,
19 ProfessorCardName,
20 ProfessorCardSeparator,
21} from "../Components/Styled/ProfessorCard.style";
22import AuthApi from "../api/AuthApi";
23import { useNavigate } from "react-router-dom";
24import axios from "../api/axios";
25
26function Professor(user, userLoaded) {
27 let params = useParams();
28
29 let [professor, setProfessor] = useState(null);
30 let [loaded, setLoaded] = useState(null);
31 let [postModalDisplay, setPostModalDisplay] = useState("none");
32 let navigate = useNavigate();
33 const { auth, setAuth } = useContext(AuthApi);
34 const [postTitle, setPostTitle] = useState("");
35 const [postContent, setPostContent] = useState("");
36
37 useEffect(() => {
38 const url = `http://192.168.0.17:8080/public/professor/${params.professorId}`;
39
40 const fetchData = async () => {
41 try {
42 const response = await fetch(url);
43 var cyclicGraph = await response.json();
44 var jsogStructure = JSOG.encode(cyclicGraph);
45 cyclicGraph = JSOG.decode(jsogStructure);
46 setProfessor(cyclicGraph);
47 setLoaded(true);
48 } catch (error) {
49 console.log("Fetching error", error);
50 }
51 };
52
53 fetchData();
54 }, [params.professorId]);
55
56 const handleAddOpinionButtonClick = () => {
57 if (auth) {
58 setPostModalDisplay("block");
59 } else {
60 navigate("/login");
61 }
62 };
63
64 const handleModalCloseClick = () => {
65 setPostModalDisplay("none");
66 };
67
68 const handlePostSubmit = async (e) => {
69 e.preventDefault();
70
71 const response = await axios(
72 `http://192.168.0.17:8080/secure/professor/${professor.professorId}/addOpinion`,
73 {
74 method: "post",
75 data: {
76 title: postTitle,
77 content: postContent,
78 },
79 withCredentials: true,
80 }
81 );
82
83 window.location.reload(false);
84 };
85
86 const handleTitleChange = (e) => {
87 setPostTitle(e.target.value);
88 };
89
90 const handleContentChange = (e) => {
91 setPostContent(e.target.value);
92 };
93
94 if (loaded) {
95 return (
96 <div>
97 <ProfessorCard>
98 <ProfessorCardName>{professor.professorName}</ProfessorCardName>
99 <ProfessorCardSeparator />
100 <div style={{ marginTop: "10px" }}>
101 <ProfessorCardDetails fontSize="20px">
102 {professor.faculty.facultyName}
103 </ProfessorCardDetails>
104 <ProfessorCardDetails fontSize="15px">
105 {professor.faculty.university.universityName}
106 </ProfessorCardDetails>
107 </div>
108 </ProfessorCard>
109 <div style={{ height: "20px", marginBottom: "30px" }}>
110 <h3
111 style={{
112 float: "left",
113 }}
114 >
115 {professor.relatedOpinions.length}{" "}
116 {professor.relatedOpinions.length !== 1 ? "мислења" : "мислење"}
117 </h3>
118 {auth && (
119 <AddOpinionButton onClick={handleAddOpinionButtonClick}>
120 Објави мислење
121 </AddOpinionButton>
122 )}
123 </div>
124
125 <Modal display={postModalDisplay}>
126 <ModalContent>
127 <ModalHeader>
128 <ModalClose onClick={handleModalCloseClick}>&times;</ModalClose>
129 <h3 style={{ marginTop: "5px" }}>
130 Мислење за {professor.professorName}
131 </h3>
132 </ModalHeader>
133 <form onSubmit={handlePostSubmit}>
134 <ModalBody>
135 <label htmlFor="title">
136 <b>Наслов</b>:
137 <ModalInput
138 id="title"
139 type="text"
140 value={postTitle}
141 onChange={handleTitleChange}
142 />
143 </label>
144 <label htmlFor="content">
145 <b>Содржина</b>:
146 <ModalTextarea
147 id="content"
148 rows="8"
149 cols="100"
150 value={postContent}
151 onChange={handleContentChange}
152 />
153 </label>
154 </ModalBody>
155 <ModalFooter type="submit">ОБЈАВИ</ModalFooter>
156 </form>
157 </ModalContent>
158 </Modal>
159
160 <div className="opinionTree">
161 <OpinionTree
162 professor={professor}
163 user={user}
164 userLoaded={userLoaded}
165 />
166 </div>
167 <Outlet />
168 </div>
169 );
170 } else {
171 return (
172 <div>
173 <p style={{ marginTop: "140px" }}>се вчитува...</p>
174 <Outlet />
175 </div>
176 );
177 }
178}
179
180export default Professor;
Note: See TracBrowser for help on using the repository browser.