File tree Expand file tree Collapse file tree 3 files changed +195
-0
lines changed Expand file tree Collapse file tree 3 files changed +195
-0
lines changed Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import {FortuneCard} from "../pages/activities/FotuneCard";
77import { SearchWord } from "../pages/activities/getDefinition" ;
88import { Jitter } from "../pages/games/Jitter" ;
99import { RandomMeme } from "../pages/activities/RandomMemes" ;
10+ import { RandomJoke } from "../pages/activities/RandomJoke" ;
1011import meme from "../assets/activities/meme.jpg"
1112import numberblocs from "../assets/numberblocks.png"
1213import wordleicon from "../assets/games/Wordle/wordlejpg.png"
@@ -40,6 +41,13 @@ export const activities = [
4041 icon : "https://www.i2symbol.com/pictures/emojis/f/2/0/4/f2042fedcbc0cdaee2967c4449b62845.png" ,
4142 urlTerm : "search-any-word" ,
4243 element : < SearchWord />
44+ } ,
45+ {
46+ title : "Random Jokes" ,
47+ description : "Get random jokes" ,
48+ icon : "https://www.troublefreepool.com/media/joke-png.127455/full" ,
49+ urlTerm : "random-jokes" ,
50+ element : < RandomJoke />
4351 }
4452] ;
4553
Original file line number Diff line number Diff line change 1+ import { useEffect , useState } from "react" ;
2+ import axios from "axios" ;
3+ import "../../styles/pages/activities/RandomJoke.css" ;
4+
5+ export const RandomJoke = ( ) => {
6+
7+ const [ joke , setJoke ] = useState ( null ) ;
8+ const [ error , setError ] = useState ( null ) ;
9+
10+ const generateJoke = ( ) => {
11+ setJoke ( null ) ;
12+ axios ( {
13+ method : "GET" ,
14+ url : "https://v2.jokeapi.dev/joke/Any" ,
15+ } )
16+ . then ( ( res ) => setJoke ( res . data ) )
17+ . catch ( ( error ) => setError ( error ) ) ;
18+ } ;
19+
20+ useEffect ( ( ) => {
21+ generateJoke ( ) ;
22+ } , [ ] ) ;
23+
24+ return (
25+ < div className = "root" >
26+ < h1 class = "header" > Random Joke Generator</ h1 >
27+ < div class = "description" >
28+ Generate any random joke to get some laugh!
29+ </ div >
30+ { joke && (
31+
32+ < div className = "content" >
33+ { joke . type === "single" ? (
34+ < div > { joke . joke } </ div >
35+ ) : (
36+ < div >
37+ < div > { joke . setup } </ div >
38+ < div > { joke . delivery } </ div >
39+ </ div >
40+ ) }
41+ </ div >
42+
43+ ) }
44+ { error && (
45+ < div className = "content error" > { error . message } </ div >
46+ ) }
47+ { ! joke && ! error && (
48+ < div className = "spinner-wrapper" >
49+ < div className = "spinner" > </ div >
50+ </ div >
51+ ) }
52+ < button className = "button" onClick = { generateJoke } >
53+ Generate Joke
54+ </ button >
55+ </ div >
56+ ) ;
57+ } ;
Original file line number Diff line number Diff line change 1+ .root {
2+ margin-top : 25px ;
3+ font-family : "Fira Code Light" ;
4+ }
5+ .header {
6+ font-size : 2rem ;
7+ margin-bottom : 5px ;
8+ }
9+ .description {
10+ font-size : 1.2rem ;
11+ font-weight : 300 ;
12+ font-style : italic;
13+ }
14+
15+ .content {
16+ font-style : italic;
17+ padding : 15px 10px ;
18+ background : white;
19+ margin : auto;
20+ border : 1px solid # 4b4b4b ;
21+ width : 80vw ;
22+ max-width : 800px ;
23+ margin-top : 50px ;
24+ margin-bottom : 20px ;
25+ border-radius : 15px ;
26+ box-shadow : 2px 2px 5px # 4b4b4b ;
27+ padding-left : 20px ;
28+ animation : quote-appeared 0.5s ease;
29+ }
30+
31+
32+ @keyframes quote-appeared {
33+ 0% {
34+ opacity : 0.5 ;
35+ }
36+ 100% {
37+ opacity : 1 ;
38+ }
39+ }
40+
41+ content : hover {
42+ background : # f1f1f1 ;
43+ }
44+
45+ .joke {
46+ margin : 10px ;
47+ text-align : left;
48+ font-size : 1.8rem ;
49+ line-height : 2.2rem ;
50+ font-style : normal;
51+ animation : fade 0.3s ease;
52+ }
53+
54+ @keyframes fade {
55+ 0% {
56+ opacity : 0.5 ;
57+ }
58+ 100% {
59+ opacity : 1 ;
60+ }
61+ }
62+
63+ .error {
64+ color : red;
65+ font-size : 1.8rem ;
66+ padding : 40px 0 ;
67+ font-style : oblique;
68+ }
69+
70+
71+ @keyframes slide-left {
72+ 0% {
73+ transform : translateX (4% );
74+ opacity : 20% ;
75+ }
76+ 100% {
77+ transform : translateX (0% );
78+ opacity : 100% ;
79+ }
80+ }
81+
82+ .button {
83+ font-size : 1.2rem ;
84+ background : white;
85+ border-radius : 5px ;
86+ padding : 20px ;
87+ border : 1px solid # 4b4b4b ;
88+ box-shadow : 1px 1px 3px # 4b4b4b ;
89+ margin : 10px auto;
90+ margin-top : 30px ;
91+ transition-duration : 300ms ;
92+ }
93+
94+ .button : hover {
95+ cursor : pointer;
96+ background : black;
97+ color : white;
98+ transform : scale (1.1 );
99+ }
100+
101+ .spinner-wrapper {
102+ margin : auto;
103+ width : 100px ;
104+ display : flex;
105+ align-items : center;
106+ justify-content : center;
107+ max-height : 200px ;
108+ height : 200px ;
109+ margin-top : 10px ;
110+ margin-bottom : 10px ;
111+ }
112+
113+ .spinner {
114+ border : 6px solid # f3f3f3 ;
115+ border-top : 6px solid # 3498db ;
116+ border-radius : 50% ;
117+ width : 50px ;
118+ height : 50px ;
119+ margin : auto;
120+ animation : spin 2s linear infinite;
121+ }
122+
123+ @keyframes spin {
124+ 0% {
125+ transform : rotate (0deg );
126+ }
127+ 100% {
128+ transform : rotate (360deg );
129+ }
130+ }
You can’t perform that action at this time.
0 commit comments