Skip to content

Commit fea3113

Browse files
committed
Improve code readibility
1 parent 651eb7f commit fea3113

13 files changed

+511
-547
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"eslint-plugin-prettier": "4.0.0",
3737
"eslint-plugin-react-hooks": "4.3.0",
3838
"nano-staged": "0.5.0",
39-
"preact-cli": "3.3.3",
39+
"preact-cli": "3.3.4",
4040
"prettier": "2.5.1",
4141
"simple-git-hooks": "2.7.0",
4242
"sirv-cli": "2.0.2"

src/components/Board.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import cls from "classnames";
2+
import { useContext } from "preact/hooks";
23

3-
const Tile = ({ value, isAnswered, isCorrect, isExact }) => {
4+
import { GameContext } from "../game/provider";
5+
6+
export const Tile = ({ value, isAnswered, isCorrect, isExact }) => {
47
return (
58
<span
69
class={cls("board__tile", {
@@ -15,7 +18,9 @@ const Tile = ({ value, isAnswered, isCorrect, isExact }) => {
1518
);
1619
};
1720

18-
const Board = ({ answers, guess, chance, tips }) => {
21+
export const Board = () => {
22+
const { answers, guess, chance, tips } = useContext(GameContext);
23+
1924
return (
2025
<div class="board">
2126
{answers.map((answer, i) => {
@@ -57,5 +62,3 @@ const Board = ({ answers, guess, chance, tips }) => {
5762
</div>
5863
);
5964
};
60-
61-
export default Board;

src/components/Game.js

-42
This file was deleted.

src/components/Header.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { useContext } from "preact/hooks";
2+
3+
import { GameContext } from "../game/provider";
4+
5+
export const Header = () => {
6+
const { gameover, untilNextWord } = useContext(GameContext);
7+
8+
return (
9+
<div class="header">
10+
<h1>Қазақша Wordle!</h1>
11+
{gameover && <small>Келесі сөзге дейін {untilNextWord}</small>}
12+
<hr />
13+
</div>
14+
);
15+
};

src/components/Keyboard.js

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
import cls from "classnames";
2-
import { useCallback } from "preact/hooks";
2+
import { useCallback, useContext } from "preact/hooks";
33

4-
const Key = ({ value, label, onClick, isAnswered, isCorrect, isExact }) => (
4+
import keys from "../constants/keys.json";
5+
6+
import { GameContext } from "../game/provider";
7+
8+
export const Key = ({
9+
value,
10+
label,
11+
onClick,
12+
isAnswered,
13+
isCorrect,
14+
isExact,
15+
}) => (
516
<button
617
id={value}
718
class={cls("keyboard__key", {
@@ -17,7 +28,10 @@ const Key = ({ value, label, onClick, isAnswered, isCorrect, isExact }) => (
1728
</button>
1829
);
1930

20-
const Keyboard = ({ onLetter, onRemove, onEnter, keys, keyTips }) => {
31+
export const Keyboard = () => {
32+
const { gameover, keyTips, onLetter, onRemove, onEnter } =
33+
useContext(GameContext);
34+
2135
const handleClick = useCallback(
2236
(e) => {
2337
switch (e.target.id) {
@@ -34,6 +48,10 @@ const Keyboard = ({ onLetter, onRemove, onEnter, keys, keyTips }) => {
3448
[onEnter, onRemove, onLetter]
3549
);
3650

51+
if (gameover) {
52+
return null;
53+
}
54+
3755
return (
3856
<div class="keyboard">
3957
{keys.map((row, index) => (
@@ -54,5 +72,3 @@ const Keyboard = ({ onLetter, onRemove, onEnter, keys, keyTips }) => {
5472
</div>
5573
);
5674
};
57-
58-
export default Keyboard;

src/components/Toast.js

+5-22
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,12 @@
11
import cls from "classnames";
2-
import { createContext } from "preact";
3-
import { useState } from "preact/hooks";
2+
import { useContext } from "preact/hooks";
43

5-
export const ToastContext = createContext({ setToast: () => {} });
4+
import { GameContext } from "../game/provider";
65

7-
const Toast = ({ children }) => {
8-
const [showToast, setShowToast] = useState(false);
9-
const [toastMessage, setToastMessage] = useState("");
10-
11-
const setToast = (message) => {
12-
setShowToast(true);
13-
setToastMessage(message);
14-
15-
setTimeout(() => {
16-
setShowToast(false);
17-
setToastMessage("");
18-
}, 3000);
19-
};
6+
export const Toast = () => {
7+
const { showToast, toastMessage } = useContext(GameContext);
208

219
return (
22-
<ToastContext.Provider value={{ setToast }}>
23-
<div className={cls("toast", { show: showToast })}>{toastMessage}</div>
24-
{children}
25-
</ToastContext.Provider>
10+
<div className={cls("toast", { show: showToast })}>{toastMessage}</div>
2611
);
2712
};
28-
29-
export default Toast;
File renamed without changes.
File renamed without changes.

src/hooks.js src/game/hooks.js

+33-14
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
import { useContext, useEffect, useLayoutEffect, useState } from "preact/hooks";
1+
import { useEffect, useLayoutEffect, useState } from "preact/hooks";
22

3-
import words from "./words.json";
4-
5-
import { ToastContext } from "./components/Toast";
3+
import words from "../constants/words.json";
64

75
export const timestamp = 1642628391000;
86
export const todayWord = words[Math.floor((Date.now() - timestamp) / 86400000)];
@@ -14,8 +12,25 @@ const initialTips = [[], [], [], [], [], []];
1412
const initialChance = initialAnswers.findIndex((answer) => answer === "") || 0;
1513
const initialGameover = window.localStorage.getItem("wordle") === todayWord;
1614

15+
const useToast = () => {
16+
const [showToast, setShowToast] = useState(false);
17+
const [toastMessage, setToastMessage] = useState("");
18+
19+
const setToast = (message) => {
20+
setShowToast(true);
21+
setToastMessage(message);
22+
23+
setTimeout(() => {
24+
setShowToast(false);
25+
}, 3000);
26+
};
27+
28+
return { showToast, toastMessage, setToast };
29+
};
30+
1731
export const useGame = () => {
18-
const { setToast } = useContext(ToastContext);
32+
const { showToast, toastMessage, setToast } = useToast();
33+
1934
const [answers, setAnswers] = useState(initialAnswers);
2035
const [tips, setTips] = useState(initialTips);
2136
const [keyTips, setKeyTips] = useState({});
@@ -72,27 +87,27 @@ export const useGame = () => {
7287
}
7388
}, [gameover]);
7489

75-
const handleGameover = () => {
90+
const onGameover = () => {
7691
setGameover(true);
7792
window.localStorage.setItem("wordle", todayWord);
7893
};
7994

80-
const handleLetter = (letter) => {
95+
const onLetter = (letter) => {
8196
if (guess.length < 5) {
8297
setGuess(guess + letter);
8398
}
8499
};
85100

86-
const handleRemove = () => {
101+
const onRemove = () => {
87102
if (guess.length > 0) {
88103
setGuess(guess.slice(0, -1));
89104
}
90105
};
91106

92-
const handleEnter = () => {
107+
const onEnter = () => {
93108
if (!gameover) {
94109
if (guess === todayWord) {
95-
handleGameover();
110+
onGameover();
96111
setToast("Жарайсын! Кешірек келсең жаңа сөз пайда болады");
97112
}
98113

@@ -114,21 +129,25 @@ export const useGame = () => {
114129
}
115130
}
116131
if (chance === 5) {
117-
handleGameover();
132+
onGameover();
118133
setToast("Келесі рет сәті түсер");
119134
}
120135
};
121136

122137
return {
138+
showToast,
139+
toastMessage,
140+
setToast,
141+
123142
answers,
124143
guess,
125144
chance,
126145
gameover,
127146
untilNextWord,
128147
tips,
129148
keyTips,
130-
handleLetter,
131-
handleRemove,
132-
handleEnter,
149+
onLetter,
150+
onRemove,
151+
onEnter,
133152
};
134153
};

src/game/provider.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { createContext } from "preact";
2+
3+
import { useGame } from "./hooks";
4+
5+
export const GameContext = createContext({
6+
setToast: () => {},
7+
showToast: false,
8+
toastMessage: "",
9+
10+
answers: [],
11+
guess: "",
12+
chance: 0,
13+
gameover: false,
14+
untilNextWord: "",
15+
tips: [],
16+
keyTips: {},
17+
onLetter: () => {},
18+
onRemove: () => {},
19+
onEnter: () => {},
20+
});
21+
22+
export const GameProvider = ({ children }) => {
23+
const {
24+
setToast,
25+
showToast,
26+
toastMessage,
27+
answers,
28+
guess,
29+
chance,
30+
gameover,
31+
untilNextWord,
32+
tips,
33+
keyTips,
34+
onLetter,
35+
onRemove,
36+
onEnter,
37+
} = useGame();
38+
39+
return (
40+
<GameContext.Provider
41+
value={{
42+
setToast,
43+
showToast,
44+
toastMessage,
45+
answers,
46+
guess,
47+
chance,
48+
gameover,
49+
untilNextWord,
50+
tips,
51+
keyTips,
52+
onLetter,
53+
onRemove,
54+
onEnter,
55+
}}
56+
>
57+
{children}
58+
</GameContext.Provider>
59+
);
60+
};

src/index.js

+14-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import "./style";
22

3-
import Game from "./components/Game";
4-
import Toast from "./components/Toast";
3+
import { GameProvider } from "./game/provider";
4+
5+
import { Toast } from "./components/Toast";
6+
import { Board } from "./components/Board";
7+
import { Keyboard } from "./components/Keyboard";
8+
import { Header } from "./components/Header";
59

610
export default function App() {
711
return (
8-
<div class="wordle">
9-
<Toast>
10-
<Game />
11-
</Toast>
12-
</div>
12+
<GameProvider>
13+
<div class="wordle">
14+
<Toast />
15+
<Header />
16+
<Board />
17+
<Keyboard />
18+
</div>
19+
</GameProvider>
1320
);
1421
}

src/template.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<meta name="viewport" content="width=device-width,initial-scale=1">
77
<meta name="mobile-web-app-capable" content="yes">
88
<meta name="apple-mobile-web-app-capable" content="yes">
9-
<link rel="apple-touch-icon" href="/assets/icons/apple-touch-icon.png">
9+
<link rel="apple-touch-icon" href="/assets/icon.png">
1010
<% preact.headEnd %>
1111
</head>
1212
<body>

0 commit comments

Comments
 (0)