Showing
10 changed files
with
123 additions
and
20 deletions
| ... | @@ -3,6 +3,7 @@ import React, { useState, useEffect} from 'react'; | ... | @@ -3,6 +3,7 @@ import React, { useState, useEffect} from 'react'; |
| 3 | import '../style/Board.scss' | 3 | import '../style/Board.scss' |
| 4 | import ReactHtmlParser from 'react-html-parser'; | 4 | import ReactHtmlParser from 'react-html-parser'; |
| 5 | import BoardModal from "../Modal/BoardModal"; | 5 | import BoardModal from "../Modal/BoardModal"; |
| 6 | +import ContentModal from '../Modal/ContentModal'; | ||
| 6 | 7 | ||
| 7 | function Board() { | 8 | function Board() { |
| 8 | const [viewContent,setViewContent] = useState([]); | 9 | const [viewContent,setViewContent] = useState([]); |
| ... | @@ -22,9 +23,8 @@ function Board() { | ... | @@ -22,9 +23,8 @@ function Board() { |
| 22 | {viewContent&&viewContent.map(element =>{ | 23 | {viewContent&&viewContent.map(element =>{ |
| 23 | return <div className="ui segment"> | 24 | return <div className="ui segment"> |
| 24 | <h2>{element.title}</h2> | 25 | <h2>{element.title}</h2> |
| 25 | - <div> | 26 | + <h4>{element.created_at.slice(0,10)+" " +element.created_at.slice(11,16)}</h4> |
| 26 | - {ReactHtmlParser(element.post)} | 27 | + <ContentModal element={element}/> |
| 27 | - </div> | ||
| 28 | </div>} | 28 | </div>} |
| 29 | )} | 29 | )} |
| 30 | </div> | 30 | </div> | ... | ... |
| 1 | +import React, {useState, useEffect} from 'react' | ||
| 2 | +import Axios from 'axios' | ||
| 3 | +import ReactHtmlParser from 'react-html-parser'; | ||
| 4 | +import { Button, Modal, Comment, Form } from 'semantic-ui-react' | ||
| 5 | +import '../style/ContentModal.scss' | ||
| 6 | + | ||
| 7 | +function ContentModal({element}) { | ||
| 8 | + const [viewComment,setviewComment] = useState([]); | ||
| 9 | + useEffect(()=>{ | ||
| 10 | + Axios.get('/api/comment/'+element.id).then((response)=>{ | ||
| 11 | + setviewComment(response.data); | ||
| 12 | + }) | ||
| 13 | + },[viewComment]) | ||
| 14 | + | ||
| 15 | + const handleClose = (event) => { | ||
| 16 | + event.preventDefault(); | ||
| 17 | + setOpen(false); | ||
| 18 | + } | ||
| 19 | + const [open, setOpen] = useState(false) | ||
| 20 | + const [BoardComment, setBoardComment] = useState({ | ||
| 21 | + id: null, | ||
| 22 | + content:'' | ||
| 23 | + }) | ||
| 24 | + const onCommentHandler = (event) => { | ||
| 25 | + setBoardComment(event.currentTarget.value) | ||
| 26 | + console.log(BoardComment) | ||
| 27 | + } | ||
| 28 | + const onSubmitHandler = () => { | ||
| 29 | + Axios.post('/api/comment',{ | ||
| 30 | + id: element.id, | ||
| 31 | + content: BoardComment | ||
| 32 | + }) | ||
| 33 | + .then((res)=>{ | ||
| 34 | + if(res.status === 200){ | ||
| 35 | + alert("댓글 작성을 완료하였습니다.") | ||
| 36 | + } | ||
| 37 | + }).catch((error) => { | ||
| 38 | + console.log(error.response) | ||
| 39 | + alert("댓글 작성을 실패하였습니다.") | ||
| 40 | + }) | ||
| 41 | + } | ||
| 42 | + return ( | ||
| 43 | + <Modal | ||
| 44 | + onClose={() => setOpen(false)} | ||
| 45 | + onOpen={() => setOpen(true)} | ||
| 46 | + open={open} | ||
| 47 | + trigger={<Button basic color='purple' className="ui animated button" tabIndex="0"> | ||
| 48 | + <div className="visible content">보기</div> | ||
| 49 | + </Button>} | ||
| 50 | + > | ||
| 51 | + <Modal.Header><h2>{element.title}</h2></Modal.Header> | ||
| 52 | + <Modal.Content> | ||
| 53 | + <Modal.Description> | ||
| 54 | + <div className="problems"> | ||
| 55 | + {ReactHtmlParser(element.post)} | ||
| 56 | + </div> | ||
| 57 | + </Modal.Description> | ||
| 58 | + </Modal.Content> | ||
| 59 | + <Modal.Content> | ||
| 60 | + {viewComment&&viewComment.map(elem =>{ | ||
| 61 | + return <div className="ui segment"> | ||
| 62 | + <h2>{elem.title}</h2> | ||
| 63 | + <h4>{elem.created_at.slice(0,10)+" " +elem.created_at.slice(11,16)}</h4> | ||
| 64 | + </div>} | ||
| 65 | + )} | ||
| 66 | + </Modal.Content> | ||
| 67 | + <Modal.Actions> | ||
| 68 | + <Comment> | ||
| 69 | + <Form reply> | ||
| 70 | + <Form.TextArea onChange={onCommentHandler}/> | ||
| 71 | + <div onClick={handleClose}> | ||
| 72 | + <Button content='댓글 남기기' labelPosition='left' icon='edit' primary onSubmit={onSubmitHandler}/> | ||
| 73 | + <Button color='black'>닫기</Button> | ||
| 74 | + </div> | ||
| 75 | + </Form> | ||
| 76 | + </Comment> | ||
| 77 | + </Modal.Actions> | ||
| 78 | + </Modal> | ||
| 79 | + ) | ||
| 80 | +} | ||
| 81 | +export default ContentModal | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | import React, {useState, useCallback} from "react"; | 1 | import React, {useState, useCallback} from "react"; |
| 2 | import { useNavigate } from "react-router-dom"; | 2 | import { useNavigate } from "react-router-dom"; |
| 3 | import "../style/RegisterPage.scss"; | 3 | import "../style/RegisterPage.scss"; |
| 4 | -import { Button, Icon, Input } from "semantic-ui-react"; | 4 | +import { Button, Dropdown, Icon, Input} from "semantic-ui-react"; |
| 5 | import Axios from 'axios' | 5 | import Axios from 'axios' |
| 6 | function RegisterPage(props) { | 6 | function RegisterPage(props) { |
| 7 | const navigate = useNavigate(); | 7 | const navigate = useNavigate(); |
| ... | @@ -16,7 +16,7 @@ function RegisterPage(props) { | ... | @@ -16,7 +16,7 @@ function RegisterPage(props) { |
| 16 | setPassword(event.currentTarget.value); | 16 | setPassword(event.currentTarget.value); |
| 17 | }; | 17 | }; |
| 18 | const onPersonalityHandler = (event) => { | 18 | const onPersonalityHandler = (event) => { |
| 19 | - setPersonality(event.currentTarget.value); | 19 | + setPersonality(event.currentTarget.value.toUpperCase()); |
| 20 | }; | 20 | }; |
| 21 | const onPasswordChkHandler = (event) => { | 21 | const onPasswordChkHandler = (event) => { |
| 22 | //비밀번호를 입력할때마다 password 를 검증하는 함수 | 22 | //비밀번호를 입력할때마다 password 를 검증하는 함수 |
| ... | @@ -30,6 +30,11 @@ function RegisterPage(props) { | ... | @@ -30,6 +30,11 @@ function RegisterPage(props) { |
| 30 | if (Password !== PasswordCheck) { | 30 | if (Password !== PasswordCheck) { |
| 31 | return alert('비밀번호가 일치하지 않습니다.') | 31 | return alert('비밀번호가 일치하지 않습니다.') |
| 32 | } | 32 | } |
| 33 | + else if((Personality[0] !== 'I' && Personality[0] !== 'E') || (Personality[1] !== 'S' && Personality[1] !== 'N') | ||
| 34 | + || (Personality[2] !== 'F' && Personality[2] !== 'T') || (Personality[3] !== 'J' && Personality[3] !== 'P')) | ||
| 35 | + { | ||
| 36 | + return alert('올바르지 않은 MBTI입니다.') | ||
| 37 | + } | ||
| 33 | else{ | 38 | else{ |
| 34 | Axios.post('/api/register',{ | 39 | Axios.post('/api/register',{ |
| 35 | Id, | 40 | Id, |
| ... | @@ -67,6 +72,7 @@ function RegisterPage(props) { | ... | @@ -67,6 +72,7 @@ function RegisterPage(props) { |
| 67 | icon={<Icon name='heart'/>} | 72 | icon={<Icon name='heart'/>} |
| 68 | iconPosition='left' | 73 | iconPosition='left' |
| 69 | placeholder="Your MBTI" | 74 | placeholder="Your MBTI" |
| 75 | + maxlength='4' | ||
| 70 | type="text" | 76 | type="text" |
| 71 | value={Personality} | 77 | value={Personality} |
| 72 | autoComplete="off" | 78 | autoComplete="off" | ... | ... |
| ... | @@ -21,6 +21,8 @@ | ... | @@ -21,6 +21,8 @@ |
| 21 | display: flex; | 21 | display: flex; |
| 22 | flex-direction: column; | 22 | flex-direction: column; |
| 23 | align-items: center; | 23 | align-items: center; |
| 24 | - border-radius: 30px; | 24 | + .ui.segment{ |
| 25 | - border: 2px solid #333; | 25 | + width: 40%; |
| 26 | + | ||
| 27 | + } | ||
| 26 | } | 28 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
File mode changed
| ... | @@ -2,10 +2,14 @@ | ... | @@ -2,10 +2,14 @@ |
| 2 | background-color: beige; | 2 | background-color: beige; |
| 3 | display: flex; | 3 | display: flex; |
| 4 | flex-direction: column; | 4 | flex-direction: column; |
| 5 | + justify-content: center; | ||
| 6 | + align-items: center; | ||
| 5 | .Main-header{ | 7 | .Main-header{ |
| 8 | + text-align: center; | ||
| 6 | display: flex; | 9 | display: flex; |
| 7 | flex-direction: row; | 10 | flex-direction: row; |
| 8 | height: 70px; | 11 | height: 70px; |
| 12 | + width: 100%; | ||
| 9 | .title{ | 13 | .title{ |
| 10 | display: flex; | 14 | display: flex; |
| 11 | justify-content: center; | 15 | justify-content: center; |
| ... | @@ -19,7 +23,7 @@ | ... | @@ -19,7 +23,7 @@ |
| 19 | } | 23 | } |
| 20 | .None-title{ | 24 | .None-title{ |
| 21 | display: flex; | 25 | display: flex; |
| 22 | - justify-content: center; | 26 | + justify-content:start; |
| 23 | align-items: center; | 27 | align-items: center; |
| 24 | width: 10%; | 28 | width: 10%; |
| 25 | .ui button{ | 29 | .ui button{ |
| ... | @@ -30,6 +34,9 @@ | ... | @@ -30,6 +34,9 @@ |
| 30 | .Main-body{ | 34 | .Main-body{ |
| 31 | display: flex; | 35 | display: flex; |
| 32 | flex-direction: row; | 36 | flex-direction: row; |
| 37 | + justify-content: center; | ||
| 38 | + align-items: center; | ||
| 39 | + width: 80%; | ||
| 33 | height: 100vh; | 40 | height: 100vh; |
| 34 | border: 3px solid black; | 41 | border: 3px solid black; |
| 35 | .Board{ | 42 | .Board{ | ... | ... |
| ... | @@ -43,6 +43,16 @@ | ... | @@ -43,6 +43,16 @@ |
| 43 | color: white; | 43 | color: white; |
| 44 | outline: none; | 44 | outline: none; |
| 45 | } | 45 | } |
| 46 | + .dropdown{ | ||
| 47 | + width: 75%; | ||
| 48 | + padding: 15px .8em .8em; | ||
| 49 | + background-color: transparent; | ||
| 50 | + border: 2px solid white; | ||
| 51 | + border-radius: 30px; | ||
| 52 | + font-size: 18px; | ||
| 53 | + color: white; | ||
| 54 | + outline: none; | ||
| 55 | + } | ||
| 46 | 56 | ||
| 47 | label { | 57 | label { |
| 48 | position: absolute; | 58 | position: absolute; | ... | ... |
-
Please register or login to post a comment