+++ public/contents/afternoon.mp3
Binary file is not shown |
+++ public/contents/afternoon.webp
Binary file is not shown |
+++ public/contents/apple.mp3
Binary file is not shown |
+++ public/contents/apple.png
Binary file is not shown |
+++ public/contents/bad.mp3
Binary file is not shown |
+++ public/contents/bad.png
Binary file is not shown |
+++ public/contents/cow.png
Binary file is not shown |
+++ public/contents/cut1.png
Binary file is not shown |
+++ public/contents/cut2.png
Binary file is not shown |
+++ public/contents/cut3.png
Binary file is not shown |
+++ public/contents/cut4.png
Binary file is not shown |
+++ public/contents/cut5.png
Binary file is not shown |
+++ public/contents/cut6.png
Binary file is not shown |
+++ public/contents/cut7.png
Binary file is not shown |
+++ public/contents/cut8.png
Binary file is not shown |
+++ public/contents/daddy.png
Binary file is not shown |
+++ public/contents/evening.mp3
Binary file is not shown |
+++ public/contents/evening.webp
Binary file is not shown |
+++ public/contents/gingerbreadman.mp3
Binary file is not shown |
+++ public/contents/gingerbreadman.png
Binary file is not shown |
+++ public/contents/good.mp3
Binary file is not shown |
+++ public/contents/good.png
Binary file is not shown |
+++ public/contents/goodmorning.mp3
Binary file is not shown |
+++ public/contents/goodmorningmom.mp3
Binary file is not shown |
+++ public/contents/grape.mp3
Binary file is not shown |
+++ public/contents/grape.png
Binary file is not shown |
+++ public/contents/iambad.mp3
Binary file is not shown |
+++ public/contents/iamsogood.mp3
Binary file is not shown |
+++ public/contents/mommy.png
Binary file is not shown |
+++ public/contents/morning.mp3
Binary file is not shown |
+++ public/contents/morning.webp
Binary file is not shown |
+++ public/contents/old.png
Binary file is not shown |
+++ public/contents/rain.png
Binary file is not shown |
+++ public/contents/rain1.mp3
Binary file is not shown |
+++ public/contents/rain2.mp3
Binary file is not shown |
+++ public/contents/rain3.mp3
Binary file is not shown |
+++ public/contents/rain4.mp3
Binary file is not shown |
+++ public/contents/song1.mp3
Binary file is not shown |
+++ public/contents/song2.mp3
Binary file is not shown |
+++ public/contents/song3.mp3
Binary file is not shown |
+++ public/contents/song4.mp3
Binary file is not shown |
+++ public/contents/thecow.mp3
Binary file is not shown |
+++ public/contents/thegingerbreadman.mp3
Binary file is not shown |
--- src/components/contents/wordBundle/WordBundleBasicLearning.jsx
+++ src/components/contents/wordBundle/WordBundleBasicLearning.jsx
... | ... | @@ -1,7 +1,19 @@ |
1 |
-import React, { useEffect } from "react"; |
|
1 |
+import React, { useState } from "react"; |
|
2 | 2 |
import "./WordBundleBasicLearning.css"; |
3 | 3 |
|
4 | 4 |
const WordBundleBasicLearning = ({ contents }) => { |
5 |
+ const [isPlaying, setIsPlaying] = useState(false); |
|
6 |
+ |
|
7 |
+ const toggleAudio = () => { |
|
8 |
+ const audio = document.getElementById("song-audio"); |
|
9 |
+ if (isPlaying) { |
|
10 |
+ audio.pause(); |
|
11 |
+ } else { |
|
12 |
+ audio.play(); |
|
13 |
+ } |
|
14 |
+ setIsPlaying(!isPlaying); |
|
15 |
+ }; |
|
16 |
+ |
|
5 | 17 |
if (!contents) { |
6 | 18 |
return <div>Loading...</div>; |
7 | 19 |
} |
... | ... | @@ -11,12 +23,16 @@ |
11 | 23 |
src={contents.image} |
12 | 24 |
alt="이미지" |
13 | 25 |
className="wordBundle-basic-learning-img" |
26 |
+ onClick={toggleAudio} |
|
14 | 27 |
/> |
15 | 28 |
|
16 | 29 |
<div className="wordBundle-basic-learning-word"> |
17 | 30 |
<h1>{contents.word}</h1> |
18 | 31 |
<h3>{contents.wordMeaning}</h3> |
19 | 32 |
</div> |
33 |
+ <audio id="song-audio" controls style={{ display: "none" }}> |
|
34 |
+ <source src={contents.file} type="audio/mpeg" /> |
|
35 |
+ </audio> |
|
20 | 36 |
</> |
21 | 37 |
); |
22 | 38 |
}; |
--- src/components/contents/wordBundle/WordBundleDeepLearning.jsx
+++ src/components/contents/wordBundle/WordBundleDeepLearning.jsx
... | ... | @@ -1,7 +1,20 @@ |
1 |
-import React from "react"; |
|
1 |
+import React, { useState } from "react"; |
|
2 | 2 |
import "./WordBundleDeepLearning.css"; |
3 | 3 |
|
4 | 4 |
const WordBundleDeepLearning = ({ contents }) => { |
5 |
+ const [isPlaying, setIsPlaying] = useState(false); |
|
6 |
+ |
|
7 |
+ const toggleAudio = () => { |
|
8 |
+ const audio = document.getElementById("song-audio"); |
|
9 |
+ if (isPlaying) { |
|
10 |
+ audio.pause(); |
|
11 |
+ } else { |
|
12 |
+ audio.play(); |
|
13 |
+ } |
|
14 |
+ setIsPlaying(!isPlaying); |
|
15 |
+ }; |
|
16 |
+ |
|
17 |
+ |
|
5 | 18 |
if (!contents) { |
6 | 19 |
return <div>Loading...</div>; |
7 | 20 |
} |
... | ... | @@ -11,12 +24,17 @@ |
11 | 24 |
src={contents.image} |
12 | 25 |
alt="이미지" |
13 | 26 |
className="wordBundle-basic-learning-img" |
27 |
+ onClick={toggleAudio} |
|
14 | 28 |
/> |
15 | 29 |
|
16 | 30 |
<div className="wordBundle-basic-learning-word"> |
17 | 31 |
<h1>{contents.sentence}</h1> |
18 | 32 |
<h3>{contents.sentence_meaning}</h3> |
19 | 33 |
</div> |
34 |
+ <audio id="song-audio" controls style={{ display: "none" }}> |
|
35 |
+ <source src={contents.sentence_file} type="audio/mpeg" /> |
|
36 |
+ </audio> |
|
37 |
+ |
|
20 | 38 |
</> |
21 | 39 |
); |
22 | 40 |
}; |
--- src/components/lessons/lesson1.jsx
+++ src/components/lessons/lesson1.jsx
... | ... | @@ -8,6 +8,7 @@ |
8 | 8 |
const [planetStep, setPlanetStep] = useState(0); |
9 | 9 |
const [cookies1, setCookie1] = useCookies(["username"]); |
10 | 10 |
const [recom, setRecom] = useState([]); |
11 |
+ const [ment, setMent] = useState([""]); |
|
11 | 12 |
const navigate = useNavigate(); |
12 | 13 |
useEffect(() => { |
13 | 14 |
console.log("mainStep" + mainStep); |
... | ... | @@ -292,6 +293,11 @@ |
292 | 293 |
</li> |
293 | 294 |
</ul> |
294 | 295 |
</div> |
296 |
+ <div className="lession"> |
|
297 |
+ <h2 className="lesson-h2"> |
|
298 |
+ <mark>{ment}</mark> |
|
299 |
+ </h2> |
|
300 |
+ </div> |
|
295 | 301 |
</div> |
296 | 302 |
); |
297 | 303 |
}; |
--- src/pages/main/mainp.jsx
+++ src/pages/main/mainp.jsx
... | ... | @@ -73,7 +73,7 @@ |
73 | 73 |
|
74 | 74 |
// 사용자 입력을 저장할 state 초기화 |
75 | 75 |
const [comment, setComment] = useState( |
76 |
- "어서와~ 꿈 속 우주공간은 처음이지? 여행하고 싶은 행성을 골라봐~" |
|
76 |
+ "AI 학습 도우미가 너의 학습 이력을 분석해 추천 컨텐츠를 알아냈어! \n 추천별★를 확인해봐!" |
|
77 | 77 |
); |
78 | 78 |
useEffect(() => { |
79 | 79 |
const fetchData = async () => { |
... | ... | @@ -82,7 +82,9 @@ |
82 | 82 |
withCredentials: true, |
83 | 83 |
}); |
84 | 84 |
console.log(response); |
85 |
- setComment(response.data.data.comment); |
|
85 |
+ if(response.data.data.comment){ |
|
86 |
+ setComment(response.data.data.comment); |
|
87 |
+ } |
|
86 | 88 |
} catch (error) { |
87 | 89 |
console.error("Error fetching data:", error); |
88 | 90 |
} |
--- src/pages/signup/SignUpPage.jsx
+++ src/pages/signup/SignUpPage.jsx
... | ... | @@ -70,12 +70,7 @@ |
70 | 70 |
onChange={(e) => setGrade(e.target.value)} |
71 | 71 |
className="signup-select" |
72 | 72 |
> |
73 |
- <option value="1">1학년</option> |
|
74 |
- <option value="2">2학년</option> |
|
75 |
- <option value="3">3학년</option> |
|
76 | 73 |
<option value="4">4학년</option> |
77 |
- <option value="5">5학년</option> |
|
78 |
- <option value="6">6학년</option> |
|
79 | 74 |
</select> |
80 | 75 |
<div className="signup-label">성별</div> |
81 | 76 |
<input |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?