Showing
9 changed files
with
123 additions
and
18 deletions
This diff is collapsed. Click to expand it.
| ... | @@ -14,6 +14,7 @@ | ... | @@ -14,6 +14,7 @@ |
| 14 | "axios": "^0.19.2", | 14 | "axios": "^0.19.2", |
| 15 | "bootstrap": "^4.5.0", | 15 | "bootstrap": "^4.5.0", |
| 16 | "http-proxy-middleware": "^1.0.4", | 16 | "http-proxy-middleware": "^1.0.4", |
| 17 | + "mdbreact": "^4.27.0", | ||
| 17 | "react": "^16.13.1", | 18 | "react": "^16.13.1", |
| 18 | "react-app-polyfill": "^1.0.6", | 19 | "react-app-polyfill": "^1.0.6", |
| 19 | "react-cookies": "^0.1.1", | 20 | "react-cookies": "^0.1.1", | ... | ... |
| ... | @@ -28,6 +28,7 @@ height: 100%; | ... | @@ -28,6 +28,7 @@ height: 100%; |
| 28 | Learn how to configure a non-root public URL by running `npm run build`. | 28 | Learn how to configure a non-root public URL by running `npm run build`. |
| 29 | --> | 29 | --> |
| 30 | <title>MEALKHU</title> | 30 | <title>MEALKHU</title> |
| 31 | + | ||
| 31 | <link href="https://fonts.googleapis.com/css?family=Do+Hyeon:400" rel="stylesheet"> | 32 | <link href="https://fonts.googleapis.com/css?family=Do+Hyeon:400" rel="stylesheet"> |
| 32 | <style> | 33 | <style> |
| 33 | #root, .modalClass{font-family: 'Do Hyeon', sans-serif;} | 34 | #root, .modalClass{font-family: 'Do Hyeon', sans-serif;} | ... | ... |
| 1 | /*global kakao*/ | 1 | /*global kakao*/ |
| 2 | -import React, { useEffect, useState } from "react"; | 2 | +import React, { useEffect, useState, Fragment } from "react"; |
| 3 | import { Input, Button, ButtonGroup } from "reactstrap"; | 3 | import { Input, Button, ButtonGroup } from "reactstrap"; |
| 4 | import { Label, CustomInput, Row, Col, FormGroup } from "reactstrap"; | 4 | import { Label, CustomInput, Row, Col, FormGroup } from "reactstrap"; |
| 5 | import appKey from "../config/appKey.json"; | 5 | import appKey from "../config/appKey.json"; |
| ... | @@ -122,7 +122,7 @@ const LandingMap = (props) => { | ... | @@ -122,7 +122,7 @@ const LandingMap = (props) => { |
| 122 | 122 | ||
| 123 | return ( | 123 | return ( |
| 124 | <> | 124 | <> |
| 125 | - | 125 | + <hr className="my-2" /> |
| 126 | <Row> | 126 | <Row> |
| 127 | <Col> | 127 | <Col> |
| 128 | <span className="font-weight-bold">MEALKHU MAP</span> | 128 | <span className="font-weight-bold">MEALKHU MAP</span> | ... | ... |
| ... | @@ -7,7 +7,7 @@ const Loading = (props) => { | ... | @@ -7,7 +7,7 @@ const Loading = (props) => { |
| 7 | 'display':'flex', 'width':'100%', "height":'85%', 'textAlign':'center', 'alignItems':'center' | 7 | 'display':'flex', 'width':'100%', "height":'85%', 'textAlign':'center', 'alignItems':'center' |
| 8 | }}><span style={{ | 8 | }}><span style={{ |
| 9 | 'margin': '0 auto' | 9 | 'margin': '0 auto' |
| 10 | - }}><Spinner color="danger" style={{ width: '2rem', height: '2rem', marginRight:'1rem' }}/><h1 style={{'display':'inline'}}>Loading..</h1></span></span> | 10 | +}}><Spinner color="danger" style={{ width: '2rem', height: '2rem', marginRight:'1rem' }}/><h1 style={{'display':'inline'}}>{props.value}</h1></span></span> |
| 11 | ); | 11 | ); |
| 12 | } | 12 | } |
| 13 | 13 | ... | ... |
| ... | @@ -5,6 +5,9 @@ import * as serviceWorker from './serviceWorker'; | ... | @@ -5,6 +5,9 @@ import * as serviceWorker from './serviceWorker'; |
| 5 | import 'bootstrap/dist/css/bootstrap.min.css'; | 5 | import 'bootstrap/dist/css/bootstrap.min.css'; |
| 6 | import 'react-app-polyfill/ie11'; | 6 | import 'react-app-polyfill/ie11'; |
| 7 | 7 | ||
| 8 | +// import '@fortawesome/fontawesome-free/css/all.min.css'; | ||
| 9 | +// import 'bootstrap-css-only/css/bootstrap.min.css'; | ||
| 10 | +// import 'mdbreact/dist/css/mdb.css'; | ||
| 8 | 11 | ||
| 9 | ReactDOM.render( | 12 | ReactDOM.render( |
| 10 | <React.StrictMode> | 13 | <React.StrictMode> | ... | ... |
| ... | @@ -8,7 +8,7 @@ const AboutPage = (props) => { | ... | @@ -8,7 +8,7 @@ const AboutPage = (props) => { |
| 8 | <> | 8 | <> |
| 9 | <NavBar/> | 9 | <NavBar/> |
| 10 | <div style={{'display':'flex', 'width':'100%', "height":'100%', 'textAlign':'center', 'alignItems':'center'}}> | 10 | <div style={{'display':'flex', 'width':'100%', "height":'100%', 'textAlign':'center', 'alignItems':'center'}}> |
| 11 | - <Container style={{}}> | 11 | + <Container> |
| 12 | <Jumbotron | 12 | <Jumbotron |
| 13 | style={{'backgroundColor':'#fff'}} | 13 | style={{'backgroundColor':'#fff'}} |
| 14 | > | 14 | > | ... | ... |
| 1 | -import React, { useState, useEffect } from 'react'; | 1 | +import React, { useState, useEffect, Fragment } from 'react'; |
| 2 | import NavBar from '../components/NavBar'; | 2 | import NavBar from '../components/NavBar'; |
| 3 | import LandingMap from '../components/LandingMap'; | 3 | import LandingMap from '../components/LandingMap'; |
| 4 | import { CustomInput } from 'reactstrap'; | 4 | import { CustomInput } from 'reactstrap'; |
| 5 | -import { Container, Row, Col } from "reactstrap"; | 5 | +import { Container, Row, Col, Button, Jumbotron } from "reactstrap"; |
| 6 | import axios from 'axios'; | 6 | import axios from 'axios'; |
| 7 | - | 7 | +import Loading from '../components/Loading'; |
| 8 | +import MealCard from '../components/MealCard'; | ||
| 8 | 9 | ||
| 9 | const LandingPage = (props) => { | 10 | const LandingPage = (props) => { |
| 10 | const [datas, setDatas] = useState([]); | 11 | const [datas, setDatas] = useState([]); |
| 11 | const [filteredDatas, setFilteredDatas] = useState([]); | 12 | const [filteredDatas, setFilteredDatas] = useState([]); |
| 13 | + const [RandomCards, setRandomCards] = useState([]); | ||
| 12 | const [isLoading, setIsLoading] = useState(false); | 14 | const [isLoading, setIsLoading] = useState(false); |
| 13 | const [all, setAll] = useState(false); | 15 | const [all, setAll] = useState(false); |
| 14 | const [Kfood, setKfood] = useState(false); | 16 | const [Kfood, setKfood] = useState(false); |
| ... | @@ -20,7 +22,7 @@ const LandingPage = (props) => { | ... | @@ -20,7 +22,7 @@ const LandingPage = (props) => { |
| 20 | const [fastfood, setFastfood] = useState(false); | 22 | const [fastfood, setFastfood] = useState(false); |
| 21 | const [cafe, setCafe] = useState(false); | 23 | const [cafe, setCafe] = useState(false); |
| 22 | const [etc, setEtc] = useState(false); | 24 | const [etc, setEtc] = useState(false); |
| 23 | - | 25 | + const [isRandom, setIsRandom] = useState(0); |
| 24 | 26 | ||
| 25 | useEffect(() => { | 27 | useEffect(() => { |
| 26 | const fetchData = async () => { | 28 | const fetchData = async () => { |
| ... | @@ -33,9 +35,7 @@ const LandingPage = (props) => { | ... | @@ -33,9 +35,7 @@ const LandingPage = (props) => { |
| 33 | }; | 35 | }; |
| 34 | fetchData(); | 36 | fetchData(); |
| 35 | }, []); | 37 | }, []); |
| 36 | - | 38 | + |
| 37 | - // filtereddatas 처리 + isloading변경 | ||
| 38 | - | ||
| 39 | useEffect(() => { | 39 | useEffect(() => { |
| 40 | setIsLoading(false); | 40 | setIsLoading(false); |
| 41 | let result = []; | 41 | let result = []; |
| ... | @@ -82,14 +82,62 @@ const LandingPage = (props) => { | ... | @@ -82,14 +82,62 @@ const LandingPage = (props) => { |
| 82 | } | 82 | } |
| 83 | }, [all]); | 83 | }, [all]); |
| 84 | 84 | ||
| 85 | + const randomHandler = () => { | ||
| 86 | + | ||
| 87 | + if(filteredDatas.length === 0) { | ||
| 88 | + alert('메뉴를 선택하세요'); | ||
| 89 | + return ; | ||
| 90 | + } | ||
| 91 | + else { | ||
| 92 | + console.log(filteredDatas); | ||
| 93 | + setIsRandom(1); | ||
| 94 | + setTimeout(()=>{ | ||
| 95 | + let x = getRandomInt(0, filteredDatas.length); | ||
| 96 | + let y = getRandomInt(0, filteredDatas.length); | ||
| 97 | + setRandomCards([filteredDatas[x], filteredDatas[y]]); | ||
| 98 | + setIsRandom(2); | ||
| 99 | + }, 2500); | ||
| 100 | + } | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + const getRandomInt = (min, max) => { | ||
| 104 | + min = Math.ceil(min); | ||
| 105 | + max = Math.floor(max); | ||
| 106 | + return Math.floor(Math.random() * (max - min)) + min; //최댓값은 제외, 최솟값은 포함 | ||
| 107 | + } | ||
| 108 | + | ||
| 85 | return ( | 109 | return ( |
| 86 | <> | 110 | <> |
| 87 | <NavBar/> | 111 | <NavBar/> |
| 88 | <Container style={{ | 112 | <Container style={{ |
| 89 | paddingTop : '1.5rem' | 113 | paddingTop : '1.5rem' |
| 90 | }}> | 114 | }}> |
| 115 | + | ||
| 116 | + <div style={{'display':'flex', 'width':'100%', "height":'100%'}}> | ||
| 117 | + <Container> | ||
| 91 | 118 | ||
| 92 | - <Row> | 119 | + <Jumbotron |
| 120 | + style={{ | ||
| 121 | + 'backgroundColor':'#fff', | ||
| 122 | + 'paddingTop': '1.5rem', | ||
| 123 | + 'boxShadow': '0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)' | ||
| 124 | + }} | ||
| 125 | + > | ||
| 126 | + <Row xs="1" sm="2" md="2"> | ||
| 127 | + <Col style={{ | ||
| 128 | + | ||
| 129 | + }}> | ||
| 130 | + <h3 className="text-center"> | ||
| 131 | + <span className="font-weight-bold">랜덤추천 : </span>메뉴를 선택하세요 | ||
| 132 | + </h3> | ||
| 133 | + <span style={{ | ||
| 134 | + 'paddingLeft' : '0.5rem' | ||
| 135 | + }}> | ||
| 136 | + {/* <Button color="warning">Random!</Button> */} | ||
| 137 | + | ||
| 138 | + </span> | ||
| 139 | + <Container> | ||
| 140 | + <Row> | ||
| 93 | <Col> | 141 | <Col> |
| 94 | <CustomInput type="switch" id="all" label="전체" | 142 | <CustomInput type="switch" id="all" label="전체" |
| 95 | checked={all} | 143 | checked={all} |
| ... | @@ -97,7 +145,7 @@ const LandingPage = (props) => { | ... | @@ -97,7 +145,7 @@ const LandingPage = (props) => { |
| 97 | /> | 145 | /> |
| 98 | </Col> | 146 | </Col> |
| 99 | </Row> | 147 | </Row> |
| 100 | - <Row xs="3" sm="3" md="5"> | 148 | + <Row xs="3" sm="3" md="4"> |
| 101 | <Col> | 149 | <Col> |
| 102 | <CustomInput type="checkbox" id="Kfood" label="한식" | 150 | <CustomInput type="checkbox" id="Kfood" label="한식" |
| 103 | checked={Kfood} | 151 | checked={Kfood} |
| ... | @@ -153,8 +201,56 @@ const LandingPage = (props) => { | ... | @@ -153,8 +201,56 @@ const LandingPage = (props) => { |
| 153 | onChange={()=>setEtc(!etc)} | 201 | onChange={()=>setEtc(!etc)} |
| 154 | /> | 202 | /> |
| 155 | </Col> | 203 | </Col> |
| 204 | + </Row> | ||
| 205 | + <div style={{ | ||
| 206 | + 'paddingTop':'1.5rem', | ||
| 207 | + 'alignItems':'center' | ||
| 208 | + ,'display':'flex', 'width':'100%', "height":'100%','textAlign':'center' | ||
| 209 | + }}> | ||
| 210 | + <Button onClick={randomHandler} size="lg" style={{ | ||
| 211 | + 'margin':'0 auto' | ||
| 212 | + }} color="danger">Random!</Button> | ||
| 213 | + </div> | ||
| 214 | + </Container> | ||
| 156 | 215 | ||
| 157 | - </Row> | 216 | + |
| 217 | + </Col> | ||
| 218 | + <Col> | ||
| 219 | + {isRandom === 0 ? ('') : ( (isRandom === 1) ? <span style={{'padding':'1.5rem'}}><Loading value="추첨중.."/></span> :( | ||
| 220 | + <Container> | ||
| 221 | + <Row> | ||
| 222 | + { | ||
| 223 | + RandomCards.map((data, index)=> ( | ||
| 224 | + <Col> | ||
| 225 | + <MealCard | ||
| 226 | + key = {index} | ||
| 227 | + id = {data.id} | ||
| 228 | + name = {data.name} | ||
| 229 | + address = {data.address} | ||
| 230 | + latitude = {data.latitude} | ||
| 231 | + longitude = {data.longitude} | ||
| 232 | + type = {data.type} | ||
| 233 | + menu = {data.menu} | ||
| 234 | + img = {data.img} | ||
| 235 | + img_source = {data.img_source} | ||
| 236 | + /> | ||
| 237 | + </Col> | ||
| 238 | + )) | ||
| 239 | + } | ||
| 240 | + | ||
| 241 | + | ||
| 242 | + </Row> | ||
| 243 | +</Container> | ||
| 244 | + ) | ||
| 245 | + | ||
| 246 | + | ||
| 247 | + )} | ||
| 248 | + </Col> | ||
| 249 | + </Row> | ||
| 250 | + </Jumbotron> | ||
| 251 | + </Container> | ||
| 252 | + </div> | ||
| 253 | + | ||
| 158 | {datas ? <LandingMap | 254 | {datas ? <LandingMap |
| 159 | datas = {datas} | 255 | datas = {datas} |
| 160 | /> : 'loading...'} | 256 | /> : 'loading...'} | ... | ... |
| ... | @@ -3,6 +3,9 @@ import NavBar from '../components/NavBar'; | ... | @@ -3,6 +3,9 @@ import NavBar from '../components/NavBar'; |
| 3 | import MealCard from '../components/MealCard'; | 3 | import MealCard from '../components/MealCard'; |
| 4 | import { CustomInput } from 'reactstrap'; | 4 | import { CustomInput } from 'reactstrap'; |
| 5 | import { Container, Row, Col } from "reactstrap"; | 5 | import { Container, Row, Col } from "reactstrap"; |
| 6 | + | ||
| 7 | +import { Card, CardText, CardBody, CardTitle, } from "reactstrap"; | ||
| 8 | + | ||
| 6 | import axios from 'axios'; | 9 | import axios from 'axios'; |
| 7 | import Loading from '../components/Loading'; | 10 | import Loading from '../components/Loading'; |
| 8 | 11 | ||
| ... | @@ -89,8 +92,8 @@ const MenuPage = (props) => { | ... | @@ -89,8 +92,8 @@ const MenuPage = (props) => { |
| 89 | <NavBar/> | 92 | <NavBar/> |
| 90 | <Container style={{ | 93 | <Container style={{ |
| 91 | paddingTop : '1.5rem' | 94 | paddingTop : '1.5rem' |
| 92 | - }}> | 95 | + }}> |
| 93 | - | 96 | + |
| 94 | <Row> | 97 | <Row> |
| 95 | <Col> | 98 | <Col> |
| 96 | <CustomInput type="switch" id="all" label="전체" | 99 | <CustomInput type="switch" id="all" label="전체" |
| ... | @@ -155,8 +158,9 @@ const MenuPage = (props) => { | ... | @@ -155,8 +158,9 @@ const MenuPage = (props) => { |
| 155 | onChange={()=>setEtc(!etc)} | 158 | onChange={()=>setEtc(!etc)} |
| 156 | /> | 159 | /> |
| 157 | </Col> | 160 | </Col> |
| 158 | - | ||
| 159 | </Row> | 161 | </Row> |
| 162 | + | ||
| 163 | + | ||
| 160 | </Container> | 164 | </Container> |
| 161 | 165 | ||
| 162 | 166 | ||
| ... | @@ -184,7 +188,7 @@ const MenuPage = (props) => { | ... | @@ -184,7 +188,7 @@ const MenuPage = (props) => { |
| 184 | } | 188 | } |
| 185 | </Row> | 189 | </Row> |
| 186 | </Container>) | 190 | </Container>) |
| 187 | - : <Loading/> | 191 | + : <Loading value="Loading.."/> |
| 188 | } | 192 | } |
| 189 | 193 | ||
| 190 | 194 | ... | ... |
-
Please register or login to post a comment