source: frontend/src/FrontPage.js@ 49b0bbd

Last change on this file since 49b0bbd was a26f6a1, checked in by Danilo <danilo.najkov@…>, 23 months ago

full auth flow

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