/* eslint-disable no-unused-vars */ // noinspection JSUnresolvedVariable,ES6ConvertVarToLetConst,JSUnresolvedFunction,SpellCheckingInspection,JSUnusedLocalSymbols import React, { useEffect, useState, useContext } from "react"; import { OpinionCard, OpinionCardContent, OpinionCardContentTime, } from "../Components/Styled/OpinionCard.style"; import { UserDetailsCard, UserDetailsCardContent, } from "../Components/Styled/UserDetails.style"; import { dateConverter } from "../Util/dateConverter"; import axios from "../api/axios"; import JSOG from "jsog"; import AuthApi from "../api/AuthApi"; import {EntityLi, EntityTypeSelector, EntityUl} from "../Components/Styled/EntityList.style"; import { AddOpinionButton, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTextarea, ModalInput } from "../Components/Styled/Modal.style"; import LoadingSpinner from "../Components/Styled/LoadingSpinner.style"; import {findParentThread} from "../Util/findParentThread"; function UserDashboard() { const { auth, setAuth } = useContext(AuthApi); const [user, setUser] = useState(null); const [loadedUser, setLoadedUser] = useState(false); const [authoredPosts, setAuthoredPosts] = useState(null); const [loadedAuthoredPosts, setLoadedAuthoredPosts] = useState(false); const [fetchError, setFetchError] = useState(false); const [postReports, setPostReports] = useState(null); const [loadedPostReports, setLoadedPostReports] = useState(false); const [reportModalDisplay, setReportModalDisplay] = useState("none"); const [reportForModal, setReportForModal] = useState(null); const [actionType, setActionType] = useState(0); const [newPostContent, setNewPostContent] = useState(""); const [newOpinionTargetProfessorId, setNewOpinionTargetProfessorId] = useState(""); const [newParentPostId, setNewParentPostId] = useState("-1"); const [newThreadTitle, setNewThreadTitle] = useState(""); const [newParentThreadId,setNewParentThreadId] = useState("-1"); const [newTargetSubjectId, setNewTargetSubjectId] = useState(""); const [markResolved, setMarkResolved] = useState(false); const [errMsg, setErrMsg] = useState(""); const handleModalCloseClick = () => { setReportForModal(null); setReportModalDisplay("none"); document.body.style.overflowY = "auto"; }; const handleViewReportButtonClick = (e,report) => { e.preventDefault(); setReportForModal(report); } useEffect(() => { if(reportForModal!==null) { if (reportForModal.post !== null) { setNewPostContent(reportForModal.post.content); if(reportForModal.post.title !== null) setNewThreadTitle(reportForModal.post.title); if(reportForModal.post.targetProfessor !== undefined) setNewOpinionTargetProfessorId(reportForModal.post.targetProfessor.professorId); //prvicnoto if(reportForModal.post.targetProfessor === undefined) setNewTargetSubjectId(reportForModal.post.targetSubject.subjectId); //prvicnoto } setReportModalDisplay("block"); document.body.style.overflowY = "hidden"; } }, [reportForModal]); const [newOpinionTargetProfessor, setNewOpinionTargetProfessor] = useState(null); const [loadedNewProfessor,setLoadedNewProfessor] = useState(false); const [newProfessorRelatedOpinions, setNewProfessorRelatedOpinions] = useState(null); const [loadedNewProfessorRelatedOpinions, setLoadedNewProfessorRelatedOpinions] = useState(false); const [loadingProf, setLoadingProf] = useState(false); const handleNewTargetProfessorChange = async (e) => { setLoadingProf(true); e.preventDefault(); if (newOpinionTargetProfessorId!=="") { try { Promise.all([fetch(`http://192.168.1.108:8080/public/professor/${newOpinionTargetProfessorId}`), fetch(`http://192.168.1.108:8080/public/professor/${newOpinionTargetProfessorId}/relatedOpinions`)]) .then(([resNewOpinionTargetProfessor, resNewProfessorRelatedOpinions]) => Promise.all([resNewOpinionTargetProfessor.json(), resNewProfessorRelatedOpinions.json()])) .then(([dataNewOpinionTargetProfessor, dataNewProfessorRelatedOpinions]) => { let cyclicGraph1 = dataNewOpinionTargetProfessor; var jsogStructure1 = JSOG.encode(cyclicGraph1); cyclicGraph1 = JSOG.decode(jsogStructure1); setNewOpinionTargetProfessor(cyclicGraph1); setLoadedNewProfessor(true); let cyclicGraph2 = dataNewProfessorRelatedOpinions; var jsogStructure2 = JSOG.encode(cyclicGraph2); cyclicGraph2 = JSOG.decode(jsogStructure2); setNewProfessorRelatedOpinions(cyclicGraph2); setLoadedNewProfessorRelatedOpinions(true); setLoadingProf(false); }) } catch (error) { setFetchError(true); } } } const [newTargetSubject, setNewTargetSubject] = useState(null); const [loadedNewSubject, setLoadedNewSubject] = useState(false); const [newTargetSubjectThreads, setNewTargetSubjectThreads] = useState(null); const [loadedNewSubjectThreads, setLoadedNewSubjectThreads] = useState(false); const [loadingSubj, setLoadingSubj] = useState(false); const handleNewTargetSubjectChange = async (e) => { e.preventDefault(); setLoadingSubj(true); if (newTargetSubjectId!=="") { try { Promise.all([fetch(`http://192.168.1.108:8080/public/subject/${newTargetSubjectId}`), fetch(`http://192.168.1.108:8080/public/subject/${newTargetSubjectId}/threads`)]) .then(([resNewTargetSubject, resNewTargetSubjectThreads]) => Promise.all([resNewTargetSubject.json(), resNewTargetSubjectThreads.json()])) .then(([dataNewTargetSubject, dataNewTargetSubjectThreads]) => { let cyclicGraph1 = dataNewTargetSubject; var jsogStructure1 = JSOG.encode(cyclicGraph1); cyclicGraph1 = JSOG.decode(jsogStructure1); setNewTargetSubject(cyclicGraph1); setLoadedNewSubject(true); let cyclicGraph2 = dataNewTargetSubjectThreads; var jsogStructure2 = JSOG.encode(cyclicGraph2); cyclicGraph2 = JSOG.decode(jsogStructure2); setNewTargetSubjectThreads(cyclicGraph2); setLoadedNewSubjectThreads(true); setLoadingSubj(false); }) } catch (error) { setFetchError(true); } } } useEffect(() => { const fetchUser = () => { try { if(!loadedUser) { Promise.all([axios.get(`http://192.168.1.108:8080/secure/currentUser`, {withCredentials:true}), axios.get(`http://192.168.1.108:8080/secure/currentUser/posts`, {withCredentials:true})]) .then(([resUser, resAuthoredPosts]) => Promise.all([resUser.data, resAuthoredPosts.data])) .then(([dataUser, dataAuthoredPosts]) => { let cyclicGraph1 = dataUser; let jsogStructure1 = JSOG.encode(cyclicGraph1); cyclicGraph1 = JSOG.decode(jsogStructure1); setUser(cyclicGraph1); setLoadedUser(true); let cyclicGraph2 = dataAuthoredPosts; let jsogStructure2 = JSOG.encode(cyclicGraph2); cyclicGraph2 = JSOG.decode(jsogStructure2); setAuthoredPosts(cyclicGraph2); setLoadedAuthoredPosts(true); }) } if(user.userRole==='MODERATOR') fetchPostReports(); } catch (error) { setFetchError(true); } }; const fetchPostReports = async () => { try { const response = await axios.get(`http://192.168.1.108:8080/secure/getAllPostReports`, {withCredentials: true}); var cyclicGraph = await response.data; var jsogStructure = JSOG.encode(cyclicGraph); cyclicGraph = JSOG.decode(jsogStructure); setPostReports(cyclicGraph); setLoadedPostReports(true); } catch (error) { setFetchError(true); } }; if (auth) fetchUser(); }, [user]); const handleEdit = async (e) => { e.preventDefault(); try { if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) { await axios(`http://192.168.1.108:8080/secure/updateOpinion/${reportForModal.post.postId}`, { method: "put", data: { newContent: newPostContent, newTargetProfessorId: reportForModal.post.targetProfessor.professorId, newParentPostId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1" }, withCredentials: true, }) await axios(`http://192.168.1.108:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{ method: "get", withCredentials: true }) } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) { await axios(`http://192.168.1.108:8080/secure/updateThread/${reportForModal.post.postId}`, { method: "put", data: { newTitle: newThreadTitle, newContent: newPostContent, newTargetSubjectId: reportForModal.post.targetSubject.subjectId, newParentThreadId: reportForModal.post.parent !== null ? reportForModal.post.parent.postId : "-1" }, withCredentials: true, }) } await axios(`http://192.168.1.108:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{ method: "get", withCredentials: true }) } catch (error) { setFetchError(true); } window.location.reload(); } const handleRelocate = async (e) => { e.preventDefault(); try { if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) { var response = await axios(`http://192.168.1.108:8080/secure/updateOpinion/${reportForModal.post.postId}`, { method: "put", data: { newContent: reportForModal.post.content, newTargetProfessorId: newOpinionTargetProfessorId, newParentPostId: newParentPostId==="Постави како самостојно мислење" ? "-1" : newParentPostId //:) }, withCredentials: true, }) await axios(`http://192.168.1.108:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{ method: "get", withCredentials: true }) } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) { var response = await axios(`http://192.168.1.108:8080/secure/updateThread/${reportForModal.post.postId}`, { method: "put", data: { newTitle: newThreadTitle, newContent: reportForModal.post.content, newTargetSubjectId: newTargetSubjectId, newParentThreadId: newParentThreadId==="Постави како самостојно мислење (нова тема)" ? "-1" : newParentThreadId //:) }, withCredentials: true, }) } await axios(`http://192.168.1.108:8080/secure/markReportResolved/${reportForModal.postReportId}/${markResolved ? `resolve` : `open`}`,{ method: "get", withCredentials: true }) } catch (error) { setFetchError(true); } setErrMsg(response.data); if (response.data==="") window.location.reload(); } const handleDelete = async (e) => { e.preventDefault(); try { if(reportForModal.post !== null && reportForModal.post.targetProfessor !== undefined) { await axios(`http://192.168.1.108:8080/secure/deleteOpinion/${reportForModal.post.postId}`, { method: "delete", withCredentials: true, }) window.location.reload(); } else if(reportForModal.post !== null && reportForModal.post.targetProfessor === undefined) { await axios(`http://192.168.1.108:8080/secure/deleteThread/${reportForModal.post.postId}`, { method: "delete", withCredentials: true, }) } } catch (error) { setFetchError(true); } window.location.reload(); } const handleMarkResolved = () => { if (actionType !== 1) setMarkResolved(!markResolved); } return loadedUser ? ( <>

Кориснички податоци:

{user.fullName && ( Име: {user.fullName}{" "} )} Корисничко име: {user.username}{" "} E-mail: {user.email} Карма:{" "} {user.karma} {loadedPostReports ? postReports.length > 0 ? (

Пријави за мислења:

) : (

Нема пријавени мислења

) : loadedUser && user.userRole==='MODERATOR' ? : ""} {loadedPostReports && postReports.map((postReport) => { return

{dateConverter( new Date(postReport.time).toString().slice(4, -43) )}
{postReport.description.substring(0,45 )}{postReport.description.length >= 45 ? ("...") : ("")} {postReport.resolved ? (разрешено) : ""}

handleViewReportButtonClick(e,postReport)} style={{height:"30px", padding:"5px", fontSize:"14px", position:"absolute", top:"30%", right:"20px" }}>Разгледај
; })}
{authoredPosts.length > 0 ? (

Ваши мислења:

) : (

Немате објавени мислења

)} {authoredPosts.map((post) => { return (

во дискусија за{" "} {post.targetProfessor !== undefined ? ( {post.targetProfessor.professorName} ) : ( {post.targetSubject.subjectName} )}

{post.content}

{dateConverter( new Date(post.timePosted).toString().slice(4, -43) )} #{post.postId}
); })} {reportForModal && ( ×

Преглед на пријава за мислење

Пријавил: {reportForModal.user !== null ? {reportForModal.user.username} : "(избришан корисник)"}

Време на пријава: {dateConverter( new Date(reportForModal.time).toString().slice(4, -43) )}

Образложение:

{reportForModal.description}

Информации за пријавеното мислење:

{reportForModal.post !== null ?

во дискусија за{" "} {reportForModal.post.targetProfessor !== undefined ? ( {reportForModal.post.targetProfessor.professorName} ) : ( {reportForModal.post.targetSubject.subjectName} )}

{reportForModal.post.title === null ?

{reportForModal.post.author.username} {" "} напишал

:

{reportForModal.post.author.username} {" "} отворил тема со наслов {reportForModal.post.title}

}

{reportForModal.post.content}

{dateConverter( new Date(reportForModal.post.timePosted).toString().slice(4, -43) )} #{reportForModal.post.postId}
: "Пријавеното мислење или неговиот автор се избришани"} {reportForModal.post !== null &&
{actionType===0 ? Измени содржина или наслов : setActionType(0)} > Измени содржина или наслов } {actionType===1 ? Избриши : {setActionType(1); setMarkResolved(true)}} > Избриши } {actionType===2 ? Премести : setActionType(2)} > Премести }
} {reportForModal.post !== null ? actionType === 0 ? (
handleEdit(e)}> {reportForModal.post.title !== null && }
ПОТВРДИ
) : actionType === 1 ? (
handleDelete(e)}>

Избриши го мислењето? (оваа акција е иреверзибилна)

ПОТВРДИ
) : (reportForModal.post.targetProfessor !== undefined ? (
handleRelocate(e)}>

Внеси ID на секцијата за дискусија (за професор) во која треба да биде преместено мислењето:

{e.preventDefault();setNewOpinionTargetProfessorId(e.target.value)}} id="newOpinionTargetProfessorId" spellCheck={false} style={{marginTop:"10px", marginBottom:"10px", width:"90px"}} /> {newOpinionTargetProfessor!==null && !loadingProf ?

Мислењето ќе се премести во секцијата за професорот со ID= {newOpinionTargetProfessor.professorId} ({newOpinionTargetProfessor.professorName})

: loadingProf ? : null} {newOpinionTargetProfessor &&

Постави како дете на мислење со ID:

} {newOpinionTargetProfessor && }
{errMsg!=="" &&

{errMsg}

} ПОТВРДИ
) : //THREAD CASE (
handleRelocate(e)}>

Внеси ID на секцијата за дискусија (за предмет) во која треба да биде преместено мислењето:

{errMsg!=="" &&

{errMsg}

} ПОТВРДИ
)) : null }
)} ) : ( ); } export default UserDashboard;