Skip to content

Commit a6cd942

Browse files
committed
Clean up modal logic
1 parent 2f30f5d commit a6cd942

4 files changed

Lines changed: 29 additions & 32 deletions

File tree

src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { GameStateContext, type GameState } from "./hooks/useGameStateContext";
88
import { defaultSettings, SettingsContext, type Settings } from "./hooks/useSettingsContext";
99
import generateTiles from "./utils/generateTiles";
1010

11-
const version = "1.0.9";
11+
const version = "1.0.10";
1212

1313
function App() {
1414
const settingsOnLoad: Settings = { ...defaultSettings };

src/components/aboutModal/AboutModal.tsx

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
1-
import { useEffect, useRef, type Dispatch } from "react";
1+
import { RefObject } from "react";
22
import styles from "./AboutModal.module.css";
33

4-
export default function AboutModal({ shown, setShown }: { shown: boolean; setShown: Dispatch<boolean> }) {
5-
const dialogRef = useRef<HTMLDialogElement | null>(null);
6-
7-
useEffect(() => {
8-
if (shown) {
9-
dialogRef.current?.removeAttribute("open");
10-
dialogRef.current?.showModal();
11-
} else dialogRef.current?.close();
12-
}, [shown]);
4+
export default function AboutModal({ aboutModalRef }: { aboutModalRef: RefObject<HTMLDialogElement | null> }) {
5+
const indicateAboutModalHasBeenSeen = () => {
6+
localStorage.setItem("showAboutModal", "false");
7+
};
138

149
return (
15-
<dialog ref={dialogRef} className={styles.dialog}>
10+
// @ts-ignore since closedby is not recognized by TS yet
11+
<dialog ref={aboutModalRef} className={styles.dialog} closedby="any" onClose={indicateAboutModalHasBeenSeen}>
1612
<header>
1713
<p>Welcome to</p>
1814
<h1>RuneSweeper</h1>
@@ -37,8 +33,8 @@ export default function AboutModal({ shown, setShown }: { shown: boolean; setSho
3733
<button
3834
className={styles.start}
3935
onClick={() => {
40-
localStorage.setItem("showAboutModal", "false");
41-
setShown(false);
36+
indicateAboutModalHasBeenSeen();
37+
aboutModalRef.current?.close();
4238
}}
4339
>
4440
Play

src/components/header/Header.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useState } from "react";
1+
import { useEffect, useRef } from "react";
22
import { useGameStateContext } from "../../hooks/useGameStateContext";
33
import { useSettingsContext } from "../../hooks/useSettingsContext";
44
import generateTiles from "../../utils/generateTiles";
@@ -9,13 +9,19 @@ import Timer from "../timer/Timer";
99
import styles from "./Header.module.css";
1010

1111
export default function Header() {
12-
const [settingsModalShown, setSettingsModalShown] = useState(false);
13-
const [aboutModalShown, setAboutModalShown] = useState(localStorage.getItem("showAboutModal") ? false : true);
12+
const aboutModalRef = useRef<HTMLDialogElement>(null);
13+
const settingsModalRef = useRef<HTMLDialogElement>(null);
14+
1415
const { gameState, setGameState } = useGameStateContext();
1516
const { settings } = useSettingsContext();
1617

1718
const { status } = gameState;
1819

20+
useEffect(() => {
21+
const hasSeenAbout = localStorage.getItem("showAboutModal");
22+
if (!hasSeenAbout) aboutModalRef.current?.showModal();
23+
}, []);
24+
1925
// Reset to pre-game state
2026
function reset() {
2127
setGameState({
@@ -39,17 +45,17 @@ export default function Header() {
3945
<MineCounter />
4046
) : (
4147
<>
42-
<button onClick={() => setAboutModalShown(true)}>
48+
<button onClick={() => aboutModalRef.current?.showModal()}>
4349
<img src="./images/info.png" />
4450
</button>
45-
<button onClick={() => setSettingsModalShown(true)}>
51+
<button onClick={() => settingsModalRef.current?.showModal()}>
4652
<img src="./images/settings.png" />
4753
</button>
4854
</>
4955
)}
5056
</div>
51-
<SettingsModal shown={settingsModalShown} setShown={setSettingsModalShown} />
52-
<AboutModal shown={aboutModalShown} setShown={setAboutModalShown} />
57+
<SettingsModal settingsModalRef={settingsModalRef} />
58+
<AboutModal aboutModalRef={aboutModalRef} />
5359
</header>
5460
);
5561
}

src/components/settingsModal/SettingsModal.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
1-
import { useRef, useEffect, type Dispatch } from "react";
1+
import { RefObject } from "react";
22
import { type Settings, useSettingsContext } from "../../hooks/useSettingsContext";
3+
import { controlsDict, difficultiesDict, sizesDict } from "../../utils/settings";
34
import styles from "./SettingsModal.module.css";
4-
import { sizesDict, difficultiesDict, controlsDict } from "../../utils/settings";
55

6-
export default function SettingsModal({ shown, setShown }: { shown: boolean; setShown: Dispatch<boolean> }) {
7-
const dialogRef = useRef<HTMLDialogElement | null>(null);
6+
export default function SettingsModal({ settingsModalRef }: { settingsModalRef: RefObject<HTMLDialogElement | null> }) {
87
const { settings, setSettings } = useSettingsContext();
98

109
const { numOfColumns, numOfRows } = settings;
1110
const numOfTiles = numOfColumns * numOfRows;
1211

13-
useEffect(() => {
14-
if (shown) dialogRef.current?.showModal();
15-
else dialogRef.current?.close();
16-
}, [shown]);
17-
1812
function handleChangeSize(w: number, h: number) {
1913
localStorage.setItem("numOfColumns", `${w}`);
2014
localStorage.setItem("numOfRows", `${h}`);
@@ -32,10 +26,11 @@ export default function SettingsModal({ shown, setShown }: { shown: boolean; set
3226
}
3327

3428
return (
35-
<dialog ref={dialogRef} className={styles.dialog}>
29+
// @ts-ignore since closedby is not recognized by TS yet
30+
<dialog ref={settingsModalRef} className={styles.dialog} closedBy="any">
3631
<header>
3732
<h1>Settings</h1>
38-
<button onClick={() => setShown(false)} className="icon">
33+
<button onClick={() => settingsModalRef.current?.close()} className="icon">
3934
<img src="./images/close.png" />
4035
</button>
4136
</header>

0 commit comments

Comments
 (0)