[9bf1f8d] | 1 | import React, {useEffect, useState} from 'react';
|
---|
| 2 | import JSOG from "jsog";
|
---|
| 3 | import {OpinionCard, OpinionCardContent, OpinionCardContentTime} from "../Components/Styled/OpinionCard.style";
|
---|
| 4 | import LoadingSpinner from "../Components/Styled/LoadingSpinner.style";
|
---|
| 5 | import {dateConverter} from "../Util/dateConverter";
|
---|
| 6 | import {findParentThread} from "../Util/findParentThread";
|
---|
| 7 | import {CurrentPageNav} from "../Components/Styled/Main.style";
|
---|
| 8 |
|
---|
| 9 | const Home = () => {
|
---|
| 10 | const [latestOpinions, setLatestOpinions] = useState(null);
|
---|
| 11 | const [loadedLatestOpinions, setLoadedLatestOpinions] = useState(false);
|
---|
| 12 | const [latestThreads, setLatestThreads] = useState(null);
|
---|
| 13 | const [loadedLatestThreads, setLoadedLatestThreads] = useState(false);
|
---|
| 14 |
|
---|
| 15 | useEffect(() => {
|
---|
| 16 | Promise.all([fetch(`http://192.168.1.254:8080/public/latest10opinions`),
|
---|
| 17 | fetch(`http://192.168.1.254:8080/public/latest10threads`)])
|
---|
| 18 | .then(([resOpinions, resThreads]) => Promise.all([resOpinions.json(), resThreads.json()]))
|
---|
| 19 | .then(([dataOpinions, dataThreads]) => {
|
---|
| 20 | let cyclicGraph1 = dataOpinions;
|
---|
| 21 | let jsogStructure1 = JSOG.encode(cyclicGraph1);
|
---|
| 22 | cyclicGraph1 = JSOG.decode(jsogStructure1);
|
---|
| 23 | setLatestOpinions(cyclicGraph1);
|
---|
| 24 | setLoadedLatestOpinions(true);
|
---|
| 25 |
|
---|
| 26 | let cyclicGraph2 = dataThreads;
|
---|
| 27 | let jsogStructure2 = JSOG.encode(cyclicGraph2);
|
---|
| 28 | cyclicGraph2 = JSOG.decode(jsogStructure2);
|
---|
| 29 | setLatestThreads(cyclicGraph2);
|
---|
| 30 | setLoadedLatestThreads(true);
|
---|
| 31 | })
|
---|
| 32 |
|
---|
| 33 | }, []);
|
---|
| 34 |
|
---|
| 35 | return (
|
---|
| 36 | <>
|
---|
| 37 | <CurrentPageNav>
|
---|
| 38 | »{" "}
|
---|
| 39 | <a href={"/university/1"}>
|
---|
| 40 | Универзитет „Св. Кирил и Методиј“
|
---|
| 41 | </a>
|
---|
| 42 | </CurrentPageNav>
|
---|
| 43 | <div style={{display:"grid", gridTemplateColumns:"1fr 1fr", gap:"40px", marginTop:"60px"}}>
|
---|
| 44 |
|
---|
| 45 | <div id="latestOpinions" style={{gridColumn:"1", paddingLeft:"20px"}}>
|
---|
| 46 | <h2 style={{fontWeight:"normal", marginBottom:"30px"}}>Последни мислења за <span style={{fontWeight:"bold"}}>професори</span></h2>
|
---|
| 47 | {loadedLatestOpinions ? latestOpinions.slice(5).map(opinion => {
|
---|
| 48 | opinion.timePosted = undefined;
|
---|
| 49 | return <OpinionCard key={opinion.postId}>
|
---|
| 50 | <OpinionCardContent>
|
---|
| 51 | <p style={{marginBottom:"10px"}}>
|
---|
| 52 | во дискусија за{" "}
|
---|
| 53 | <a href={"/professor/" + opinion.targetProfessor.professorId}>
|
---|
| 54 | {opinion.targetProfessor.professorName}
|
---|
| 55 | </a>
|
---|
| 56 | </p>
|
---|
| 57 | <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
|
---|
| 58 | <a href={"/user/" + opinion.author.id}>
|
---|
| 59 | {opinion.author.username}
|
---|
| 60 | </a>{" "}
|
---|
| 61 | напишал
|
---|
| 62 | </p>
|
---|
| 63 | <p style={{ marginBottom: "10px", maxWidth: "90%" }}>
|
---|
| 64 | {opinion.content}
|
---|
| 65 | </p>
|
---|
| 66 | {new Date(opinion.timePosted).setMilliseconds(0) === new Date(opinion.timeLastEdited).setMilliseconds(0) ? (
|
---|
| 67 | <OpinionCardContentTime>
|
---|
| 68 | {dateConverter(
|
---|
| 69 | new Date(opinion.timePosted).toString().slice(4, -43)
|
---|
| 70 | )} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>
|
---|
| 71 | </OpinionCardContentTime>
|
---|
| 72 | ) : (
|
---|
| 73 | <OpinionCardContentTime>
|
---|
| 74 | {dateConverter(
|
---|
| 75 | new Date(opinion.timeLastEdited)
|
---|
| 76 | .toString()
|
---|
| 77 | .slice(4, -43)
|
---|
| 78 | )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{opinion.postId}</span>{" "}
|
---|
| 79 | (едитирано од модератор)
|
---|
| 80 | </OpinionCardContentTime>
|
---|
| 81 | )}
|
---|
| 82 | </OpinionCardContent>
|
---|
| 83 | </OpinionCard>
|
---|
| 84 | }) : <LoadingSpinner/>}
|
---|
| 85 | </div>
|
---|
| 86 |
|
---|
| 87 | <div id="latestThreads" style={{gridColumn:"2", paddingRight:"20px"}}>
|
---|
| 88 | <h2 style={{fontWeight:"normal", marginBottom:"30px"}}>Последни мислења за <span style={{fontWeight:"bold"}}>предмети</span></h2>
|
---|
| 89 | {loadedLatestThreads ? latestThreads.slice(5).map(thread => {
|
---|
| 90 | return <OpinionCard key={thread.postId}>
|
---|
| 91 | <OpinionCardContent>
|
---|
| 92 | <p style={{marginBottom:"10px"}}>
|
---|
| 93 | во дискусија за{" "}
|
---|
| 94 | <a href={
|
---|
| 95 | thread.parent === null
|
---|
| 96 | ? "/topic/" + thread.postId
|
---|
| 97 | : "/topic/" + findParentThread(thread).postId
|
---|
| 98 | }
|
---|
| 99 | > {thread.targetSubject.subjectName}
|
---|
| 100 | </a>
|
---|
| 101 | </p>
|
---|
| 102 | <p style={{ fontStyle: "italic", marginBottom: "10px" }}>
|
---|
| 103 | <a href={"/user/" + thread.author.id}>
|
---|
| 104 | {thread.author.username}
|
---|
| 105 | </a>{" "}
|
---|
| 106 | напишал
|
---|
| 107 | </p>
|
---|
| 108 | <p style={{ marginBottom: "10px", maxWidth: "90%" }}>
|
---|
| 109 | {thread.content}
|
---|
| 110 | </p>
|
---|
| 111 | {new Date(thread.timePosted).setMilliseconds(0) === new Date(thread.timeLastEdited).setMilliseconds(0) ? (
|
---|
| 112 | <OpinionCardContentTime>
|
---|
| 113 | {dateConverter(
|
---|
| 114 | new Date(thread.timePosted).toString().slice(4, -43)
|
---|
| 115 | )} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>
|
---|
| 116 | </OpinionCardContentTime>
|
---|
| 117 | ) : (
|
---|
| 118 | <OpinionCardContentTime>
|
---|
| 119 | {dateConverter(
|
---|
| 120 | new Date(thread.timeLastEdited)
|
---|
| 121 | .toString()
|
---|
| 122 | .slice(4, -43)
|
---|
| 123 | )}{" "} <span style={{fontStyle:"normal",color:"blue"}}>#{thread.postId}</span>{" "}
|
---|
| 124 | (едитирано од модератор)
|
---|
| 125 | </OpinionCardContentTime>
|
---|
| 126 | )}
|
---|
| 127 | </OpinionCardContent>
|
---|
| 128 | </OpinionCard>
|
---|
| 129 | }) : null}
|
---|
| 130 | </div>
|
---|
| 131 | </div>
|
---|
| 132 | </>
|
---|
| 133 | );
|
---|
| 134 | };
|
---|
| 135 |
|
---|
| 136 | export default Home; |
---|