From 8af5bd36d9007baf64f88f3db3cafb88ce339815 Mon Sep 17 00:00:00 2001 From: dm1sh <me@dmitriy.icu> Date: Wed, 17 May 2023 10:48:38 +0300 Subject: [PATCH] Updated details page, implemented booking --- front/src/components/AnnouncementDetails.jsx | 21 +++++----- front/src/hooks/api/useBook.js | 42 ++++++++++++++++++++ front/src/utils/auth.js | 6 ++- front/src/utils/useBook.js | 18 --------- 4 files changed, 57 insertions(+), 30 deletions(-) create mode 100644 front/src/hooks/api/useBook.js delete mode 100644 front/src/utils/useBook.js diff --git a/front/src/components/AnnouncementDetails.jsx b/front/src/components/AnnouncementDetails.jsx index 0a84453..7685e35 100644 --- a/front/src/components/AnnouncementDetails.jsx +++ b/front/src/components/AnnouncementDetails.jsx @@ -1,19 +1,18 @@ -import Modal from 'react-bootstrap/Modal' +import { Modal, Button } from 'react-bootstrap' +import { MapContainer, Marker, Popup, TileLayer } from 'react-leaflet' import { categoryNames } from '../assets/category' -import { MapContainer, Marker, Popup, TileLayer } from 'react-leaflet' -import { Button } from 'react-bootstrap' -import useBook from '../utils/useBook' +import { useBook } from '../hooks/api' function AnnouncementDetails({ close, announcement: { id, name, category, bestBy, description, lat, lng, address, metro } }) { - const handleBook = useBook(id) - + const {handleBook, status: bookStatus} = useBook(id) + return ( <div className="modal show" style={{ display: 'flex', position: 'initial', alignItems: "center" }} > - <Modal.Dialog> + <Modal.Dialog style={{minWidth: "50vw"}}> <Modal.Header closeButton onHide={close}> <Modal.Title> Подробнее @@ -24,10 +23,10 @@ function AnnouncementDetails({ close, announcement: { id, name, category, bestBy <h1>{name}</h1> <span>{categoryNames.get(category)}</span> - <span className='m-2'>•</span> {/* dot */} + <span className='m-2'>•</span>{/* dot */} <span>Годен до {new Date(bestBy).toLocaleString('ru-RU')}</span> - - <p className='mb-2'>{description}</p> + + <p className='mb-3'>{description}</p> <MapContainer style={{ width: "100%", minHeight: 300 }} center={[lat, lng]} zoom={16} > <TileLayer @@ -43,7 +42,7 @@ function AnnouncementDetails({ close, announcement: { id, name, category, bestBy <Modal.Footer> <Button variant='success' onClick={handleBook}> - Забронировать + {bookStatus || "Забронировать"} </Button> </Modal.Footer> </Modal.Dialog> diff --git a/front/src/hooks/api/useBook.js b/front/src/hooks/api/useBook.js new file mode 100644 index 0000000..e7dc9e5 --- /dev/null +++ b/front/src/hooks/api/useBook.js @@ -0,0 +1,42 @@ +import { useState } from "react" +import { useNavigate } from "react-router-dom" + +import { getToken } from "../../utils/auth" +import { API_URL } from "../../config" + +function useBook(id) { + const navigate = useNavigate() + + const [status, setStatus] = useState('') + + const handleBook = () => { + const token = getToken() || "Test" + + if (token) { + setStatus("Загрузка") + + fetch(API_URL + '/book', { + method: 'POST', + body: JSON.stringify({ + id: id + }), + headers: { + 'Authorization': 'Bearer ' + token, + 'Content-Type': 'application/json' + } + }).then(res => res.json()).then(data => { + if (data.Success === true) { + setStatus('Забронировано') + } else { + setStatus("Ошибка бронирования") + } + }) + } else { + return navigate("/login") + } + } + + return { handleBook, status } +} + +export default useBook diff --git a/front/src/utils/auth.js b/front/src/utils/auth.js index ce9a497..88d8dcf 100644 --- a/front/src/utils/auth.js +++ b/front/src/utils/auth.js @@ -6,4 +6,8 @@ const getToken = () => { return token } -export { getToken } \ No newline at end of file +const setToken = (token) => { + localStorage.setItem("Token", token) +} + +export { getToken, setToken } \ No newline at end of file diff --git a/front/src/utils/useBook.js b/front/src/utils/useBook.js deleted file mode 100644 index 1bcddbb..0000000 --- a/front/src/utils/useBook.js +++ /dev/null @@ -1,18 +0,0 @@ -import { useNavigate } from "react-router-dom" -import { getToken } from "./auth" - -function useBook(id) { - const navigate = useNavigate() - - const handleBook = () => { - /* TODO */ - - if (!getToken()) { - return navigate("/login") - } - } - - return handleBook -} - -export default useBook