From 49e83d7b0140b1a2034ac06d7805eaecfe1162ed Mon Sep 17 00:00:00 2001 From: SohelRaja Date: Sat, 25 Apr 2020 11:04:31 +0530 Subject: [PATCH] fetched from server --- json-server/db-1587790522563.json | 268 ++++++++++++++++++ json-server/db.json | 268 ++++++++++++++++++ .../public}/images/alberto.png | Bin .../public}/images/buffet.png | Bin .../public}/images/elaicheesecake.png | Bin json-server/public/images/logo.png | Bin 0 -> 21492 bytes .../public}/images/uthappizza.png | Bin .../public}/images/vadonut.png | Bin .../public}/images/zucchipakoda.png | Bin package-lock.json | 21 ++ package.json | 1 + src/components/DishdetailComponent.js | 3 +- src/components/HomeComponent.js | 5 +- src/components/MainComponent.js | 16 +- src/components/MenuComponent.js | 3 +- src/redux/ActionCreators.js | 46 ++- src/redux/ActionTypes.js | 9 +- src/redux/comments.js | 28 +- src/redux/promotions.js | 15 +- src/shared/baseUrl.js | 1 + 20 files changed, 657 insertions(+), 27 deletions(-) create mode 100644 json-server/db-1587790522563.json create mode 100644 json-server/db.json rename {public/assets => json-server/public}/images/alberto.png (100%) rename {public/assets => json-server/public}/images/buffet.png (100%) rename {public/assets => json-server/public}/images/elaicheesecake.png (100%) create mode 100644 json-server/public/images/logo.png rename {public/assets => json-server/public}/images/uthappizza.png (100%) rename {public/assets => json-server/public}/images/vadonut.png (100%) rename {public/assets => json-server/public}/images/zucchipakoda.png (100%) create mode 100644 src/shared/baseUrl.js diff --git a/json-server/db-1587790522563.json b/json-server/db-1587790522563.json new file mode 100644 index 0000000..4ff6aec --- /dev/null +++ b/json-server/db-1587790522563.json @@ -0,0 +1,268 @@ +{ + "dishes": [ + { + "id": 0, + "name": "Uthappizza", + "image": "images/uthappizza.png", + "category": "mains", + "label": "Hot", + "price": "4.99", + "featured": true, + "description": "A unique combination of Indian Uthappam (pancake) and Italian pizza, topped with Cerignola olives, ripe vine cherry tomatoes, Vidalia onion, Guntur chillies and Buffalo Paneer." + }, + { + "id": 1, + "name": "Zucchipakoda", + "image": "images/zucchipakoda.png", + "category": "appetizer", + "label": "", + "price": "1.99", + "featured": false, + "description": "Deep fried Zucchini coated with mildly spiced Chickpea flour batter accompanied with a sweet-tangy tamarind sauce" + }, + { + "id": 2, + "name": "Vadonut", + "image": "images/vadonut.png", + "category": "appetizer", + "label": "New", + "price": "1.99", + "featured": false, + "description": "A quintessential ConFusion experience, is it a vada or is it a donut?" + }, + { + "id": 3, + "name": "ElaiCheese Cake", + "image": "images/elaicheesecake.png", + "category": "dessert", + "label": "", + "price": "2.99", + "featured": false, + "description": "A delectable, semi-sweet New York Style Cheese Cake, with Graham cracker crust and spiced with Indian cardamoms" + } + ], + "comments": [ + { + "id": 0, + "dishId": 0, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 1, + "dishId": 0, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 2, + "dishId": 0, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 3, + "dishId": 0, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 4, + "dishId": 0, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 5, + "dishId": 1, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 6, + "dishId": 1, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 7, + "dishId": 1, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 8, + "dishId": 1, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 9, + "dishId": 1, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 10, + "dishId": 2, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 11, + "dishId": 2, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 12, + "dishId": 2, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 13, + "dishId": 2, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 14, + "dishId": 2, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 15, + "dishId": 3, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 16, + "dishId": 3, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 17, + "dishId": 3, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 18, + "dishId": 3, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 19, + "dishId": 3, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + } + ], + "promotions": [ + { + "id": 0, + "name": "Weekend Grand Buffet", + "image": "images/buffet.png", + "label": "New", + "price": "19.99", + "featured": true, + "description": "Featuring mouthwatering combinations with a choice of five different salads, six enticing appetizers, six main entrees and five choicest desserts. Free flowing bubbly and soft drinks. All for just $19.99 per person " + } + ], + "leaders": [ + { + "id": 0, + "name": "Peter Pan", + "image": "images/alberto.png", + "designation": "Chief Epicurious Officer", + "abbr": "CEO", + "featured": false, + "description": "Our CEO, Peter, credits his hardworking East Asian immigrant parents who undertook the arduous journey to the shores of America with the intention of giving their children the best future. His mother's wizardy in the kitchen whipping up the tastiest dishes with whatever is available inexpensively at the supermarket, was his first inspiration to create the fusion cuisines for which The Frying Pan became well known. He brings his zeal for fusion cuisines to this restaurant, pioneering cross-cultural culinary connections." + }, + { + "id": 1, + "name": "Dhanasekaran Witherspoon", + "image": "images/alberto.png", + "designation": "Chief Food Officer", + "abbr": "CFO", + "featured": false, + "description": "Our CFO, Danny, as he is affectionately referred to by his colleagues, comes from a long established family tradition in farming and produce. His experiences growing up on a farm in the Australian outback gave him great appreciation for varieties of food sources. As he puts it in his own words, Everything that runs, wins, and everything that stays, pays!" + }, + { + "id": 2, + "name": "Agumbe Tang", + "image": "images/alberto.png", + "designation": "Chief Taste Officer", + "abbr": "CTO", + "featured": false, + "description": "Blessed with the most discerning gustatory sense, Agumbe, our CFO, personally ensures that every dish that we serve meets his exacting tastes. Our chefs dread the tongue lashing that ensues if their dish does not meet his exacting standards. He lives by his motto, You click only if you survive my lick." + }, + { + "id": 3, + "name": "Alberto Somayya", + "image": "images/alberto.png", + "designation": "Executive Chef", + "abbr": "EC", + "featured": true, + "description": "Award winning three-star Michelin chef with wide International experience having worked closely with whos-who in the culinary world, he specializes in creating mouthwatering Indo-Italian fusion experiences. He says, Put together the cuisines from the two craziest cultures, and you get a winning hit! Amma Mia!" + } + ], + "feedback": [ + { + "firstname": "fdas", + "lastname": "afds", + "telnum": "134113", + "email": "dafdads@daffas.dfdafd", + "agree": true, + "contactType": "Email", + "message": "afadsfds", + "date": "2017-12-04T09:41:49.890Z", + "id": 1 + } + ] +} \ No newline at end of file diff --git a/json-server/db.json b/json-server/db.json new file mode 100644 index 0000000..2d2ed39 --- /dev/null +++ b/json-server/db.json @@ -0,0 +1,268 @@ +{ + "dishes": [ + { + "id": 0, + "name": "Uthappizza", + "image": "images/uthappizza.png", + "category": "mains", + "label": "Hot", + "price": "4.99", + "featured": true, + "description": "A unique combination of Indian Uthappam (pancake) and Italian pizza, topped with Cerignola olives, ripe vine cherry tomatoes, Vidalia onion, Guntur chillies and Buffalo Paneer." + }, + { + "id": 1, + "name": "Zucchipakoda", + "image": "images/zucchipakoda.png", + "category": "appetizer", + "label": "", + "price": "1.99", + "featured": false, + "description": "Deep fried Zucchini coated with mildly spiced Chickpea flour batter accompanied with a sweet-tangy tamarind sauce" + }, + { + "id": 2, + "name": "Vadonut", + "image": "images/vadonut.png", + "category": "appetizer", + "label": "New", + "price": "1.99", + "featured": false, + "description": "A quintessential ConFusion experience, is it a vada or is it a donut?" + }, + { + "id": 3, + "name": "ElaiCheese Cake", + "image": "images/elaicheesecake.png", + "category": "dessert", + "label": "", + "price": "2.99", + "featured": false, + "description": "A delectable, semi-sweet New York Style Cheese Cake, with Graham cracker crust and spiced with Indian cardamoms" + } + ], + "comments": [ + { + "id": 0, + "dishId": 0, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 1, + "dishId": 0, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 2, + "dishId": 0, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 3, + "dishId": 0, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 4, + "dishId": 0, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 5, + "dishId": 1, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 6, + "dishId": 1, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 7, + "dishId": 1, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 8, + "dishId": 1, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 9, + "dishId": 1, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 10, + "dishId": 2, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 11, + "dishId": 2, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 12, + "dishId": 2, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 13, + "dishId": 2, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 14, + "dishId": 2, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + }, + { + "id": 15, + "dishId": 3, + "rating": 5, + "comment": "Imagine all the eatables, living in conFusion!", + "author": "John Lemon", + "date": "2012-10-16T17:57:28.556094Z" + }, + { + "id": 16, + "dishId": 3, + "rating": 4, + "comment": "Sends anyone to heaven, I wish I could get my mother-in-law to eat it!", + "author": "Paul McVites", + "date": "2014-09-05T17:57:28.556094Z" + }, + { + "id": 17, + "dishId": 3, + "rating": 3, + "comment": "Eat it, just eat it!", + "author": "Michael Jaikishan", + "date": "2015-02-13T17:57:28.556094Z" + }, + { + "id": 18, + "dishId": 3, + "rating": 4, + "comment": "Ultimate, Reaching for the stars!", + "author": "Ringo Starry", + "date": "2013-12-02T17:57:28.556094Z" + }, + { + "id": 19, + "dishId": 3, + "rating": 2, + "comment": "It's your birthday, we're gonna party!", + "author": "25 Cent", + "date": "2011-12-02T17:57:28.556094Z" + } + ], + "promotions": [ + { + "id": 0, + "name": "Weekend Grand Buffet", + "image": "images/buffet.png", + "label": "New", + "price": "19.99", + "featured": true, + "description": "Featuring mouthwatering combinations with a choice of five different salads, six enticing appetizers, six main entrees and five choicest desserts. Free flowing bubbly and soft drinks. All for just $19.99 per person " + } + ], + "leaders": [ + { + "id": 0, + "name": "Peter Pan", + "image": "images/alberto.png", + "designation": "Chief Epicurious Officer", + "abbr": "CEO", + "featured": false, + "description": "Our CEO, Peter, credits his hardworking East Asian immigrant parents who undertook the arduous journey to the shores of America with the intention of giving their children the best future. His mother's wizardy in the kitchen whipping up the tastiest dishes with whatever is available inexpensively at the supermarket, was his first inspiration to create the fusion cuisines for which The Frying Pan became well known. He brings his zeal for fusion cuisines to this restaurant, pioneering cross-cultural culinary connections." + }, + { + "id": 1, + "name": "Dhanasekaran Witherspoon", + "image": "images/alberto.png", + "designation": "Chief Food Officer", + "abbr": "CFO", + "featured": false, + "description": "Our CFO, Danny, as he is affectionately referred to by his colleagues, comes from a long established family tradition in farming and produce. His experiences growing up on a farm in the Australian outback gave him great appreciation for varieties of food sources. As he puts it in his own words, Everything that runs, wins, and everything that stays, pays!" + }, + { + "id": 2, + "name": "Agumbe Tang", + "image": "images/alberto.png", + "designation": "Chief Taste Officer", + "abbr": "CTO", + "featured": false, + "description": "Blessed with the most discerning gustatory sense, Agumbe, our CFO, personally ensures that every dish that we serve meets his exacting tastes. Our chefs dread the tongue lashing that ensues if their dish does not meet his exacting standards. He lives by his motto, You click only if you survive my lick." + }, + { + "id": 3, + "name": "Alberto Somayya", + "image": "images/alberto.png", + "designation": "Executive Chef", + "abbr": "EC", + "featured": true, + "description": "Award winning three-star Michelin chef with wide International experience having worked closely with whos-who in the culinary world, he specializes in creating mouthwatering Indo-Italian fusion experiences. He says, Put together the cuisines from the two craziest cultures, and you get a winning hit! Amma Mia!" + } + ], + "feedback": [ + { + "firstname": "fdas", + "lastname": "afds", + "telnum": "134113", + "email": "dafdads@daffas.dfdafd", + "agree": true, + "contactType": "Email", + "message": "afadsfds", + "date": "2017-12-04T09:41:49.890Z", + "id": 1 + } + ] + } \ No newline at end of file diff --git a/public/assets/images/alberto.png b/json-server/public/images/alberto.png similarity index 100% rename from public/assets/images/alberto.png rename to json-server/public/images/alberto.png diff --git a/public/assets/images/buffet.png b/json-server/public/images/buffet.png similarity index 100% rename from public/assets/images/buffet.png rename to json-server/public/images/buffet.png diff --git a/public/assets/images/elaicheesecake.png b/json-server/public/images/elaicheesecake.png similarity index 100% rename from public/assets/images/elaicheesecake.png rename to json-server/public/images/elaicheesecake.png diff --git a/json-server/public/images/logo.png b/json-server/public/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..fee0a33c06a6981d918a0eb71a192d2583a411f1 GIT binary patch literal 21492 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 literal 0 HcmV?d00001 diff --git a/public/assets/images/uthappizza.png b/json-server/public/images/uthappizza.png similarity index 100% rename from public/assets/images/uthappizza.png rename to json-server/public/images/uthappizza.png diff --git a/public/assets/images/vadonut.png b/json-server/public/images/vadonut.png similarity index 100% rename from public/assets/images/vadonut.png rename to json-server/public/images/vadonut.png diff --git a/public/assets/images/zucchipakoda.png b/json-server/public/images/zucchipakoda.png similarity index 100% rename from public/assets/images/zucchipakoda.png rename to json-server/public/images/zucchipakoda.png diff --git a/package-lock.json b/package-lock.json index 1c288ef..f94e03a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3810,6 +3810,22 @@ "sha.js": "^2.4.8" } }, + "cross-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.1.0.tgz", + "integrity": "sha512-FTIt2WK44RiafWQ62xIvd+oBoVd392abh1lF872trLlA74JCR1s4oTHlixwoIKy44ehn8WbQ0Ds2P16sw7ZQxg==", + "requires": { + "node-fetch": "2.1.1", + "whatwg-fetch": "2.0.3" + }, + "dependencies": { + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=" + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -8803,6 +8819,11 @@ "tslib": "^1.10.0" } }, + "node-fetch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.1.tgz", + "integrity": "sha1-NpynC4L1DIZJYQSmx3bSdPTkotQ=" + }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", diff --git a/package.json b/package.json index 2f8b171..3c0a7b3 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "@testing-library/user-event": "^7.2.1", "bootstrap": "^4.0.0", "bootstrap-social": "^5.1.1", + "cross-fetch": "^2.1.0", "font-awesome": "^4.7.0", "prismic-reactjs": "^1.3.0", "react": "^16.13.1", diff --git a/src/components/DishdetailComponent.js b/src/components/DishdetailComponent.js index 5287000..9706009 100644 --- a/src/components/DishdetailComponent.js +++ b/src/components/DishdetailComponent.js @@ -5,6 +5,7 @@ import {Date} from 'prismic-reactjs'; import {Link} from 'react-router-dom'; import { Control, LocalForm, Errors } from 'react-redux-form'; import { Loading } from './LoadingComponent'; +import { baseUrl } from '../shared/baseUrl'; const required = (val) => val && val.length; const maxLength = (len) => (val) => !(val) || (val.length <= len); @@ -181,7 +182,7 @@ function RenderDish({dish,isLoading, errMess, comments, addComment}) {
- + {dish.name} {dish.description} diff --git a/src/components/HomeComponent.js b/src/components/HomeComponent.js index b465940..e679025 100644 --- a/src/components/HomeComponent.js +++ b/src/components/HomeComponent.js @@ -1,6 +1,7 @@ import React from 'react'; import { Card, CardImg, CardText, CardBody, CardTitle, CardSubtitle} from 'reactstrap'; import {Loading} from './LoadingComponent'; +import { baseUrl } from '../shared/baseUrl'; function RenderCard({item, isLoading, errMess}) { if (isLoading) { @@ -15,7 +16,7 @@ function RenderCard({item, isLoading, errMess}) { }else{ return( - + {item.name} {item.designation ? {item.designation} : null } @@ -34,7 +35,7 @@ function Home(props) {
- +
diff --git a/src/components/MainComponent.js b/src/components/MainComponent.js index 313bcf0..e7363fd 100644 --- a/src/components/MainComponent.js +++ b/src/components/MainComponent.js @@ -11,7 +11,7 @@ import Footer from './FooterComponent'; import About from './AboutComponent'; import Contact from './ContactComponent'; import DishDetail from './DishdetailComponent'; -import { addComment, fetchDishes } from '../redux/ActionCreators'; +import { addComment, fetchDishes, fetchComments, fetchPromos } from '../redux/ActionCreators'; const mapStateToProps = state => { @@ -27,8 +27,9 @@ const mapDispatchToProps = dispatch => ({ addComment: (dishId, rating, author, comment) => dispatch(addComment(dishId, rating, author, comment)), fetchDishes: () => {dispatch(fetchDishes())}, - resetFeedbackForm: () => { dispatch(actions.reset('feedback'))} - + resetFeedbackForm: () => { dispatch(actions.reset('feedback'))}, + fetchComments: () => dispatch(fetchComments()), + fetchPromos: () => dispatch(fetchPromos()) }); class Main extends Component{ @@ -39,6 +40,8 @@ class Main extends Component{ //Life cycle method componentDidMount(){ this.props.fetchDishes(); + this.props.fetchComments(); + this.props.fetchPromos(); } onDishSelect(dishID) { @@ -51,7 +54,9 @@ class Main extends Component{ dish={this.props.dishes.dishes.filter((dish) => dish.featured)[0]} dishesLoading={this.props.dishes.isLoading} dishesErrMess={this.props.dishes.errMess} - promotion={this.props.promotions.filter((promo) => promo.featured)[0]} + promotion={this.props.promotions.promotions.filter((promo) => promo.featured)[0]} + promoLoading={this.props.promotions.isLoading} + promoErrMess={this.props.promotions.errMess} leader={this.props.leaders.filter((leader) => leader.featured)[0]} /> ); @@ -62,7 +67,8 @@ class Main extends Component{ dish={this.props.dishes.dishes.filter((dish) => dish.id === parseInt(match.params.dishId,10))[0]} isLoading={this.props.dishes.isLoading} errMess={this.props.dishes.errMess} - comments={this.props.comments.filter((comment) => comment.dishId === parseInt(match.params.dishId,10))} + comments={this.props.comments.comments.filter((comment) => comment.dishId === parseInt(match.params.dishId,10))} + commentsErrMess={this.props.comments.errMess} addComment={this.props.addComment} /> ); diff --git a/src/components/MenuComponent.js b/src/components/MenuComponent.js index d3aea7d..735f31d 100644 --- a/src/components/MenuComponent.js +++ b/src/components/MenuComponent.js @@ -2,6 +2,7 @@ import React from 'react'; import { Card, CardImg, CardImgOverlay, CardTitle, Breadcrumb, BreadcrumbItem } from 'reactstrap'; import { Link } from 'react-router-dom'; import {Loading} from './LoadingComponent'; +import { baseUrl } from '../shared/baseUrl'; //functional component---> ////when we are just rendering the props instead of storing the states, we required the function component @@ -9,7 +10,7 @@ function RenderMenuItem({dish}){ return( - + {dish.name} diff --git a/src/redux/ActionCreators.js b/src/redux/ActionCreators.js index f804177..1aeb00a 100644 --- a/src/redux/ActionCreators.js +++ b/src/redux/ActionCreators.js @@ -1,5 +1,6 @@ import * as ActionTypes from './ActionTypes'; import { DISHES } from './../shared/dishes'; +import { baseUrl } from '../shared/baseUrl'; export const addComment = (dishId, rating, author, comment) => ({ type: ActionTypes.ADD_COMMENT, @@ -15,9 +16,9 @@ export const fetchDishes = () => (dispatch) => { dispatch(dishesLoading(true)); - setTimeout(() => { - dispatch(addDishes(DISHES)); - }, 2000); + return fetch(baseUrl + 'dishes') + .then(response => response.json()) + .then(dishes => dispatch(addDishes(dishes))); } export const dishesLoading = () => ({ @@ -32,4 +33,43 @@ export const dishesFailed = (errmess) => ({ export const addDishes = (dishes) => ({ type: ActionTypes.ADD_DISHES, payload: dishes +}); + +export const fetchComments = () => (dispatch) => { + return fetch(baseUrl + 'comments') + .then(response => response.json()) + .then(comments => dispatch(addComments(comments))); +}; + +export const commentsFailed = (errmess) => ({ + type: ActionTypes.COMMENTS_FAILED, + payload: errmess +}); + +export const addComments = (comments) => ({ + type: ActionTypes.ADD_COMMENTS, + payload: comments +}); + +export const fetchPromos = () => (dispatch) => { + + dispatch(promosLoading()); + + return fetch(baseUrl + 'promotions') + .then(response => response.json()) + .then(promos => dispatch(addPromos(promos))); +} + +export const promosLoading = () => ({ + type: ActionTypes.PROMOS_LOADING +}); + +export const promosFailed = (errmess) => ({ + type: ActionTypes.PROMOS_FAILED, + payload: errmess +}); + +export const addPromos = (promos) => ({ + type: ActionTypes.ADD_PROMOS, + payload: promos }); \ No newline at end of file diff --git a/src/redux/ActionTypes.js b/src/redux/ActionTypes.js index 7b5e778..9960c83 100644 --- a/src/redux/ActionTypes.js +++ b/src/redux/ActionTypes.js @@ -1,4 +1,11 @@ export const ADD_COMMENT = 'ADD_COMMENT'; export const DISHES_LOADING = 'DISHES_LOADING'; export const DISHES_FAILED = 'DISHES_FAILED'; -export const ADD_DISHES = 'ADD_DISHES'; \ No newline at end of file +export const ADD_DISHES = 'ADD_DISHES'; + +export const ADD_COMMENTS = 'ADD_COMMENTS'; +export const COMMENTS_FAILED = 'COMMENTS_FAILED'; + +export const PROMOS_LOADING = 'PROMOS_LOADING'; +export const ADD_PROMOS = 'ADD_PROMOS'; +export const PROMOS_FAILED = 'PROMOS_FAILED'; \ No newline at end of file diff --git a/src/redux/comments.js b/src/redux/comments.js index 8cb8547..1712808 100644 --- a/src/redux/comments.js +++ b/src/redux/comments.js @@ -1,16 +1,20 @@ -import { COMMENTS } from '../shared/comments'; import * as ActionTypes from './ActionTypes'; -export const Comments = (state = COMMENTS, action) => { - switch (action.type) { - case ActionTypes.ADD_COMMENT: - var comment = action.payload; - comment.id = state.length; - comment.date = new Date(); - console.log("Comment: ", comment); - return state.concat(comment); +export const Comments = (state = { errMess: null, comments:[]}, action) => { + switch (action.type) { + case ActionTypes.ADD_COMMENTS: + return {...state, errMess: null, comments: action.payload}; - default: - return state; - } + case ActionTypes.COMMENTS_FAILED: + return {...state, errMess: action.payload}; + + case ActionTypes.ADD_COMMENT: + var comment = action.payload; + comment.id = state.comments.length; + comment.date = new Date(); + return { ...state, comments: state.comments.concat(comment)}; + + default: + return state; + } }; \ No newline at end of file diff --git a/src/redux/promotions.js b/src/redux/promotions.js index 44efc6c..2f1a24a 100644 --- a/src/redux/promotions.js +++ b/src/redux/promotions.js @@ -1,7 +1,18 @@ -import { PROMOTIONS } from '../shared/promotions'; +import * as ActionTypes from './ActionTypes'; -export const Promotions = (state = PROMOTIONS, action) => { +export const Promotions = (state = { isLoading: true, + errMess: null, + promotions:[]}, action) => { switch (action.type) { + case ActionTypes.ADD_PROMOS: + return {...state, isLoading: false, errMess: null, promotions: action.payload}; + + case ActionTypes.PROMOS_LOADING: + return {...state, isLoading: true, errMess: null, promotions: []} + + case ActionTypes.PROMOS_FAILED: + return {...state, isLoading: false, errMess: action.payload}; + default: return state; } diff --git a/src/shared/baseUrl.js b/src/shared/baseUrl.js new file mode 100644 index 0000000..a58bcbc --- /dev/null +++ b/src/shared/baseUrl.js @@ -0,0 +1 @@ +export const baseUrl = 'http://localhost:3001/'; \ No newline at end of file