source: reactapp/src/Pages/Professor.js@ 3b6962d

main
Last change on this file since 3b6962d was 3b6962d, checked in by unknown <mlviktor23@…>, 20 months ago

moderation/reporting api in spring boot

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