From cf67c4b6e54267c02a0f6a98b7d0a556c447372b Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Fri, 6 May 2022 16:13:20 +0900 Subject: [PATCH 01/21] =?UTF-8?q?[5=EC=9B=94=206=EC=9D=BC]=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=ACtest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/LoginFalsePage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/LoginFalsePage.js b/src/pages/LoginFalsePage.js index 7e0bffe..2b3e84f 100644 --- a/src/pages/LoginFalsePage.js +++ b/src/pages/LoginFalsePage.js @@ -9,6 +9,7 @@ const Container = styled.div` const LoginFalsePage = () => { return ( + [배포] STUDY.DO

공부만 하세요.
From 84a2de17a8ed78fbdfba6b9dd9e2a7ac138d0717 Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Fri, 6 May 2022 16:41:11 +0900 Subject: [PATCH 02/21] =?UTF-8?q?[5=EC=9B=94=206=EC=9D=BC]=20deploy=5Ftest?= =?UTF-8?q?=5F1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/auth.js | 8 ++++---- src/lib/api/client.js | 10 +++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/lib/api/auth.js b/src/lib/api/auth.js index 25f6ed3..17e268a 100644 --- a/src/lib/api/auth.js +++ b/src/lib/api/auth.js @@ -2,14 +2,14 @@ import client from "./client"; /* login */ export const login = ({id,password}) => - client.post('/api/users/login',{id,password}); + client.post('https://nudo-study.cf/api/users/login',{id,password}); /* register */ export const register = ({id,password})=> - client.post('/api/users/',{id,password}); + client.post('https://nudo-study.cf/api/users/',{id,password}); /* 로그인 상태 확인 */ -export const check = () => client.get('/api/users/check'); +export const check = () => client.get('https://nudo-study.cf/api/users/check'); /* logout */ -export const logout = () => client.get('/api/users/logout'); \ No newline at end of file +export const logout = () => client.get('https://nudo-study.cf/api/users/logout'); \ No newline at end of file diff --git a/src/lib/api/client.js b/src/lib/api/client.js index 3b87420..48e4fec 100644 --- a/src/lib/api/client.js +++ b/src/lib/api/client.js @@ -1,5 +1,13 @@ import axios from 'axios'; -const client = axios.create(); +// const client = axios.create({ +// withCredentials: true +// }); + +// const client = axios.create(); + +const client = axios.create({ + withCredentials: true +}) export default client; \ No newline at end of file From 22f65c968eeae02500a37f70a6c496a322347fc5 Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Fri, 6 May 2022 23:47:40 +0900 Subject: [PATCH 03/21] =?UTF-8?q?[5=EC=9B=94=206=EC=9D=BC]=20=EB=B0=B0?= =?UTF-8?q?=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AllStudy.js | 3 ++- src/components/MyStudy.js | 7 ++++--- src/components/Room.js | 7 ++++--- src/components/manage/Attendance.js | 5 +++-- src/components/manage/Board.js | 3 ++- src/components/manage/BoardCard.js | 3 ++- src/components/manage/Comment.js | 3 ++- src/components/manage/Penalty.js | 3 ++- src/components/manage/TimeRecord.js | 3 ++- src/components/manage/WriteComment.js | 3 ++- src/pages/BoardPutPage.js | 3 ++- src/pages/CommentPage.js | 3 ++- src/pages/MyStudyPage.js | 3 ++- src/pages/StudiesPage.js | 3 ++- src/pages/StudyCreatePage/StudyCreate.js | 3 ++- src/pages/StudyRankingPage.js | 3 ++- src/pages/Write/WritePage.js | 3 ++- 17 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/components/AllStudy.js b/src/components/AllStudy.js index c91758b..7572875 100644 --- a/src/components/AllStudy.js +++ b/src/components/AllStudy.js @@ -4,9 +4,10 @@ import axios from 'axios'; import {Card,Button} from 'react-bootstrap'; const StudiesComp = (props) => { + axios.defaults.withCredentials = true; const study = props.study; - const URL = '/api/studies/join'; + const URL = 'https://nudo-study.cf/api/studies/join'; const [join, setJoin] = useState(null); // const [click, setClick] = useState(false); diff --git a/src/components/MyStudy.js b/src/components/MyStudy.js index 3bf991f..427a478 100644 --- a/src/components/MyStudy.js +++ b/src/components/MyStudy.js @@ -5,12 +5,13 @@ import axios from 'axios'; import {Card,Button} from 'react-bootstrap'; const MyStudy = (props) => { + axios.defaults.withCredentials = true; const mystudy = props.mystudy; const mystudy_id = mystudy.id; - const URL_room = '/api/studies/do/'+mystudy_id; - const URL_recruit = '/api/studies/completed/'+mystudy_id; - const URL_delete = '/api/studies/setting/'+mystudy_id; + const URL_room = 'https://nudo-study.cf/api/studies/do/'+mystudy_id; + const URL_recruit = 'https://nudo-study.cf/api/studies/completed/'+mystudy_id; + const URL_delete = 'https://nudo-study.cf/api/studies/setting/'+mystudy_id; const fetchRoom = async () => { try{ diff --git a/src/components/Room.js b/src/components/Room.js index e4d4dca..5d41d14 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -53,6 +53,7 @@ const videoConstraints = { const Room = (props) => { + axios.defaults.withCredentials = true; const videolistRef = useRef(); videolistRef.current = []; @@ -99,7 +100,7 @@ const Room = (props) => { // socketRef.current = io.connect("https://10.200.11.221:8000"); //현재 커넥트 정보 저장 // console.log(socketRef.current) // ======= - socketRef.current = io.connect("https://192.168.0.28:8000"); //현재 커넥트 정보 저장 + socketRef.current = io.connect("https://nudo-study.cf/"); //현재 커넥트 정보 저장 // >>>>>>> main navigator.mediaDevices.getUserMedia({ video: videoConstraints, audio: false }) @@ -216,7 +217,7 @@ const Room = (props) => { // ======= var response; if(mode) { //자동 측정 on 모드 - response = await fetch('https://192.168.0.28:5000/image', { //https://223.131.223.239:5000/image + response = await fetch('https://223.131.223.239:5000/image', { //https://223.131.223.239:5000/image method: "POST", body: formData, signal: abortController.signal, @@ -312,7 +313,7 @@ const Room = (props) => { const fetchStudyTime = async () => { try{ const roomID = props.match.params.roomID; - const response = await axios.patch('/api/studies/time/'+roomID,{study_time:studyTime_total/1000}); + const response = await axios.patch('https://nudo-study.cf/api/studies/time/'+roomID,{study_time:studyTime_total/1000}); console.log(response.data); if(response.data.code==="200"){ window.location.replace('/'); diff --git a/src/components/manage/Attendance.js b/src/components/manage/Attendance.js index c6d825e..036fb33 100644 --- a/src/components/manage/Attendance.js +++ b/src/components/manage/Attendance.js @@ -7,6 +7,7 @@ import { FaRegSquare } from "react-icons/fa"; import { FaRegWindowMinimize } from "react-icons/fa"; const Attendance = (props) => { + axios.defaults.withCredentials = true; var fix_today = new Date(); var fix_month = fix_today.getMonth()+1; @@ -53,8 +54,8 @@ const Attendance = (props) => { } const studyId = props.studyID; - const URL1 = '/api/studies/attendance/'+studyId; - const URL2 = '/api/studies/mates/'+studyId; //url 중간에 //있었는데 에러 x + const URL1 = 'https://nudo-study.cf/api/studies/attendance/'+studyId; + const URL2 = 'https://nudo-study.cf/api/studies/mates/'+studyId; //url 중간에 //있었는데 에러 x const [atten,setAtten]=useState(null); const [mate,setMate]=useState(null); const [loading, setLoading] = useState(false); diff --git a/src/components/manage/Board.js b/src/components/manage/Board.js index 338cccb..71259b5 100644 --- a/src/components/manage/Board.js +++ b/src/components/manage/Board.js @@ -9,8 +9,9 @@ const Container = styled.div` `; const Board = (props) => { + axios.defaults.withCredentials = true; const studyID = props.studyID - const URL = '/api/studies/'+studyID+'/board/'; + const URL = 'https://nudo-study.cf/api/studies/'+studyID+'/board/'; const write_URL = '/manage/'+studyID+'/write'; const [post, setPost] = useState(null); diff --git a/src/components/manage/BoardCard.js b/src/components/manage/BoardCard.js index ad0e34d..d2c0ae5 100644 --- a/src/components/manage/BoardCard.js +++ b/src/components/manage/BoardCard.js @@ -24,10 +24,11 @@ const enterBoardPut = (studyID,postID) =>{ } const BoardCard = (props) => { + axios.defaults.withCredentials = true; const post = props.post; const studyID = props.studyID; - const URL_delete = '/api/studies/'+studyID+'/board/'+post.idx; + const URL_delete = 'https://nudo-study.cf/api/studies/'+studyID+'/board/'+post.idx; const fetchDelete = async () => { try { diff --git a/src/components/manage/Comment.js b/src/components/manage/Comment.js index 4c55251..cb5eecc 100644 --- a/src/components/manage/Comment.js +++ b/src/components/manage/Comment.js @@ -21,11 +21,12 @@ const Div3 = styled.div` font-size: small; ` const Comment = (props) => { + axios.defaults.withCredentials = true; const comment = props.comment; const studyID = props.studyID; const postID = props.postID; - const URL= '/api/studies/'+studyID+'/board/'+postID+'/comment/'+comment.idx; + const URL= 'https://nudo-study.cf/api/studies/'+studyID+'/board/'+postID+'/comment/'+comment.idx; console.log(comment); diff --git a/src/components/manage/Penalty.js b/src/components/manage/Penalty.js index af3d3fb..6522b84 100644 --- a/src/components/manage/Penalty.js +++ b/src/components/manage/Penalty.js @@ -7,8 +7,9 @@ const Container = styled.div` padding: 20px; `; const Penalty = (props) => { + axios.defaults.withCredentials = true; const studyID = props.studyID; - const URL ='/api/studies/penalty/'+studyID; + const URL ='https://nudo-study.cf/api/studies/penalty/'+studyID; const [penalty, setPenalty] = useState(null); const [loading,setLoading] = useState(false); diff --git a/src/components/manage/TimeRecord.js b/src/components/manage/TimeRecord.js index 496e706..96df93f 100644 --- a/src/components/manage/TimeRecord.js +++ b/src/components/manage/TimeRecord.js @@ -6,6 +6,7 @@ import TimeRecordCard from './TimeRecordCard'; import '../../css/TimeRecord.css'; const TimeRecord = (props) => { + axios.defaults.withCredentials = true; const studyId = props.studyID; @@ -99,7 +100,7 @@ const changeAfter = () => { const clickDate = async (e, index) => { var clickdate = new Date(new Date().setDate(today.getDate()-6+index)); - var URL = '/api/studies/time/'+studyId; + var URL = 'https://nudo-study.cf/api/studies/time/'+studyId; try{ const response = await axios.post(URL,{date:clickdate}); diff --git a/src/components/manage/WriteComment.js b/src/components/manage/WriteComment.js index d0c06c7..f6c6197 100644 --- a/src/components/manage/WriteComment.js +++ b/src/components/manage/WriteComment.js @@ -3,13 +3,14 @@ import React, { useState } from 'react'; import {Form,Button} from 'react-bootstrap'; const WriteComment = () => { + axios.defaults.withCredentials = true; const studyID = window.location.href.split("/").reverse()[2]; const postID = window.location.href.split("/").reverse()[1]; console.log(studyID,'|',postID); //게시글 댓글 작성 /api/studeis/{:studyId}/board/{:idx}/comment [POST] // const URL = '/api/studies/board/comment/write/'+studyID+'/'+postID; - const URL = '/api/studies/'+studyID+'/board/'+postID+'/comment'; + const URL = 'https://nudo-study.cf/api/studies/'+studyID+'/board/'+postID+'/comment'; const [comment, setComment] = useState(""); const handleSubmit = async (e) => { diff --git a/src/pages/BoardPutPage.js b/src/pages/BoardPutPage.js index 38e460d..7482181 100644 --- a/src/pages/BoardPutPage.js +++ b/src/pages/BoardPutPage.js @@ -8,11 +8,12 @@ const Container = styled.div` `; const BoardPutPage = (props) => { + axios.defaults.withCredentials = true; const studyID = props.match.params.studyID const postID = props.match.params.postID ///api/studeis/{:studyId}/board/{:idx} [PUT] - const URL = '/api/studies/'+studyID+'/board/'+postID; + const URL = 'https://nudo-study.cf/api/studies/'+studyID+'/board/'+postID; const [title, setTitle] = useState(""); const [content, setContent] = useState(""); diff --git a/src/pages/CommentPage.js b/src/pages/CommentPage.js index 67b0a11..103dd2c 100644 --- a/src/pages/CommentPage.js +++ b/src/pages/CommentPage.js @@ -14,11 +14,12 @@ const Writer = styled.div` font-weight: bold; ` const CommentPage = ({ match }) => { + axios.defaults.withCredentials = true; const studyID =match.params.studyID; const postID = match.params.postID; //게시글 상세 화면 /api/studeis/{:studyId}/board/{:idx} - const URL = '/api/studies/'+studyID+'/board/'+postID; + const URL = 'https://nudo-study.cf/api/studies/'+studyID+'/board/'+postID; const [post, setPost] = useState(null); const [comment, setComment] = useState(null); diff --git a/src/pages/MyStudyPage.js b/src/pages/MyStudyPage.js index 06a4de3..38bca4b 100644 --- a/src/pages/MyStudyPage.js +++ b/src/pages/MyStudyPage.js @@ -9,7 +9,8 @@ const Container = styled.div` `; const MyStudyPage = () => { - const URL = '/api/users/studies'; + axios.defaults.withCredentials = true; + const URL = 'https://nudo-study.cf/api/users/studies'; const [myStudy, setMyStudy] = useState(null); const [loading, setLoading] = useState(false); diff --git a/src/pages/StudiesPage.js b/src/pages/StudiesPage.js index 309d4fe..dbe67d7 100644 --- a/src/pages/StudiesPage.js +++ b/src/pages/StudiesPage.js @@ -9,7 +9,8 @@ const Container = styled.div` `; const StudiesPage = () => { - const URL = '/api/studies'; + axios.defaults.withCredentials = true; + const URL = 'https://nudo-study.cf/api/studies'; const [studies, setStudies] = useState(null); const [loading, setLoading] = useState(false); diff --git a/src/pages/StudyCreatePage/StudyCreate.js b/src/pages/StudyCreatePage/StudyCreate.js index 1079306..ad40294 100644 --- a/src/pages/StudyCreatePage/StudyCreate.js +++ b/src/pages/StudyCreatePage/StudyCreate.js @@ -43,7 +43,8 @@ const Input = styled.input` // `; const StudyCreate = (props) => { - const URL = '/api/studies'; + axios.defaults.withCredentials = true; + const URL = 'https://nudo-study.cf/api/studies'; const {inputs,submitting,handleChange,handleSubmit} = useForm({ initialValues: {study_id: "",title:"",topic:"",target_time:"",penalty:"",info:""}, diff --git a/src/pages/StudyRankingPage.js b/src/pages/StudyRankingPage.js index d09cb89..bde3705 100644 --- a/src/pages/StudyRankingPage.js +++ b/src/pages/StudyRankingPage.js @@ -55,7 +55,8 @@ const Content3 = styled.div` `; const StudyRankingPage = () => { - const URL = '/api/rankings/studies'; + axios.defaults.withCredentials = true; + const URL = 'https://nudo-study.cf/api/rankings/studies'; const [studies, setStudies] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); diff --git a/src/pages/Write/WritePage.js b/src/pages/Write/WritePage.js index d7114a3..f226c7f 100644 --- a/src/pages/Write/WritePage.js +++ b/src/pages/Write/WritePage.js @@ -8,9 +8,10 @@ const Container = styled.div` padding: 20px; `; const WritePage = (props) => { + axios.defaults.withCredentials = true; const studyID = props.match.params.studyID console.log(props.match.params.studyID) - const URL = '/api/studies/'+studyID+'/board'; + const URL = 'https://nudo-study.cf/api/studies/'+studyID+'/board'; const [title, setTitle] = useState(""); const [content, setContent] = useState(""); From 5017dbe52380656903170a61fc6b66a45e464a6f Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Tue, 10 May 2022 00:49:31 +0900 Subject: [PATCH 04/21] =?UTF-8?q?[5=EC=9B=94=2010=EC=9D=BC]=2000:00?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=B0=94=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/StopWatch.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/StopWatch.js b/src/components/StopWatch.js index 4313406..47f0846 100644 --- a/src/components/StopWatch.js +++ b/src/components/StopWatch.js @@ -130,8 +130,8 @@ const StopWatch = (props) => { ); From 13abfb527ce1154f5e20f1591e4ab09186bc6bc4 Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Thu, 12 May 2022 15:38:11 +0900 Subject: [PATCH 05/21] =?UTF-8?q?[5=EC=9B=94=2012=EC=9D=BC]=20=EB=A1=9C?= =?UTF-8?q?=EA=B3=A0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/img/studydo.png | Bin 0 -> 37010 bytes src/components/common/Header.js | 5 ++++- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 public/img/studydo.png diff --git a/public/img/studydo.png b/public/img/studydo.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdd7d96c79489f3490c0a7994699e244be95430 GIT binary patch literal 37010 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 { return (
-
STUDY.DO
+
+ +
Date: Thu, 12 May 2022 19:35:11 +0900 Subject: [PATCH 06/21] =?UTF-8?q?[5=EC=9B=94=2012=EC=9D=BC]=2000:00:00?= =?UTF-8?q?=ED=98=95=EC=8B=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/StopWatch.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/StopWatch.js b/src/components/StopWatch.js index 47f0846..f6451aa 100644 --- a/src/components/StopWatch.js +++ b/src/components/StopWatch.js @@ -130,7 +130,7 @@ const StopWatch = (props) => { From fbb96f7761bd36d1daa8889b0fa8dd16be94baa2 Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Fri, 13 May 2022 15:55:30 +0900 Subject: [PATCH 07/21] =?UTF-8?q?[5=EC=9B=94=2013=EC=9D=BC]=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Room.js | 241 +++++++++++++++++----------- src/components/manage/Attendance.js | 24 +-- src/components/manage/TimeRecord.js | 4 +- src/components/text.png | Bin 0 -> 21442 bytes src/css/Room.css | 5 + 5 files changed, 164 insertions(+), 110 deletions(-) create mode 100644 src/components/text.png create mode 100644 src/css/Room.css diff --git a/src/components/Room.js b/src/components/Room.js index 5d41d14..4433d2b 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -1,11 +1,13 @@ -import React, { useEffect, useRef, useState } from "react"; +import React, { useEffect, useRef, useState} from "react"; import io from "socket.io-client"; import Peer from "simple-peer"; import styled, {css} from "styled-components"; import StopWatch from './StopWatch'; +// import SimpleStopWatch from './SimpleStopWatch'; import axios from 'axios'; import "../css/ModeToggle.css"; - +import "../css/Room.css"; +import text from "./text.png"; let now_yes; //계속 NO HAND! 나오다가 HAND DETECT! 나온 시점 let now_no; //계속 HAND DETECT! 나오다가 NO HAND! 나온 시점 @@ -17,6 +19,36 @@ let start =0; let watch_test = true; let mode = false; var abortController = new AbortController(); +var disconnect_idx; +var disconnect_flag = false; + +const peervideoStyle = { + height: '100%' , + width: '100%', + filter: 'brightness(1)', + objectFit: 'cover' +} + +const videodivStyle = { + position: 'relative', + height: '45%', + //width + margin = 50% + width: '47%', + margin: '0.3%', + border: '2pt solid black', + backgroundColor: 'black' +} + +const imagedivStyle = { + position: 'relative', + height: '45%', + //width + margin = 50% + width: '47%', + margin: '0.3%', + border: '2pt solid black', + backgroundColor: 'black' +} + const Container = styled.div` padding: 20px; @@ -32,9 +64,26 @@ const StyledVideo = styled.video` bottom: 0px; width: 100%; height: 100%; - filter: ${props => props.color==="false" ? 'grayscale(100%)' : 'brightness(1)'}; + filter: ${props => props.color==="false" ? 'brightness(1)' : 'brightness(1)'}; `; +const VacantImage = styled.div` + position: absolute; + height: 100%; + width: 100%; + visibility: ${props => props.state===false ? 'visible' : 'hidden'}; + `; + +const PeerVideo = styled.video` + position: absolute; + height: 100%; + width: 100%; + filter: brightness(1); + objectFit: cover; + visibility: ${props => props.state===false ? 'hidden' : 'visible'}; + `; + + const StyledCanvas = styled.canvas` height: 40%; width: 50%; @@ -52,8 +101,34 @@ const videoConstraints = { }; +const imageStyle = { + position: 'absolute', + height: '100%', + //width + margin = 50% + width: '100%', +} + +const Video = (props) => { + const ref = useRef(); + var state = props.state; + + useEffect(() => { + props.peer.on("stream", stream => { + ref.current.srcObject = stream; + }) + }, []); + + return ( +
+ + +
+ ); +}; + + const Room = (props) => { - axios.defaults.withCredentials = true; + console.log("---------------------------재실행----------") const videolistRef = useRef(); videolistRef.current = []; @@ -85,51 +160,59 @@ const Room = (props) => { videoColor=text; } + function getPeerlist(){ + console.log("function getPeerlist: ", peers); + console.log("function getPeerRef: ", peersRef); + } + + getPeerlist(); - useEffect(() => { //호출 되면 실행? - {peers.map((peer, index) => { - peer.on("stream", stream => { - videolistRef.current[index].srcObject = stream; - }) })} - })//,[peers]); <-문제 생기면 추가 useEffect(() => { //렌더링 될 때마다 실행, peers 값 변할 때마다 렌더링 -// <<<<<<< HEAD -// console.log("렌더링3: useEffect 실행 -> 소켓 통신, 디텍션 "); -// console.log("렌더링3: videolistRef.current[0] : ", videolistRef.current[0]); -// socketRef.current = io.connect("https://10.200.11.221:8000"); //현재 커넥트 정보 저장 -// console.log(socketRef.current) -// ======= + + socketRef.current = io.connect("https://nudo-study.cf/"); //현재 커넥트 정보 저장 -// >>>>>>> main - + console.log("내 peer id: ", socketRef.current); navigator.mediaDevices.getUserMedia({ video: videoConstraints, audio: false }) .then(stream => { userVideo.current.srcObject = stream; // 내 비디오 추가 + socketRef.current.emit("join room", roomID); + socketRef.current.on("all users", users => { //"all users" 이벤트 듣고 있다가 실행, 첫 접속 시 본인 제외 다른 피어들 정보 받아옴 - const peers = []; //위에 peers와 구분됨 + console.log("#all users"); + const peers = []; users.forEach(userID => { //타 피어 정보 받아와서 peer 객체로 peersRef, peers 에 저장 const peer = createPeer(userID, socketRef.current.id, stream); - peersRef.current.push({ //peerRef 업데이트 peerID: userID, - peer + peer, + videoState: false }) - peers.push(peer); + peers.push({ + peerID: userID, + peer, + videoState: false + }); }) setPeers(peers); //peers 업데이트 -> 재렌더링 - + console.log("0-2. peers: ", peers); }) - socketRef.current.on("user joined", payload => { const peer = addPeer(payload.signal, payload.callerID, stream); peersRef.current.push({ peerID: payload.callerID, - peer + peer, + videoState: false }) - setPeers(users => [...users, peer]); + + const peerObj = { + peerID: payload.callerID, + peer, + videoState: false + } + setPeers(users => [...users, peerObj]); }); socketRef.current.on("receiving returned signal", payload => { @@ -137,25 +220,32 @@ const Room = (props) => { item.peer.signal(payload.signal); }); - - //5. video-state 이벤트 socketRef.current.on("video-state", data => { //data: peer_tf, tf_state (<-반대로 바꿔주기만 하면 됨) - + console.log("#video-state > data: ", data); if(data.peer_tf === myID){ //서버에서 broadcast로 emit 못함 console.log ("5. 내 tf 상태 emit") //필요없음, 지워야 }else{ var index = peersRef.current.findIndex(i => i.peerID === data.peer_tf); if(data.tf_state === 'false'){ - videolistRef.current[index].style.filter = 'brightness(0)' + const uniquePeers = peersRef.current; + uniquePeers[index].videoState = false; + peersRef.current[index].videoState = false; watch_test=false; + setPeers(uniquePeers); + setPeers(users => [...users]); //강제로 렌더링 }else{ - videolistRef.current[index].style.filter = 'brightness(1)' + const uniquePeers = peersRef.current; + uniquePeers[index].videoState = true; + peersRef.current[index].videoState = true; watch_test=true; + setPeers(uniquePeers); + setPeers(users => [...users]); //강제로 렌더링 } } }) socketRef.current.on("my peer id", myPeerID => { + console.log("#my peer id"); myID = myPeerID; }) @@ -165,14 +255,22 @@ const Room = (props) => { 2. peers에서 삭제해야 (문제: peers에 socket.id 없음) -> peersRef에서 인덱스 추출하고 peers에서는 해당 인덱스 삭제 */ - socketRef.current.on("user-disconnected", disconnect_peer => { - var idx = peersRef.current.findIndex(i => i.peerID === disconnect_peer); //peersRef에서 인덱스 추출 - peersRef.current.splice(idx,1); //peersRef에서 삭제 - setPeers(peers.filter((value,index) => index !== idx)); //peers 삭제 + socketRef.current.on("user-disconnected", id => { + const peerObj = peersRef.current.find(p=>p.peerID === id); + if(peerObj){ + peerObj.peer.destroy(); + } + const peers = peersRef.current.filter(p=> p.peerID != id); + peersRef.current = peers; + + const uniquePeers = peers.filter(p=> p.peerID != id); //수정: 이미 filter 처리 한거니까 그냥 peer만 넣기 + setPeers(uniquePeers); + }) }) - }) + },[]); + useEffect(()=>{ const interval = setInterval(async () => { captureImageFromCamera(); @@ -180,41 +278,7 @@ const Room = (props) => { if (imageRef.current && mode) { const formData = new FormData(); formData.append('image', imageRef.current); -// <<<<<<< HEAD - -// const response = await fetch('https://10.200.11.221:5000/image', { -// method: "POST", -// body: formData, -// }).then().catch(err => console.log(err)); - -// console.log("0. 디텍트 실행"); -// if (response.status === 200) { - - -// const text = await response.text(); -// detect = JSON.parse(text); -// videoColor = detect.result; -// console.log('2>(Room)실제 detect: ',detect.result); -// setResult(detect.result); -// console.log("3>(Room)useEffect안의 스탑워치: ",watch); - -// if(watch === 'false'){ -// detect.result = 'false'; -// console.log('4>(Room)detect 변경: ',detect.result); -// } - -// console.log('5>(Room)두번째 detect: ',detect.result); - -// if(detect.result === 'true'){ - -// num++; -// yn_arr[num%2]=0; - -// if((yn_arr[0]+yn_arr[1])%2!=0 | start == 0){ -// now_yes=new Date(); -// console.log('NOW_YES: ',now_yes.getTime()); -// ======= var response; if(mode) { //자동 측정 on 모드 response = await fetch('https://223.131.223.239:5000/image', { //https://223.131.223.239:5000/image @@ -243,7 +307,6 @@ const Room = (props) => { if((yn_arr[0]+yn_arr[1])%2!=0){ timeEnd(); } -// >>>>>>> main } //위 코드랑 합치기 필요 @@ -317,6 +380,7 @@ const Room = (props) => { console.log(response.data); if(response.data.code==="200"){ window.location.replace('/'); + console.log('시간저장') } }catch(e){ console.log(e); @@ -358,6 +422,7 @@ const Room = (props) => { const modeClick = () =>{ //false : 자동모드 off , true: 자동모드 on console.log("모드 바꿈"); const socket=socketRef.current; + //스탑워치가 작동 중이었다면, 스탑워치 멈출 때 시간 갱신 console.log("watch 상태 (작동중 클릭이면 true, 끊고 클릭이면 false여야", watch) if(mode && watch === 'true' && detect.result === 'true'){ //mode on -> off 클릭일 때 @@ -393,24 +458,6 @@ const Room = (props) => { //socket.emit : off -> stopwatch.js 에서, on -> Room.js에서 수행 } - - const videodivStyle = { - position: 'relative', - height: '45%', - //width + margin = 50% - width: '47%', - margin: '0.3%', - border: '2pt solid black', - backgroundColor: 'black' - } - - const peervideoStyle = { - height: '100%' , - width: '100%', - filter: 'brightness(1)', - objectFit: 'cover' - } - const outbuttonStyle = { position: 'absolute', left: '0px', @@ -428,7 +475,9 @@ const Room = (props) => { } return ( + + {console.log("JSX")}
@@ -438,6 +487,7 @@ const Room = (props) => { click={click} getClickValue={getClickValue} timeStart={timeStart} timeEnd={timeEnd} color={videoColor} getVideoColorValue={getVideoColorValue}/> + {/* */}
{modeClick()}} /> @@ -446,13 +496,12 @@ const Room = (props) => {
- {peers.map((peer, index) => { - return( -
- -
- ) - })} + {peers.map((peer, index) => { + return ( +
); }; diff --git a/src/components/manage/Attendance.js b/src/components/manage/Attendance.js index 036fb33..0d418a9 100644 --- a/src/components/manage/Attendance.js +++ b/src/components/manage/Attendance.js @@ -268,7 +268,7 @@ const Attendance = (props) => { console.log('return 직전 resultlist:', resultlist); //발표용 - 지우기 - var k =1 + // var k =1 // return ( @@ -297,17 +297,17 @@ const Attendance = (props) => { return(
) else if(check == 'X') return(
) - else - //발표용-지우기 - if(k%3==2){ - k+=1 - return(
X
) - } - else{ - k+=1 - return(
O
) - } - //발표용-지우기 + // else + // //발표용-지우기 + // if(k%3==2){ + // k+=1 + // return(
X
) + // } + // else{ + // k+=1 + // return(
O
) + // } + // //발표용-지우기 // return(
) }) diff --git a/src/components/manage/TimeRecord.js b/src/components/manage/TimeRecord.js index 96df93f..5a0b100 100644 --- a/src/components/manage/TimeRecord.js +++ b/src/components/manage/TimeRecord.js @@ -178,7 +178,7 @@ const changeAfter = () => {
{/* 발표용-지우기 */} -      시간 + {/*      시간                          @@ -187,7 +187,7 @@ const changeAfter = () => {          3      - 3.5 + 3.5 */} {/* 발표용-지우기 */} { diff --git a/src/components/text.png b/src/components/text.png new file mode 100644 index 0000000000000000000000000000000000000000..31b232a8ebcdeac5d7f16794a989803d8466443f GIT binary patch literal 21442 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 literal 0 HcmV?d00001 diff --git a/src/css/Room.css b/src/css/Room.css new file mode 100644 index 0000000..e36db54 --- /dev/null +++ b/src/css/Room.css @@ -0,0 +1,5 @@ +.imageStyle { + position: absolute; + width: 100%; + height: 100%; + } \ No newline at end of file From feb9506ef3de9caf06c5b3b2ab54e64c4368873c Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Sat, 14 May 2022 10:43:06 +0900 Subject: [PATCH 08/21] =?UTF-8?q?[5=EC=9B=94=2014=EC=9D=BC]=20=EA=B3=B5?= =?UTF-8?q?=EB=B6=80=EC=8B=9C=EA=B0=84update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Room.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/Room.js b/src/components/Room.js index 4433d2b..f7670c7 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -375,6 +375,7 @@ const Room = (props) => { const fetchStudyTime = async () => { try{ + axios.defaults.withCredentials = true; const roomID = props.match.params.roomID; const response = await axios.patch('https://nudo-study.cf/api/studies/time/'+roomID,{study_time:studyTime_total/1000}); console.log(response.data); From a1bef80d4e4586ff02abb5a9147db7719506ac5c Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Mon, 16 May 2022 23:11:08 +0900 Subject: [PATCH 09/21] =?UTF-8?q?[5=EC=9B=94=2016=EC=9D=BC]=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20db=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Room.js | 4 +++- src/components/manage/TimeRecord.js | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/Room.js b/src/components/Room.js index f7670c7..d5eefd4 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -389,10 +389,12 @@ const Room = (props) => { } const enterHome = () =>{ - if( ((yn_arr[0]+yn_arr[1])==0 && studyTime_total>0) || (!mode && watch==='true')){ //mode on, off 둘 다 watch 기준으로 수정 + if( ((yn_arr[0]+yn_arr[1])==0 && studyTime_total>=0) || (!mode && watch==='true')){ //mode on, off 둘 다 watch 기준으로 수정 timeEnd(); console.log('YES상태에서 나가기 누름'); //on mode의 측정 중, off mode의 측정 중 상황 모두 포함 } + console.log(yn_arr[0]) + console.log(yn_arr[1]) console.log('최종 공부시간(초):',studyTime_total/1000); fetchStudyTime(); diff --git a/src/components/manage/TimeRecord.js b/src/components/manage/TimeRecord.js index 5a0b100..1a06f98 100644 --- a/src/components/manage/TimeRecord.js +++ b/src/components/manage/TimeRecord.js @@ -7,6 +7,7 @@ import '../../css/TimeRecord.css'; const TimeRecord = (props) => { axios.defaults.withCredentials = true; + console.log('time_reocord'); const studyId = props.studyID; From 607ceaf7e9ee3b9ec4e4222bc57727d55fda813b Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Tue, 17 May 2022 00:27:10 +0900 Subject: [PATCH 10/21] =?UTF-8?q?[5=EC=9B=94=2017=EC=9D=BC]=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Room.js | 20 ++++++++++++-------- src/components/StopWatch.js | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/components/Room.js b/src/components/Room.js index d5eefd4..2b45645 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -298,14 +298,16 @@ const Room = (props) => { num++; yn_arr[num%2]=0; if(start == 0 | (yn_arr[0]+yn_arr[1])%2!=0){ - timeStart(); + timeStart(); //필요 + setWatch('true'); } start++; }else if(detect.result === 'false'){ num++; yn_arr[num%2]=1; if((yn_arr[0]+yn_arr[1])%2!=0){ - timeEnd(); + timeEnd(); + setWatch('false'); //0516 추가 } } @@ -389,7 +391,7 @@ const Room = (props) => { } const enterHome = () =>{ - if( ((yn_arr[0]+yn_arr[1])==0 && studyTime_total>=0) || (!mode && watch==='true')){ //mode on, off 둘 다 watch 기준으로 수정 + if( watch==='true'){ //mode on, off 둘 다 watch 기준으로 수정 timeEnd(); console.log('YES상태에서 나가기 누름'); //on mode의 측정 중, off mode의 측정 중 상황 모두 포함 } @@ -430,8 +432,10 @@ const Room = (props) => { console.log("watch 상태 (작동중 클릭이면 true, 끊고 클릭이면 false여야", watch) if(mode && watch === 'true' && detect.result === 'true'){ //mode on -> off 클릭일 때 num=0; //시간 측정 flag 초기화 - yn_arr = [0,0]; - flag = [1,1]; //socket-event flag 초기화 + yn_arr = [1,1]; //0516 수정 , [false,false] + flag = [0,0]; //0516 수정, [false,false] + // yn_arr = [0,0]; + //flag = [1,1]; //socket-event flag 초기화 n = 0; timeEnd(); }else if(!mode && watch === 'true'){ //mode off -> on 클릭일 때 @@ -441,7 +445,7 @@ const Room = (props) => { //timeStart(); //off 측정 중인 상태에서 on으로 갈 때 필요 //0505 삭제 (true, false인지도 모르는데 바로 시작하면 x) } - setClick(!click) + setClick(!click) //0516 왜 있지 mode = !mode; //true인 경우 : fetch x //watch false로 바꾸기 if(!mode){ //off 모드면 @@ -451,8 +455,8 @@ const Room = (props) => { socket.emit('false-event', { peer_tf: myID, dst_room: roomID, tf_state: 'false'}) //0325: 처음 상태 black }else{ //on 모드 abortController = new AbortController(); - setClick(true) - // getWatchValue('true'); //삭제 + setClick(false) //0516 true-> false로 수정 + getWatchValue('false'); //삭제 / 0516 다시 부활 n++; flag[n%2] = 0; videoColor = 'false' diff --git a/src/components/StopWatch.js b/src/components/StopWatch.js index f6451aa..b10e54a 100644 --- a/src/components/StopWatch.js +++ b/src/components/StopWatch.js @@ -85,7 +85,7 @@ const StopWatch = (props) => { clearInterval(interval); } }else{ //mode off: watch 만 true 면 됨 (코드 나중에 정리) - if(props.click & props.watch === 'true' ){ //mode off, running -> true + if(props.watch === 'true' ){ //mode off, running -> true interval = setInterval(()=>{ setTime(prevTime => prevTime+10) },10) From 14f531b0a0016fda4f1c3d343c836a93f9b575bb Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Tue, 17 May 2022 13:16:34 +0900 Subject: [PATCH 11/21] =?UTF-8?q?[5=EC=9B=94=2017=EC=9D=BC]=20=EB=A1=9C?= =?UTF-8?q?=EA=B3=A0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/Header.js | 4 +++- src/components/common/studydo.png | Bin 0 -> 37010 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/components/common/studydo.png diff --git a/src/components/common/Header.js b/src/components/common/Header.js index 4d0e027..970fd95 100644 --- a/src/components/common/Header.js +++ b/src/components/common/Header.js @@ -11,7 +11,9 @@ const Header2 = ({user, onLogout}) => {
- + {/* */} + {/* */} +
^UOc--bBpHErAyb;)t=~Fx^$)H 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 Date: Tue, 17 May 2022 13:48:22 +0900 Subject: [PATCH 12/21] =?UTF-8?q?[5=EC=9B=94=2017=EC=9D=BC]=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20=EB=B0=B0=ED=8F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Room.js | 89 +++++++++++++++---- src/components/SimpleStopWatch.js | 132 ++++++++++++++++++++++++++++ src/components/manage/Attendance.js | 51 +++++++---- 3 files changed, 237 insertions(+), 35 deletions(-) create mode 100644 src/components/SimpleStopWatch.js diff --git a/src/components/Room.js b/src/components/Room.js index 2b45645..4b59001 100644 --- a/src/components/Room.js +++ b/src/components/Room.js @@ -3,12 +3,15 @@ import io from "socket.io-client"; import Peer from "simple-peer"; import styled, {css} from "styled-components"; import StopWatch from './StopWatch'; -// import SimpleStopWatch from './SimpleStopWatch'; +import SimpleStopWatch from './SimpleStopWatch'; import axios from 'axios'; import "../css/ModeToggle.css"; import "../css/Room.css"; import text from "./text.png"; +console.log(new Date()); +console.log(Date.now()); + let now_yes; //계속 NO HAND! 나오다가 HAND DETECT! 나온 시점 let now_no; //계속 HAND DETECT! 나오다가 NO HAND! 나온 시점 let studyTime =0; @@ -22,12 +25,13 @@ var abortController = new AbortController(); var disconnect_idx; var disconnect_flag = false; +/* const peervideoStyle = { height: '100%' , width: '100%', filter: 'brightness(1)', - objectFit: 'cover' -} + //objectFit: 'cover' +} */ const videodivStyle = { position: 'relative', @@ -64,7 +68,7 @@ const StyledVideo = styled.video` bottom: 0px; width: 100%; height: 100%; - filter: ${props => props.color==="false" ? 'brightness(1)' : 'brightness(1)'}; + filter: ${props => props.color==="false" ? 'grayscale(100%)' : 'brightness(1)'}; `; const VacantImage = styled.div` @@ -74,6 +78,7 @@ const VacantImage = styled.div` visibility: ${props => props.state===false ? 'visible' : 'hidden'}; `; + const PeerVideo = styled.video` position: absolute; height: 100%; @@ -89,7 +94,7 @@ const StyledCanvas = styled.canvas` width: 50%; `; -let videoColor; +let videoColor = 'false'; let detect; let flag = [1,1]; let n = 0; @@ -117,10 +122,10 @@ const Video = (props) => { ref.current.srcObject = stream; }) }, []); - +// style= {peervideoStyle} return (
- +
); @@ -180,7 +185,7 @@ const Room = (props) => { socketRef.current.emit("join room", roomID); socketRef.current.on("all users", users => { //"all users" 이벤트 듣고 있다가 실행, 첫 접속 시 본인 제외 다른 피어들 정보 받아옴 - console.log("#all users"); + console.log("@all users"); const peers = []; users.forEach(userID => { //타 피어 정보 받아와서 peer 객체로 peersRef, peers 에 저장 const peer = createPeer(userID, socketRef.current.id, stream); @@ -200,6 +205,7 @@ const Room = (props) => { }) socketRef.current.on("user joined", payload => { + console.log("@user joined"); const peer = addPeer(payload.signal, payload.callerID, stream); peersRef.current.push({ peerID: payload.callerID, @@ -213,11 +219,58 @@ const Room = (props) => { videoState: false } setPeers(users => [...users, peerObj]); + + //상태 emit + var state; + if(mode){ //mode on + if(props.detect === 'false') state = false; + else state = true; + }else{ //mode off + if(watch ==='false') state = false; + else state = true; + } + //console.log("@give-videostate emit") + // socketRef.current.emit('give-videostate', { giver: myID, peerID: payload.callerID, tf_state: state}); }); socketRef.current.on("receiving returned signal", payload => { + console.log("@receiving returned signal"); const item = peersRef.current.find(p => p.peerID === payload.id); item.peer.signal(payload.signal); + socketRef.current.emit('call-videostate1', {peerID: myID, dst_room: roomID}); + }); + + socketRef.current.on("call-videostate2", data => { + console.log("@call-videostate2"); + //상태 emit + var state; + if(mode){ //mode on + if(props.detect === 'false') state = false; + else state = true; + }else{ //mode off + console.log("@call-videostate2 videoColor: ", videoColor); + if(videoColor ==='false') state = false; + else state = true; + } + socketRef.current.emit('receive-videostate1', {peerID: data.peerID, giver: myID, tf_state: state}); + }); + + socketRef.current.on("receive-videostate2", data => { + console.log("@receive-state2"); + var index = peersRef.current.findIndex(p => p.peerID === data.peerID); + console.log("@receive-state data.peerID: ", data.peerID); + console.log("@receive-state data.tf_state: ", typeof(data.tf_state)); + console.log("@receive-state index: ", index); + if(data.tf_state){ //주의: boolean 타입 + console.log("@receive2에서 true"); + const uniquePeers = peersRef.current; + uniquePeers[index].videoState = true; + peersRef.current[index].videoState = true; + watch_test=true; //이거 왜 있음? + setPeers(uniquePeers); + setPeers(users => [...users]); //강제로 렌더링 + console.log("@receive2에서 setPEers"); + } }); socketRef.current.on("video-state", data => { //data: peer_tf, tf_state (<-반대로 바꿔주기만 하면 됨) @@ -299,7 +352,7 @@ const Room = (props) => { yn_arr[num%2]=0; if(start == 0 | (yn_arr[0]+yn_arr[1])%2!=0){ timeStart(); //필요 - setWatch('true'); + setWatch('true'); } start++; }else if(detect.result === 'false'){ @@ -307,7 +360,7 @@ const Room = (props) => { yn_arr[num%2]=1; if((yn_arr[0]+yn_arr[1])%2!=0){ timeEnd(); - setWatch('false'); //0516 추가 + setWatch('false'); //0516 추가 } } @@ -383,7 +436,6 @@ const Room = (props) => { console.log(response.data); if(response.data.code==="200"){ window.location.replace('/'); - console.log('시간저장') } }catch(e){ console.log(e); @@ -391,12 +443,13 @@ const Room = (props) => { } const enterHome = () =>{ + //0516 mode && 추가, && studyTime_total>=0 삭제 + //console.log("") + // ((mode && yn_arr[0]+yn_arr[1])==0) || (!mode && watch==='true') 0516 삭제, 수정 if( watch==='true'){ //mode on, off 둘 다 watch 기준으로 수정 + console.log('#######################YES상태에서 나가기 누름'); //on mode의 측정 중, off mode의 측정 중 상황 모두 포함 timeEnd(); - console.log('YES상태에서 나가기 누름'); //on mode의 측정 중, off mode의 측정 중 상황 모두 포함 } - console.log(yn_arr[0]) - console.log(yn_arr[1]) console.log('최종 공부시간(초):',studyTime_total/1000); fetchStudyTime(); @@ -489,12 +542,16 @@ const Room = (props) => { - */} + - {/* */}
{modeClick()}} /> diff --git a/src/components/SimpleStopWatch.js b/src/components/SimpleStopWatch.js new file mode 100644 index 0000000..6d5d917 --- /dev/null +++ b/src/components/SimpleStopWatch.js @@ -0,0 +1,132 @@ +import React, {useEffect, useState, useRef} from 'react'; + +var click = false; +var stTime = 0; +var endTime = 0; +var timerStart = null; //잘못되었을수도.. + +const SimpleStopWatch = (props) => { + const socket = props.socket; + let stop_val = false; + + const buttonStyle = { + position: 'absolute', + right: '0px', + bottom: '0px', + fontSize: '1.5rem', //원래 0.7 (발표용) + color: 'white', + backgroundColor: 'rgba(0, 0, 0, 0.7)', + fontWeight: 'bold', + borderColor: 'white' + } + + const sendWatchValue= () =>{ //스탑워치 클릭 시 로직 + props.getClickValue(!props.click); + if(!props.mode){ //자동 측정 mode off 일 때만 watch 수동 조작 이벤트 실행 + console.log("1. props.watch: ", props.watch); + if(props.watch === 'false'){ + props.getWatchValue('true'); + console.log("2. props.watch: ", props.watch); + props.timeStart(); + props.getVideoColorValue('true') //흑백 - 블랙 타이밍 확인용 + socket.emit('false-event', { peer_tf: props.myID, dst_room: props.roomID, tf_state: 'true'}) + }else{ + props.getWatchValue('false'); + console.log("3. props.watch: ", props.watch); + props.timeEnd(); + props.getVideoColorValue('false') //흑백 - 블랙 타이밍 확인용 + socket.emit('false-event', { peer_tf: props.myID, dst_room: props.roomID, tf_state: 'false'}) + } + }else{ //mode on + props.getClickValue(true); + props.getWatchValue('false'); //0505 true -> false로 바꿈, 처음에는 false로 시작해야하지 않나.. + console.log("4. props.watch: ", props.watch); + socket.emit('false-event', { peer_tf: props.myID, dst_room: props.roomID, tf_state: 'false'}) + } //else{ + // props.getWatchValue('false'); + // socket.emit('false-event', { peer_tf: props.myID, dst_room: props.roomID, tf_state: 'false'}) + // } + } + + // console.log('wow: ',props.detect); + if(props.mode){ + if(props.detect === 'false'){ //Room.js의 result를 props.detect로 받아옴 + stop_val = false; + }else if(props.detect === 'true'){ + stop_val = true; + } +} + + const [hour, setHour] = useState(0); + const [min, setMin] = useState(0); + const [sec, setSec] = useState(0); + useEffect(()=>{ + // function startOrStop() { + // setClick(!click); + // click = !click; + console.log("click1: ", click) + if(click == true){ + click = false; + }else{ + click = true; + } + console.log("click2:", click); + console.log("watch: ", props.watch); + if(props.watch === 'true'){ //click -> 기준 watch 하나로 + if(stTime==0) { + console.log("1"); + stTime = Date.now() // 처음 시작할 때 + }else{ + console.log("2"); + stTime += (Date.now() - endTime) // 재시작할 때 + } + timerStart = setInterval(function() { + console.log("3"); + var nowTime = new Date(Date.now() - stTime) + //console.log("nowTime: ", nowTime); + var hourNum = nowTime.getHours()-9; //UTC+9 확인 (Date.now와 new Date와 기준이 다른지 확인) + setHour(hourNum); + var minNum = nowTime.getMinutes(); + setMin(minNum); + var secNum = nowTime.getSeconds(); + setSec(secNum); + }, 1000) + }else{ + console.log("4"); + // if(timerStart) { + // console.log("5"); + clearInterval(timerStart) + endTime = Date.now() // STOP시점의 시간 저장 + // } + } + return () => clearInterval(timerStart); +},[props.watch]) + +const fullChange=() =>{ + const element = document.documentElement; + if(props.watch==='false'){ //false(멈춤) -> true(작동) 타이밍 + if(element.requestFullscreen) {console.log("element.requestFullscreen"); element.requestFullscreen();} + else if(element.mozRequestFullScreen) {element.mozRequestFullScreen(); } + else if(element.webkitRequestFullscreen) {console.log("element.webkitRequestFullscreen"); element.webkitRequestFullScreen(); } + else if(element.msRequestFullscreen) {element.msRequestFullScreen(); } + }else{ + if(document.exitFullscreen){ console.log("document.exitFullscreen"); document.exitFullscreen(); } + else if(document.mozCancleFullScreen){ document.mozCancleFullScreen(); } + else if(document.webkitExitFullscreen){ document.webkitExitFullscreen(); } + else if(document.msExitFullscreen){ document.msExitFullscreen(); } + } +} +// startOrStop(); +//},) +//hour > 9 ? hour : +//setClick(!click); + return ( + + ); +}; + +export default SimpleStopWatch; \ No newline at end of file diff --git a/src/components/manage/Attendance.js b/src/components/manage/Attendance.js index 0d418a9..7072c4c 100644 --- a/src/components/manage/Attendance.js +++ b/src/components/manage/Attendance.js @@ -42,6 +42,15 @@ const Attendance = (props) => { } } weekInfo.reverse(); + + //시작일 이전 날짜 회색 처리 + var startday = props.startdate; + var isInclude = false; + var startdate = Number(startday.slice(8,10)); + var startmonth = Number(startday.slice(5,7)); + if(weekInfo.findIndex(i => i.date == startdate) > -1 && startmonth==month){ + isInclude = true; + } var resultlist = {}; @@ -180,10 +189,10 @@ const Attendance = (props) => { }else{ var num = obj_date.indexOf(weekInfo[j].date); if(obj[num].attendance){ - attendlist[j]='O'; + attendlist[j]='X'; } else{ - attendlist[j]='X'; + attendlist[j]='O'; } } } @@ -204,6 +213,14 @@ const Attendance = (props) => { textAlign: 'center' } + const weekTabChildStyle_unact = { + width: '10%', + border: '1px solid white', + borderRadius: '0.5rem', + textAlign: 'center', + opacity: '0.4' + } + const weekTabMonthStyle = { width: '10%', textAlign: 'left', @@ -244,7 +261,7 @@ const Attendance = (props) => { const onecheckStyle = { width: '10%', paddingLeft: '9%', //간격 - paddingBottom: '2%' //세로 위치 + paddingBottom: '2%', //세로 위치 } const idStyle = { @@ -268,7 +285,7 @@ const Attendance = (props) => { console.log('return 직전 resultlist:', resultlist); //발표용 - 지우기 - // var k =1 + var k =1 // return ( @@ -278,9 +295,15 @@ const Attendance = (props) => { {month}월
changeBefore()}/>
{weekInfo&&weekInfo.map((day, index) => { + if(!isInclude || day.date >= startdate ){ return (
{day.weekday}
{day.date}
) + }else{ + return ( +
{day.weekday}
{day.date}
+ ) + } })}
changeAfter()}/>
@@ -294,22 +317,12 @@ const Attendance = (props) => { { resultlist[id].map(check => { if(check == 'O') - return(
) + return(
X
) else if(check == 'X') - return(
) - // else - // //발표용-지우기 - // if(k%3==2){ - // k+=1 - // return(
X
) - // } - // else{ - // k+=1 - // return(
O
) - // } - // //발표용-지우기 - - // return(
) + return(
O
) + else + // return(
-
) + return(
) }) }
From 70a9d918f26cee8f584e24917ccf531e057b96c5 Mon Sep 17 00:00:00 2001 From: heesoo <11junghs@gmail.com> Date: Tue, 17 May 2022 16:15:49 +0900 Subject: [PATCH 13/21] =?UTF-8?q?[5=EC=9B=94=2017=EC=9D=BC]=20UI=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AllStudy.js | 84 ++++++++++++++++-- src/components/MyStudy.js | 86 ++++++++++++++++++- src/components/auth/AuthForm.js | 5 +- src/components/auth/AuthTemplate.js | 4 +- .../common/{Button.js => Button_2.js} | 9 +- src/components/common/Header.js | 2 +- src/components/manage/PenaltyCard.js | 2 +- src/components/manage/TimeRecord.js | 12 ++- src/pages/LoginFalsePage.js | 2 +- src/pages/PostListPage.js | 2 +- src/pages/StudyCreatePage/StudyCreate.js | 2 +- src/pages/StudyRankingPage.js | 4 +- 12 files changed, 187 insertions(+), 27 deletions(-) rename src/components/common/{Button.js => Button_2.js} (82%) diff --git a/src/components/AllStudy.js b/src/components/AllStudy.js index 7572875..a6c25d5 100644 --- a/src/components/AllStudy.js +++ b/src/components/AllStudy.js @@ -3,6 +3,54 @@ import styled from 'styled-components'; import axios from 'axios'; import {Card,Button} from 'react-bootstrap'; +const Container = styled.div` + padding: 20px; +`; + +// +const Ranking_font = styled.div` + font-size: xx-large; + font-weight: bold; +`; +// + +const Date_font = styled.div` + font-size: large; + font-weight: bold; + text-align: center; +`; + +const ContentBox = styled.div` + display: flex; + gap: 0.25rem; + + align-items: center; + grid-area: content; + justify-content: center; +`; +const Content1 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: left; + width: 30%; + height: 100%; +`; +const Content2 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: left; + width: 70%; + height: 100%; + font-size: large; +`; +const Content3 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: center; + width: 0%; + height: 100%; +`; + const StudiesComp = (props) => { axios.defaults.withCredentials = true; const study = props.study; @@ -46,17 +94,39 @@ const StudiesComp = (props) => { {study.title} - 목표 시간: {study.target_time}
- 멤버 수: {study.member_number}
- 하루 벌금: {study.penalty}
- 스터디 정보: {study.info}
- 방장이름: {study.leader}
- 스터디 아이디: {study.id}
+ + 방장 + {study.leader} + + +
+ + 목표 시간 + {study.target_time} + + + + 하루 벌금 + {study.penalty} + + + + 멤버 수 + {study.member_number} + + +
+ + 스터디 정보 + {study.info} + + +
{ (study.is_recruit === true)? <> - + : null } diff --git a/src/components/MyStudy.js b/src/components/MyStudy.js index 427a478..ff80b4a 100644 --- a/src/components/MyStudy.js +++ b/src/components/MyStudy.js @@ -3,6 +3,55 @@ import { withRouter } from 'react-router'; import {createBrowserHistory} from 'history'; import axios from 'axios'; import {Card,Button} from 'react-bootstrap'; +import styled from 'styled-components'; + +const Container = styled.div` + padding: 20px; +`; + +// +const Ranking_font = styled.div` + font-size: xx-large; + font-weight: bold; +`; +// + +const Date_font = styled.div` + font-size: large; + font-weight: bold; + text-align: center; +`; + +const ContentBox = styled.div` + display: flex; + gap: 0.25rem; + + align-items: center; + grid-area: content; + justify-content: center; +`; +const Content1 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: left; + width: 30%; + height: 100%; +`; +const Content2 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: left; + width: 70%; + height: 100%; + font-size: large; +`; +const Content3 = styled.div` + padding: 0.25rem; + // background: yellow; + text-align: center; + width: 0%; + height: 100%; +`; const MyStudy = (props) => { axios.defaults.withCredentials = true; @@ -67,19 +116,48 @@ const MyStudy = (props) => { {mystudy.title} - 목표 시간: {mystudy.target_time}
+ + 방장 + {mystudy.leader} + + +
+ + 목표 시간 + {mystudy.target_time} + + + + 하루 벌금 + {mystudy.penalty} + + + + 멤버 수 + {mystudy.member_number} + + +
+ + 스터디 정보 + {mystudy.info} + + +
+ + {/* 목표 시간: {mystudy.target_time}
멤버 수: {mystudy.member_number}
하루 벌금: {mystudy.penalty}
스터디 정보: {mystudy.info}
방장이름: {mystudy.leader}
- 스터디 아이디: {mystudy.id}
+ 스터디 아이디: {mystudy.id}
*/}
{ (mystudy.is_recruit===false)? <> - +   - +   : diff --git a/src/components/auth/AuthForm.js b/src/components/auth/AuthForm.js index e1bd020..5823371 100644 --- a/src/components/auth/AuthForm.js +++ b/src/components/auth/AuthForm.js @@ -2,7 +2,7 @@ import React from 'react'; import { Link } from 'react-router-dom'; import styled from 'styled-components'; import palette from '../../lib/styles/palette'; -import Button from '../common/Button'; +import Button_2 from '../common/Button_2'; /* 회원가입, 로그인 폼을 보여주는 component */ @@ -87,7 +87,8 @@ const AuthForm = ({type,form,onChange,onSubmit}) => { value={form.passwordConfirm} /> )} - + {text} + {/* */}