source: frontend/web3-eDnevnik_Frontend/src/pages/DirektorAdmin_Pages/CreateBlagajnik/CreateBlagajnik.jsx

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

initial commit

  • Property mode set to 100644
File size: 5.3 KB
Line 
1import React, { useState, useEffect } from "react";
2import axios from "axios";
3import { useNavigate } from "react-router-dom";
4import styles from "./CreateBlagajnikStyles.module.css";
5import Navbar from "../../../components/nav/Navbar.jsx";
6
7const CreateBlagajnik = () => {
8 const navigate = useNavigate();
9
10 const [adminId, setAdminId] = useState("");
11
12 const [error, setError] = useState("");
13 const [loading, setLoading] = useState(true);
14
15 const [formData, setFormData] = useState({
16 e_posta: "",
17 lozinka: "",
18 ime: "",
19 prezime: "",
20 pol: "Masko",
21 adresa: "",
22 });
23
24 useEffect(() => {
25 const fetchInitialData = async () => {
26 try {
27 setLoading(true);
28
29 const [resMe] = await Promise.all([
30 axios.get("http://localhost:8080/api/auth/me", {
31 withCredentials: true,
32 }),
33 ]);
34
35 setAdminId(resMe.data.id || resMe.data.userId);
36 } catch (err) {
37 console.error("Грешка при вчитување податоци:", err);
38 setError(
39 "Грешка при вчитување на admin Id на логираниот директор админ"
40 );
41 } finally {
42 setLoading(false);
43 }
44 };
45 fetchInitialData();
46 }, []);
47
48 const handleChange = (e) => {
49 const { name, value } = e.target;
50 setFormData((prev) => ({
51 ...prev,
52 [name]: value,
53 }));
54 };
55
56 const handleSubmit = async (e) => {
57 e.preventDefault();
58 setError("");
59
60 const blagajnikRequestDTO = {
61 e_posta: formData.e_posta,
62 lozinka: formData.lozinka,
63 ime: formData.ime,
64 prezime: formData.prezime,
65 pol: formData.pol,
66 adresa: formData.adresa,
67 kreiranOdId: adminId,
68 };
69
70 try {
71 const response = await axios.post(
72 "http://localhost:8080/api/users/blagajnici",
73 blagajnikRequestDTO,
74 {
75 withCredentials: true,
76 headers: { "Content-Type": "application/json" },
77 }
78 );
79
80 if (response.status === 200 || response.status === 201) {
81 alert("Благајникот е успешно креиран!");
82 navigate("/adminDashboard/users");
83 }
84 } catch (err) {
85 console.error("Грешка при POST:", err.response?.data);
86 const serverMsg =
87 err.response?.data?.message ||
88 "Грешка при валидација. Проверете ги сите полиња.";
89 setError(serverMsg);
90 }
91 };
92
93 if (loading)
94 return (
95 <div style={{ padding: "50px", textAlign: "center" }}>
96 <Navbar />
97 <h2>Вчитување на формата...</h2>
98 </div>
99 );
100
101 return (
102 <div style={{ backgroundColor: "#fdf8e1", minHeight: "100vh" }}>
103 <Navbar />
104 <div className={styles.container}>
105 <h2 className={styles.title}>Додади нов благајник</h2>
106
107 {error && <div className={styles.errorBanner}>{error}</div>}
108
109 <form onSubmit={handleSubmit} className={styles.formGrid}>
110 <div className={styles.inputGroup}>
111 <label>Име *</label>
112 <input
113 type="text"
114 name="ime"
115 value={formData.ime}
116 required
117 onChange={handleChange}
118 className={styles.inputField}
119 />
120 </div>
121
122 <div className={styles.inputGroup}>
123 <label>Презиме *</label>
124 <input
125 type="text"
126 name="prezime"
127 value={formData.prezime}
128 required
129 onChange={handleChange}
130 className={styles.inputField}
131 />
132 </div>
133
134 <div className={styles.inputGroup}>
135 <label>Е-пошта *</label>
136 <input
137 type="email"
138 name="e_posta"
139 value={formData.e_posta}
140 required
141 onChange={handleChange}
142 className={styles.inputField}
143 />
144 </div>
145
146 <div className={styles.inputGroup}>
147 <label>Лозинка * (мин. 6 карактери)</label>
148 <input
149 type="password"
150 name="lozinka"
151 value={formData.lozinka}
152 required
153 onChange={handleChange}
154 className={styles.inputField}
155 />
156 </div>
157
158 <div className={styles.inputGroup}>
159 <label>Пол *</label>
160 <select
161 name="pol"
162 value={formData.pol}
163 onChange={handleChange}
164 className={styles.inputField}
165 >
166 <option value="Masko">Машко</option>
167 <option value="Zensko">Женско</option>
168 </select>
169 </div>
170 <div className={styles.inputGroup + " " + styles.fullWidth}>
171 <label>Адреса</label>
172 <input
173 type="text"
174 name="adresa"
175 value={formData.adresa}
176 onChange={handleChange}
177 className={styles.inputField}
178 />
179 </div>
180
181 <div className={styles.fullWidth}>
182 <button type="submit" className={styles.submitBtn}>
183 Креирај благајник
184 </button>
185 </div>
186 </form>
187 </div>
188 </div>
189 );
190};
191
192export default CreateBlagajnik;
Note: See TracBrowser for help on using the repository browser.