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+ }
0 commit comments