Skip to content

Commit 65202d3

Browse files
committed
feature: added article create page
1 parent 7a46ba5 commit 65202d3

File tree

2 files changed

+132
-2
lines changed

2 files changed

+132
-2
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import {useForm} from "../../hooks/useForm.js";
2+
import {useContext, useEffect, useMemo, useState} from "react";
3+
import AuthContext from "../../contexts/AuthContext.js";
4+
import MainContext from "../../contexts/MainContext.js";
5+
import {useNavigate} from "react-router";
6+
7+
const initialFormValues = {
8+
title: "",
9+
content: "",
10+
image: null,
11+
saint: [],
12+
feast: [],
13+
}
14+
15+
export default function ArticleCreate() {
16+
17+
const {api} = useContext(AuthContext)
18+
const {setMessage} = useContext(MainContext)
19+
const [feastsAndSaints, setFeastsAndSaints] = useState({feasts:[], saints:[]})
20+
const navigate = useNavigate();
21+
const {feasts, saints} = useMemo(() => {
22+
const feasts = feastsAndSaints.feasts.map((feast) => {
23+
return (<option key={feast.id} value={feast.id}>{feast.name}</option>)
24+
})
25+
const saints = feastsAndSaints.saints.map((saint) => {
26+
return (<option key={saint.id} value={saint.id}>{saint.name}</option>)
27+
})
28+
return {feasts, saints}
29+
}, [feastsAndSaints])
30+
31+
useEffect(() => {
32+
(async ()=>{
33+
if(feasts.length && saints.length){return}
34+
await api.get(`orth_calendar/feasts/`).then(response => {
35+
const data = response.data;
36+
setFeastsAndSaints(prevState => ({...prevState, feasts: data}))
37+
console.log("feasts updated")
38+
}).catch(error => {
39+
console.error("There was an error fetching the feasts!", error);
40+
setMessage("Грешка при извличане на празниците!");
41+
});
42+
await api.get(`orth_calendar/saints/`).then(response => {
43+
const data = response.data;
44+
setFeastsAndSaints(prevState => ({...prevState, saints: data}))
45+
console.log("saints updated")
46+
}).catch(error => {
47+
console.error("There was an error fetching the saints!", error);
48+
setMessage("Грешка при извличане на светците!");
49+
});
50+
})()
51+
},[])
52+
53+
const submit = async (formData) => {
54+
55+
const {title,content} = formData;
56+
57+
if (!title || !content) {
58+
setMessage("Моля попълнете заглавие и съдържание!");
59+
return;
60+
}
61+
62+
api.post(`api/articles/create`, formData, {
63+
headers: {
64+
"Content-Type": "multipart/form-data",
65+
},
66+
}).then(response => {
67+
console.log(response.data);
68+
setMessage("Статията е създадена успешно!!");
69+
navigate(`/articles/${response.data.id}`);
70+
}).catch(error => {
71+
console.error("There was an error creating the article!", error);
72+
setMessage("Грешка при създаване на статията!");
73+
})
74+
}
75+
76+
77+
const {values, changeHandler, submitHandler: handleSubmit} = useForm(initialFormValues, submit);
78+
79+
return (<form method="post" encType={"multipart/form-data"} onSubmit={handleSubmit}>
80+
81+
<div>
82+
<label htmlFor="id_title">Title:</label>
83+
84+
85+
<input onChange={changeHandler} type="text" name="title" maxLength="1000" required="" id="id_title"/>
86+
87+
</div>
88+
89+
<div>
90+
<label htmlFor="id_content">Content:</label>
91+
92+
93+
<textarea onChange={changeHandler} name="content" cols="40" rows="10" id="id_content"></textarea>
94+
95+
</div>
96+
97+
<div>
98+
<label htmlFor="id_image">Image:</label>
99+
100+
101+
<input onChange={changeHandler} type="file" name="image" accept="image/*" id="id_image"/>
102+
103+
</div>
104+
105+
<div>
106+
<label htmlFor="id_saint">Saint:</label>
107+
108+
109+
<select onChange={changeHandler} name="saint" id="id_saint" multiple={true}>
110+
{saints}
111+
</select>
112+
113+
</div>
114+
115+
<div>
116+
<label htmlFor="id_feast">Feast:</label>
117+
118+
119+
<select onChange={changeHandler} name="feast" id="id_feast" multiple={true}>
120+
{feasts}
121+
</select>
122+
123+
124+
</div>
125+
<input type="submit" value="изпращане"/>
126+
127+
</form>)
128+
}

src/routes/config.jsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@ import Login from "../components/accounts/Login.jsx";
55
import Logout from "../components/accounts/Logout.jsx";
66
import Articles from "../components/articles/Articles.jsx";
77
import Article from "../components/articles/Article.jsx";
8+
import ArticleCreate from "../components/articles/ArticleCreate.jsx";
89

910
export const routeConfig = [
1011
{ path: routes.home, element: <Base/>, nested: [
1112
{path: routes["home"], element: <Articles date={new Date().toISOString().split('T')[0]}/>, nested:[], auth_required: false},
1213
{path: routes["all-articles"], element: <Articles/>, nested:[], auth_required: false},
1314
{path: routes["article-detail"], element: <Article/>, nested:[], auth_required: false},
14-
{path: routes["article-edit"], element: <Article/>, nested:[], auth_required: false},
15-
{path: routes["article-delete"], element: <Article/>, nested:[], auth_required: false},
15+
{path: routes["article-create"], element: <ArticleCreate/>, nested:[], auth_required: true},
16+
{path: routes["article-edit"], element: <Article/>, nested:[], auth_required: true},
17+
{path: routes["article-delete"], element: <Article/>, nested:[], auth_required: true},
1618
{path: routes["login-page"], element: <Login/>, nested:[], auth_required: false},
1719
{path: routes["logout-page"], element: <Logout/>, nested:[], auth_required: true},
1820
{path: routes["calendar-page"], element: <Calendar/>, nested:[], auth_required: false},

0 commit comments

Comments
 (0)