source: frontend/web3-eDnevnik_Frontend/src/pages/KlasenRakovoditel_Pages/Klasen_CreateSoopstenie/Klasen_CreateSoopstenie.jsx

Last change on this file was 81cdf2d, checked in by Nikola Janev <nikolajanev57@…>, 9 days ago

initial commit

  • Property mode set to 100644
File size: 4.8 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { useNavigate } from "react-router-dom";
4import styles from "./Klasen_CreateSoopstenieStyles.module.css";
5import Navbar from "../../../components/nav/Navbar.jsx";
6
7const Klasen_CreateSoopstenie = () => {
8 const navigate = useNavigate();
9
10 const [teacherId, setTeacherId] = useState("");
11 const [classId, setClassId] = useState("");
12 const [error, setError] = useState("");
13 const [loading, setLoading] = useState(true);
14
15 const [formData, setFormData] = useState({
16 naslov: "",
17 sodrzina: "",
18 });
19
20 useEffect(() => {
21 const fetchInitialData = async () => {
22 try {
23 setLoading(true);
24
25 const resMe = await axios.get("http://localhost:8080/api/auth/me", {
26 withCredentials: true,
27 });
28 const tId = resMe.data.id;
29 setTeacherId(tId);
30
31 const resClass = await axios.get(
32 `http://localhost:8080/api/users/nastavnici/klasniRakovoditeli/${tId}/klas`,
33 { withCredentials: true }
34 );
35
36 if (resClass.data && resClass.data.id) {
37 setClassId(resClass.data.id);
38 } else {
39 setError("Немате доделено активен клас.");
40 }
41 } catch (err) {
42 console.error("Грешка при вчитување на податоците:", err);
43 setError("Неуспешно вчитување на податоците за наставникот и класот.");
44 } finally {
45 setLoading(false);
46 }
47 };
48 fetchInitialData();
49 }, []);
50
51 const handleChange = (e) => {
52 const { name, value } = e.target;
53 setFormData((prev) => ({
54 ...prev,
55 [name]: value,
56 }));
57 };
58
59 const handleSubmit = async (e) => {
60 e.preventDefault();
61 setError("");
62
63 const today = new Date();
64 const formattedDate = today.toISOString().split("T")[0];
65
66 const soopstenieRequestDTO = {
67 naslov: formData.naslov,
68 sodrzina: formData.sodrzina,
69 kreiranoNa: formattedDate,
70 zaKlasId: classId,
71 postiranoOdId: teacherId,
72 };
73
74 try {
75 console.log("Праќам податоци:", soopstenieRequestDTO);
76 const response = await axios.post(
77 "http://localhost:8080/api/soopstenie",
78 soopstenieRequestDTO,
79 {
80 withCredentials: true,
81 headers: { "Content-Type": "application/json" },
82 }
83 );
84
85 if (response.status === 200 || response.status === 201) {
86 alert("Соопштението е успешно објавено!");
87 navigate("/dashboard");
88 }
89 } catch (err) {
90 console.error("Грешка при POST:", err.response?.data);
91 const serverMsg =
92 err.response?.data?.message ||
93 "Грешка при креирање на соопштението. Проверете ги сите полиња.";
94 setError(serverMsg);
95 }
96 };
97
98 if (loading)
99 return (
100 <div style={{ padding: "50px", textAlign: "center" }}>
101 <Navbar />
102 <h2>Вчитување на податоците...</h2>
103 </div>
104 );
105
106 return (
107 <div style={{ backgroundColor: "#f4f7f6", minHeight: "100vh" }}>
108 <Navbar />
109 <div className="container">
110 <h2 className="text-center m-3">Објави Ново Соопштение</h2>
111
112 {error && <div className={styles.errorBanner}>{error}</div>}
113
114 <form onSubmit={handleSubmit} className={styles.formGrid}>
115 <div className={styles.inputGroup + " " + styles.fullWidth}>
116 <label className="form-label">Наслов на соопштение</label>
117 <input
118 type="text"
119 name="naslov"
120 value={formData.naslov}
121 required
122 placeholder="Внесете наслов (3-30 карактери)"
123 onChange={handleChange}
124 className="form-control"
125 />
126 </div>
127
128 <div className={styles.inputGroup + " " + styles.fullWidth}>
129 <label className="form-label mt-2">Содржина</label>
130 <textarea
131 name="sodrzina"
132 value={formData.sodrzina}
133 required
134 placeholder="Напишете го вашето соопштение тука (мин. 10 карактери)..."
135 onChange={handleChange}
136 className="form-control"
137 style={{ minHeight: "200px", resize: "vertical" }}
138 />
139 </div>
140
141 <div className="text-center m-3">
142 <button
143 type="submit"
144 className={styles.submitBtn}
145 disabled={!classId}
146 >
147 Објави Соопштение
148 </button>
149 </div>
150 </form>
151 </div>
152 </div>
153 );
154};
155
156export default Klasen_CreateSoopstenie;
Note: See TracBrowser for help on using the repository browser.