source: frontend/src/FrontPage.js@ 899b19d

Last change on this file since 899b19d was 899b19d, checked in by Danilo <danilo.najkov@…>, 2 years ago

reviews full feature

  • Property mode set to 100644
File size: 7.8 KB
Line 
1import React, {useState, useEffect} from 'react'
2import {Header} from "./Header";
3import {useNavigate} from "react-router-dom";
4import {Button, Card, DatePicker, Form, Image, Input, Modal, notification, Rate, Spin} from "antd";
5import placeholderImage from '../src/Assets/placeholder.png'
6import AddNewReservation from "./Dashboard/AddNewReservation";
7import axios from "axios";
8import env from "./env";
9import Review from "./Dashboard/Review";
10
11const FrontPage = ({user, logout}) => {
12 const [restaurant, setRestaurant] = useState({name:'Sample Restaurant name', address: 'Sample street 1', city:'Sample'});
13 const [newReservationModal, setNewReservationModal] = useState(false);
14 const [saveModalLoading, setSaveModalLoading] = useState(false);
15 const [newReviewModal, setNewReviewModal] = useState(false);
16 const [loading, setLoading] = useState(true);
17 const [refreshToggle, setRefreshToggle] = useState(false);
18 const history = useNavigate();
19
20 useEffect(()=>{
21 setLoading(true);
22 axios.get(env.api + 'Restaurants').then(res=>{
23 setRestaurant(res.data);
24 setLoading(false);
25 });
26 },[])
27
28 const saveNewReview = data =>{
29 setSaveModalLoading(true)
30 axios.post(env.api + 'Reviews',data,{ headers: {Authorization: sessionStorage.getItem('Auth')}}).then(res=>{
31 setNewReviewModal(false)
32 setSaveModalLoading(false)
33 notification['success']({
34 message: 'Успешно зачувано',
35 });
36 setRefreshToggle(ref => !ref);
37 }).catch(err=>{
38 setSaveModalLoading(false)
39 notification['error']({
40 message: 'Се случи проблем при зачувување',
41 });
42 });
43 }
44
45 return(
46 <div>
47 <Header onClickButton={!user?()=>history('/login'):logout} buttonText={!user?'Најави се':'Одјави се'}/>
48 {loading ? <Spin style={{margin: 20}}/> :
49 <div style={{
50 height: '400px',
51 width: '100%',
52 borderTop: '1px solid gray',
53 padding: '20px'
54 }}>
55 <div id={'businessFrontImage'}>
56 <Image
57 src={restaurant.base64Image}
58 id={'businessFrontInsideImage'}
59 placeholder={
60 <img
61 src={placeholderImage}
62 alt={'place'}
63 style={{width: '100%', height: '100%'}}
64 />
65 }
66 wrapperStyle={{overflow: 'hidden', width: '100%'}}
67 style={{width: '100%', height: '100%', margin: 'auto', objectFit: 'cover'}}>
68 </Image>
69 </div>
70 <div id={'businessFrontInfo'}>
71 <div style={{
72 width: '100%',
73 height: '100%',
74 display: 'flex',
75 flexDirection: 'column',
76 justifyContent: 'space-between'
77 }}>
78 <div style={{flexGrow: 1, fontSize: '20px', fontWeight: '500', textAlign: 'start'}}>
79 {restaurant.name}
80 <div style={{
81 color: 'gray',
82 fontSize: '10px'
83 }}>{restaurant.address}, {restaurant.phone}</div>
84 </div>
85 <Button onClick={() => setNewReservationModal(true)}
86 style={{width: '100%', marginTop: '5px'}} type={'primary'}>Резервирај</Button>
87 </div>
88
89 </div>
90 <div style={{textAlign: 'start', backgroundColor: '#F2F2F2'}}>
91 <div style={{
92 width: '100%',
93 height:'75px',
94 backgroundColor: 'white',
95 padding: '20px',
96 border: '1px solid lightgray'
97 }} >
98 <h2 style={{float: 'left'}}>Мени</h2>
99 </div>
100 {restaurant.menu.map(el =>
101 <Card key={el.id} title={el.title} style={{ width: 280, display:'inline-block', margin:'10px' }} size="small">
102 <p>{el.description}</p>
103 <b>{el.price} ден.</b>
104 </Card>
105 )}
106 <Review user={user} front refresh={refreshToggle} setVisible={setNewReviewModal}/>
107 </div>
108 </div>
109 }
110 <Modal
111 style={{top: 20}}
112 width={'700px'}
113 title="Нова Резервација"
114 footer={[
115 <Button form="newResForm" key="submit" htmlType="submit" type={'primary'} loading={saveModalLoading}>
116 Прати
117 </Button>
118 ]}
119 onCancel={()=>setNewReservationModal(false)}
120 visible={newReservationModal}>
121 <AddNewReservation setModalSaveLoading={setSaveModalLoading} setModalVisible={setNewReservationModal} />
122 </Modal>
123 <Modal
124 style={{top: 20}}
125 width={'700px'}
126 title="Нова оценка"
127 footer={[
128 <Button form="newReviewForm" key="submit" htmlType="submit" type={'primary'} loading={saveModalLoading}>
129 Прати
130 </Button>
131 ]}
132 onCancel={()=>setNewReviewModal(false)}
133 visible={newReviewModal}>
134 <Form onFinish={saveNewReview}
135 id={'newReviewForm'}
136 onFinishFailed={()=>
137 notification['error']({
138 message: 'Ве молиме поправете ги сите грешки пред зачувување!',
139 })}>
140 <Form.Item
141 label="Наслов"
142 name="title"
143 rules={[
144 {
145 required: true,
146 message: 'Ве молиме внесете наслов!',
147 },
148 ]}
149 >
150 <Input/>
151 </Form.Item>
152 <Form.Item
153 label="Опис"
154 name="description"
155 rules={[
156 {
157 required: true,
158 message: 'Ве молиме внесете опис!',
159 },
160 ]}
161 >
162 <Input.TextArea rows={4}/>
163 </Form.Item>
164 <Form.Item
165 label="Оценка"
166 name="stars"
167 rules={[
168 {
169 required: true,
170 message: 'Ве молиме внесете оценка!',
171 },
172 ]}
173 >
174 <Rate/>
175 </Form.Item>
176 </Form>
177 </Modal>
178 </div>
179 )
180}
181export default FrontPage;
Note: See TracBrowser for help on using the repository browser.