diff --git a/src/App.js b/src/App.js index 4e9fabc..f439e7c 100644 --- a/src/App.js +++ b/src/App.js @@ -23,6 +23,7 @@ import Settings from "./components/Dialogs/Settings"; import EditRestaurant from "./components/Dialogs/EditRestaurant"; import NewDish from "./components/Dialogs/NewDish"; import EditDish from "./components/Dialogs/EditDish"; +import Dish from "./components/Dialogs/Dish"; const theme = createMuiTheme({ palette: { @@ -75,7 +76,7 @@ function App(props) { component={} /> - + diff --git a/src/App.scss b/src/App.scss index 59352e9..b4d7e01 100644 --- a/src/App.scss +++ b/src/App.scss @@ -9,6 +9,7 @@ @import "./styles/Dialogs.scss"; @import "./styles/NewRestaurant.scss"; @import "./styles/EditRestaurant.scss"; +@import "./styles/Dish.scss"; .App { background-image: url("./public/bg_tile.jpg"); diff --git a/src/actions/index.js b/src/actions/index.js index b337407..517d60e 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -92,6 +92,13 @@ const setDishes = (data) => { }; }; +const setDish = (data) => { + return { + type: "SET_DISH", + payload: data, + }; +}; + export const fetchAllDishes = (id) => { return function (dispatch) { axios @@ -103,6 +110,20 @@ export const fetchAllDishes = (id) => { }; }; +export const fetchDish = (id) => { + return function (dispatch) { + axios + .get(backend + "dish/?dishId=" + id) + .then((response) => { + dispatch(setDish(response.data)); + }) + .catch((err) => { + dispatch(notification("Nie udało się pobrać :(", "error")); + dispatch(push("/")); + }); + }; +}; + export const refreshUserData = (token) => { return function (dispatch) { axios({ diff --git a/src/components/Dialogs/Dish.js b/src/components/Dialogs/Dish.js new file mode 100644 index 0000000..e91d594 --- /dev/null +++ b/src/components/Dialogs/Dish.js @@ -0,0 +1,105 @@ +import React, { useState, useEffect } from "react"; +import PictogramsSeparate from "../Output/PictogramsSeparate"; +import axios from "axios"; +import { useParams, useHistory } from "react-router-dom"; +import { extractTags } from "../../Services"; +import { backend } from "../../config.js"; +import IconButton from "@material-ui/core/IconButton"; +import ArrowBackIcon from "@material-ui/icons/ArrowBack"; +import { makeStyles } from "@material-ui/core/styles"; + +const loginStyles = makeStyles((theme) => ({ + closeButton: { + color: "#868686", + position: "absolute", + right: theme.spacing(1), + top: theme.spacing(1), + }, +})); + +export default function Dish(props) { + const { id } = useParams(); + const history = useHistory(); + const initialState = {}; + const [dish, setDish] = useState(initialState); + const styles = loginStyles(); + + useEffect(() => { + axios + .get(`${backend}dish?dishId=${id}`) + .then((response) => { + setDish(response.data); + }) + .catch((err) => { + console.log(err); + }); + }, [id]); + + if (typeof dish === "undefined") { + return null; + } else { + return ( +
+
+
+
+ history.goBack()} + > + + +
+
+
+
+
+

{dish.name}

+
+
+
+
Składniki
+

{dish.ingredients}

+
+
+
+
Alergeny
+
+ +
+
+
+
+
Cena
+

{dish.price}zł

+
+
+
+
Porcja
+

{dish.weight}

+
+
+
+
Wartość energrtyczna
+

{dish.kCal}kcal

+
+
+
+
Indeks glikemiczny
+

{dish.glicemicIndex}

+
+ {dish.notes !== "" &&
} + {dish.notes !== "" && ( +
+
Uwagi
+

{dish.notes}

+
+ )} +
+
+ ); + } +} diff --git a/src/components/Dialogs/EditDish.js b/src/components/Dialogs/EditDish.js index 4f0a6ad..30f56c5 100644 --- a/src/components/Dialogs/EditDish.js +++ b/src/components/Dialogs/EditDish.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { useSelector, useDispatch } from "react-redux"; import { useParams, useHistory } from "react-router-dom"; import Divider from "@material-ui/core/Divider"; @@ -88,6 +88,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function EditDish() { + useEffect(() => { + document.title = "Menui - Edytuj danie"; + }); const styles = useStyles(); const token = useSelector((state) => state.data.userData.jwt); const { id } = useParams(); diff --git a/src/components/Dialogs/EditRestaurant.js b/src/components/Dialogs/EditRestaurant.js index 4c7cee9..a71046e 100644 --- a/src/components/Dialogs/EditRestaurant.js +++ b/src/components/Dialogs/EditRestaurant.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { useSelector, useDispatch } from "react-redux"; import { useParams, useHistory } from "react-router-dom"; import { makeStyles } from "@material-ui/core/styles"; @@ -46,6 +46,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function EditRestaurant(props) { + useEffect(() => { + document.title = "Menui - Edytuj lokal"; + }); const dispatch = useDispatch(); const classes = useStyles(); const [tab, setTab] = useState(0); diff --git a/src/components/Dialogs/ForgotPassword.js b/src/components/Dialogs/ForgotPassword.js index 3296356..ec50935 100644 --- a/src/components/Dialogs/ForgotPassword.js +++ b/src/components/Dialogs/ForgotPassword.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -17,6 +17,9 @@ import { remindPassword, notification } from "../../actions"; import { useHistory } from "react-router-dom"; export default function ForgotPassword(props) { + useEffect(() => { + document.title = "Menui - Odzyskiwanie hasła"; + }); const initialData = { email: "", emailError: false, diff --git a/src/components/Dialogs/LoginDialog.js b/src/components/Dialogs/LoginDialog.js index f983284..e35a4a9 100644 --- a/src/components/Dialogs/LoginDialog.js +++ b/src/components/Dialogs/LoginDialog.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -18,6 +18,9 @@ import { tryLogin, notification } from "../../actions"; import { useHistory } from "react-router-dom"; export default function LoginDialog(props) { + useEffect(() => { + document.title = "Menui - Logowanie"; + }); const initialData = { email: "", password: "", diff --git a/src/components/Dialogs/NewDish.js b/src/components/Dialogs/NewDish.js index c848d21..bf6a179 100644 --- a/src/components/Dialogs/NewDish.js +++ b/src/components/Dialogs/NewDish.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -94,6 +94,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function NewRestaurant() { + useEffect(() => { + document.title = "Menui - Dodaj danie"; + }); const dispatch = useDispatch(); const { restaurantID } = useParams(); const initialState = { diff --git a/src/components/Dialogs/NewRestaurant.js b/src/components/Dialogs/NewRestaurant.js index bcf0eb6..0166fe0 100644 --- a/src/components/Dialogs/NewRestaurant.js +++ b/src/components/Dialogs/NewRestaurant.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -86,6 +86,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function NewRestaurant() { + useEffect(() => { + document.title = "Menui - Dodaj lokal"; + }); const dispatch = useDispatch(); const initialState = { name: "", diff --git a/src/components/Dialogs/RegisterDialog.js b/src/components/Dialogs/RegisterDialog.js index bf344ea..e7616b9 100644 --- a/src/components/Dialogs/RegisterDialog.js +++ b/src/components/Dialogs/RegisterDialog.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -42,6 +42,9 @@ export default function RegisterDialog(props) { const [formData, setFormData] = useState(initialFormData); const dispatch = useDispatch(); const history = useHistory(); + useEffect(() => { + document.title = "Menui - Rejestracja"; + }); // STYLES diff --git a/src/components/Dialogs/ResetPassword.js b/src/components/Dialogs/ResetPassword.js index 2bef4f1..b945360 100644 --- a/src/components/Dialogs/ResetPassword.js +++ b/src/components/Dialogs/ResetPassword.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -20,6 +20,9 @@ function useQuery() { } export default function ResetPassword(props) { + useEffect(() => { + document.title = "Menui - Resetowanie hasła"; + }); const initialData = { email: "", emailError: false, diff --git a/src/components/Dialogs/Settings.js b/src/components/Dialogs/Settings.js index 8765eb4..7d76179 100644 --- a/src/components/Dialogs/Settings.js +++ b/src/components/Dialogs/Settings.js @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; import Dialog from "@material-ui/core/Dialog"; @@ -69,6 +69,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function Settings() { + useEffect(() => { + document.title = "Menui - Moje konto"; + }); const history = useHistory(); const style = useStyles(); const data = useSelector((state) => state.data.userData); diff --git a/src/components/EditRestaurant/EditRestaurantPhoto.js b/src/components/EditRestaurant/EditRestaurantPhoto.js index 70379ae..1df2b39 100644 --- a/src/components/EditRestaurant/EditRestaurantPhoto.js +++ b/src/components/EditRestaurant/EditRestaurantPhoto.js @@ -3,7 +3,7 @@ import ImageUploadWide from "../Input/ImageUploadWide"; import ButtonSecondary from "../Input/ButtonSecondary"; import ButtonPrimary from "../Input/ButtonPrimary"; import { useDispatch, useSelector } from "react-redux"; -import { notification } from "../../actions"; +import { notification, refreshUserData } from "../../actions"; import { showBackdrop, hideBackdrop } from "../../actions/toggles.js"; import axios from "axios"; import { backend } from "../../config"; @@ -60,6 +60,7 @@ export default function EditRestaurantPhoto(props) { .then((res) => { dispatch(hideBackdrop()); dispatch(notification("Zmieniono zdjęcie.", "success")); + dispatch(refreshUserData(token)); }) .catch((e) => { dispatch(hideBackdrop()); diff --git a/src/components/Input/SearchPanel.js b/src/components/Input/SearchPanel.js index 2fed447..2838bce 100644 --- a/src/components/Input/SearchPanel.js +++ b/src/components/Input/SearchPanel.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect } from "react"; import { makeStyles } from "@material-ui/core/styles"; import ButtonSecondary from "./ButtonSecondary"; import TextField from "@material-ui/core/TextField"; @@ -28,6 +28,16 @@ export default function SearchPanel() { const dispatch = useDispatch(); const classes = useStyles(); + useEffect(() => { + document.title = "Menui - Food Guide"; + }); + + const keyDown = (event) => { + if (event.keyCode === 13) { + dispatch(fetchSearch(searchQuery)); + } + }; + return (
dispatch(setSearchQuery(event.target.value))} onInput={(event) => dispatch(fetchAutocomplete(event.target.value))} /> diff --git a/src/components/Output/Contact.js b/src/components/Output/Contact.js index 9478fd4..93fa475 100644 --- a/src/components/Output/Contact.js +++ b/src/components/Output/Contact.js @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect } from "react"; import Paper from "@material-ui/core/Paper"; import List from "@material-ui/core/List"; import ListItem from "@material-ui/core/ListItem"; @@ -21,6 +21,9 @@ const useStyles = makeStyles((theme) => ({ })); export default function Contact() { + useEffect(() => { + document.title = "Menui - Kontakt"; + }); const style = useStyles(); return ( diff --git a/src/components/Output/DishList.js b/src/components/Output/DishList.js index cc66595..2970a0a 100644 --- a/src/components/Output/DishList.js +++ b/src/components/Output/DishList.js @@ -8,6 +8,8 @@ function extractCategories(dishes) { if (typeof dishes !== "undefined" && dishes.length > 0) { dishes.map((dish) => categories.add(dish.category)); return Array.from(categories); + } else { + return []; } } @@ -36,5 +38,10 @@ export default function DishList(props) { ); }); - return
{categories}
; + return ( +
+ {categories} + {categoriesArray.length === 0 &&

Menu jest puste :(

} +
+ ); } diff --git a/src/components/Output/LunchMenu.js b/src/components/Output/LunchMenu.js index 1635edb..7b58fb3 100644 --- a/src/components/Output/LunchMenu.js +++ b/src/components/Output/LunchMenu.js @@ -8,13 +8,17 @@ export default function LunchMenu(props) { const lunchMenu = restaurant.lunchMenu; function filterDishes(dishes, set) { var result = []; - dishes.map((dish) => { - if (set.lunchSetDishes.includes(dish._id)) { - result.push(dish); - } - return true; - }); - return result; + if (dishes.length !== 0) { + dishes.map((dish) => { + if (set.lunchSetDishes.includes(dish._id)) { + result.push(dish); + } + return true; + }); + return result; + } else { + return []; + } } const sets = lunchMenu.map((set) => { return ( @@ -28,5 +32,5 @@ export default function LunchMenu(props) { ); }); - return
{sets}
; + return
{sets && sets}
; } diff --git a/src/components/Output/Pictograms.js b/src/components/Output/Pictograms.js index 2ad237a..6378ada 100644 --- a/src/components/Output/Pictograms.js +++ b/src/components/Output/Pictograms.js @@ -19,13 +19,8 @@ import vegetarian from "../../public/i_vegetarian.svg"; export default function (props) { const pictograms = props.pictograms.map((pictogram, index) => ( - - {pictogram} + + {pictogram} )); diff --git a/src/components/Output/Restaurant.js b/src/components/Output/Restaurant.js index f676417..655a776 100644 --- a/src/components/Output/Restaurant.js +++ b/src/components/Output/Restaurant.js @@ -73,11 +73,11 @@ export default function Restaurant(props) { {restaurant.lunchHours && (

Lunch menu ({restaurant.lunchHours})

)} - {showDishList === false && } - {showDishList === true && } + {!showDishList && } + {showDishList && }

Menu

- {showDishList === false && } - {showDishList === true && } + {!showDishList && } + {showDishList && }
diff --git a/src/reducers/dishes.js b/src/reducers/dishes.js index c04e87d..e28c2bb 100644 --- a/src/reducers/dishes.js +++ b/src/reducers/dishes.js @@ -2,6 +2,8 @@ const dishes = (state = [], action) => { switch (action.type) { case "SET_DISHES": return (state = action.payload); + case "SET_DISH": + return [action.payload]; case "ADD_DISH": return [...state, action.payload]; case "CLEAR_DISHES": diff --git a/src/styles/Dish.scss b/src/styles/Dish.scss new file mode 100644 index 0000000..a7cc91a --- /dev/null +++ b/src/styles/Dish.scss @@ -0,0 +1,78 @@ +.dish-container { + min-width: 70%; + min-height: 600px; + max-height: 80vh; + max-width: 80%; + background-color: #1f1f1f; + border-radius: 15px; + display: grid; + grid-template-columns: 1fr 1fr; + hr { + border: solid 1px $dark-gray; + border-bottom: none; + } +} + +.dish-left { + width: 100%; + height: 100%; +} + +.dish-hero { + width: 100%; + height: 100%; + border-top-left-radius: 15px; + border-bottom-left-radius: 15px; + background-size: cover; + text-align: left; +} + +.button-container { + position: relative; + top: 18px; + left: 18px; + background-color: #d68000; + width: fit-content; + border-radius: 30px; +} + +.dish-info { + h1 { + font-weight: 200; + color: $gray; + } +} + +.dish-content { + h5 { + font-size: 1rem; + font-weight: 300; + margin: 0 8px 0 auto; + } + p { + color: $gray; + margin: 0 auto 0 0; + font-weight: 500; + } +} + +.dish-pictograms { + width: fit-content; + margin: auto; +} + +.dish-row { + margin-top: 18px; + margin-bottom: 18px; + display: flex; + justify-content: center; + align-items: center; +} + +.dish-row-column { + margin-top: 18px; + margin-bottom: 18px; + h5 { + margin-bottom: 8px; + } +}