Skip to content

Commit 625a7fc

Browse files
committed
refactor: typed event names
1 parent b371827 commit 625a7fc

3 files changed

Lines changed: 59 additions & 68 deletions

File tree

src/iframe/life-game.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
"
1414
>
1515
<table id="game-board" style="border-collapse: collapse"></table>
16-
<script src="./life-game.js"></script>
16+
<script>
17+
"@JAVASCRIPT@";
18+
</script>
1719
</body>
1820
</html>

src/iframe/life-game.js

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ function isNextAlive(around, self) {
2828
//Boardの初期化
2929
let board = Array.from({ length: boardSize }, () => Array.from({ length: boardSize }, () => false));
3030
const table = document.getElementById("game-board");
31-
table.style.borderCollapse = "collapse";
3231
function renderBoard() {
3332
//盤面をBoardに従って変更する関数(Boardを変更したら必ず実行する)
3433
table.innerHTML = "";
@@ -116,12 +115,12 @@ function progressBoard() {
116115
renderBoard();
117116
}
118117

119-
const resetTimer = () => {
118+
function resetTimer() {
120119
if (timer !== "stop") {
121120
timer = "stop";
122121
clearInterval(timerId);
123122
}
124-
};
123+
}
125124

126125
//イベント
127126

@@ -134,12 +133,7 @@ on.pause = () => {
134133
resetTimer();
135134
};
136135

137-
on.resize = (newBoardSize) => {
138-
boardSize = newBoardSize;
139-
};
140-
141-
on.sizechange = (newSizenum) => {
142-
const newSize = parseInt(newSizenum, 10);
136+
on.board_resize = (newSize) => {
143137
boardSize = newSize;
144138
cellSize = Math.floor(DEFAULT_CELL_SIZE * (DEFAULT_BOARD_SIZE / newSize));
145139
board = Array.from({ length: boardSize }, () => Array.from({ length: boardSize }, () => false));
@@ -148,15 +142,15 @@ on.sizechange = (newSizenum) => {
148142
resetTimer();
149143
};
150144

151-
on.boardreset = () => {
145+
on.board_reset = () => {
152146
//すべて白にBoardを変更
153147
board = Array.from({ length: boardSize }, () => Array.from({ length: boardSize }, () => false));
154148
renderBoard();
155149
generationChange(0);
156150
resetTimer();
157151
};
158152

159-
on.boardrandom = () => {
153+
on.board_randomize = () => {
160154
//白黒ランダムにBoardを変更
161155
board = Array.from({ length: boardSize }, () =>
162156
Array.from({ length: boardSize }, () => Math.random() > 0.5),
@@ -174,10 +168,10 @@ on.timer_change = (ms) => {
174168
}
175169
};
176170

177-
on.requestSync = () => {
171+
on.request_sync = () => {
178172
window.parent.postMessage(
179173
{
180-
type: "Sync",
174+
type: "sync",
181175
data: {
182176
generationFigure: generationFigure,
183177
boardSize: boardSize,
@@ -188,16 +182,14 @@ on.requestSync = () => {
188182
console.log("generationFigure:", generationFigure, "boardSize:", boardSize);
189183
};
190184

191-
on.placetemplate = (newBoard) => {
185+
on.place_template = (newBoard) => {
192186
board = newBoard;
193187
renderBoard();
194188
generationChange(0);
195189
resetTimer();
196190
stop();
197191
};
198192

199-
on.sizechange(boardSize);
200-
201193
on.save_board = async () => {
202194
window.parent.postMessage({ type: "save_board", data: board }, "*");
203195
};

src/routes/+page.svelte

Lines changed: 48 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
<script lang="ts">
2+
import { onMount } from "svelte";
3+
import event from "@/iframe/event.js?raw";
24
import lifeGameHTML from "@/iframe/life-game.html?raw";
35
import lifeGameJS from "@/iframe/life-game.js?raw";
4-
import event from "@/iframe/event.js?raw";
5-
6-
import * as icons from "$lib/icons/index.ts";
76
import patterns from "$lib/board-templates";
8-
import { onMount } from "svelte";
7+
import * as icons from "$lib/icons/index.ts";
98
import { loadBoard, saveBoard } from "./api.ts";
109
11-
let editingcode = $state(lifeGameJS);
10+
let editingCode = $state(lifeGameJS);
1211
let appliedCode = $state(lifeGameJS);
1312
14-
let previewDoc = $derived(
15-
lifeGameHTML.replace(
16-
/<script src="\.\/life-game\.js"><\/script>/,
17-
`<script>
18-
\n${event}\n
19-
\n${appliedCode}\n
20-
<\/script>`,
21-
),
22-
);
13+
const previewDoc = $derived(lifeGameHTML.replace('"@JAVASCRIPT@";', `${event}\n${appliedCode}`));
2314
2415
let showEditor = $state(true);
2516
let preview_iframe: HTMLIFrameElement | undefined = $state();
@@ -36,44 +27,50 @@
3627
let saveState: SaveState = $state({ saving: false });
3728
let boardNameInput = $state("");
3829
39-
onMount(() => {
40-
const handleMessage = (event: MessageEvent) => {
41-
if (event.data.type === "generation_change") {
42-
generationFigure = event.data.data;
43-
}
44-
if (event.data.type === "Sync") {
45-
generationFigure = event.data.data.generationFigure;
46-
sizeValue = event.data.data.boardSize;
47-
}
48-
};
30+
type OngoingEvent =
31+
| "play"
32+
| "pause"
33+
| "state_update"
34+
| "timer_change"
35+
| "board_reset"
36+
| "board_randomize"
37+
| "place_template"
38+
| "save_board"
39+
| "apply_board"
40+
| "request_sync"
41+
// unused events
42+
| "board_resize";
43+
44+
type IncomingEvent = "generation_change" | "sync" | "save_board";
45+
46+
function handleMessage(event: MessageEvent<{ type: IncomingEvent; data: unknown }>) {
47+
switch (event.data.type) {
48+
case "generation_change":
49+
generationFigure = event.data.data as number;
50+
break;
51+
case "sync":
52+
const data = event.data.data as { generationFigure: number; boardSize: number };
53+
generationFigure = data.generationFigure;
54+
sizeValue = data.boardSize;
55+
break;
56+
case "save_board":
57+
saveState = { saving: true, boardData: event.data.data as boolean[][] };
58+
boardNameInput = "";
59+
break;
60+
}
61+
}
4962
63+
onMount(() => {
5064
window.addEventListener("message", handleMessage);
51-
5265
return () => {
5366
window.removeEventListener("message", handleMessage);
5467
};
5568
});
5669
57-
function sendEvent(event: string, message?: unknown) {
70+
function sendEvent(event: OngoingEvent, message?: unknown) {
5871
preview_iframe?.contentWindow?.postMessage({ type: event, data: message }, "*");
5972
}
6073
61-
onMount(() => {
62-
const handler = async (event: MessageEvent<unknown>) => {
63-
const data = event.data as
64-
| { type: "unknown event" }
65-
| { type: "save_board"; data: boolean[][] };
66-
if (data.type === "save_board") {
67-
saveState = { saving: true, boardData: data.data };
68-
boardNameInput = "";
69-
return;
70-
}
71-
};
72-
73-
window.addEventListener("message", handler);
74-
return () => window.removeEventListener("message", handler);
75-
});
76-
7774
async function handleSave() {
7875
if (!saveState.saving) return;
7976
@@ -142,7 +139,7 @@
142139
<button
143140
class="btn overflow-hidden p-0 w-24 h-24"
144141
onclick={() => {
145-
sendEvent("requestSync");
142+
sendEvent("request_sync");
146143

147144
const newBoard = Array.from({ length: sizeValue }, () =>
148145
Array.from({ length: sizeValue }, () => false),
@@ -177,7 +174,7 @@
177174
}
178175
}
179176
bottomDrawerOpen = false;
180-
sendEvent("placetemplate", newBoard);
177+
sendEvent("place_template", newBoard);
181178
}}
182179
>
183180
<img
@@ -234,9 +231,9 @@
234231
<button
235232
class="btn btn-error"
236233
onclick={() => {
234+
// reset code (not board)
237235
appliedCode = lifeGameJS;
238-
editingcode = lifeGameJS;
239-
console.log("Reset executed");
236+
editingCode = lifeGameJS;
240237
resetModalOpen = false;
241238
}}>{isJapanese ? "リセット" : "Reset"}</button
242239
>
@@ -259,7 +256,7 @@
259256
class="w-[80%] h-[90%] rounded-lg mx-auto my-5 shadow-lg"
260257
onload={() => {
261258
setTimeout(() => {
262-
sendEvent("stateupdate");
259+
sendEvent("state_update");
263260
console.log("generationFigure onload:", generationFigure);
264261
}, 50);
265262
}}
@@ -273,7 +270,7 @@
273270
]}
274271
>
275272
<textarea
276-
bind:value={editingcode}
273+
bind:value={editingCode}
277274
class="w-full h-full border-none p-4 font-mono bg-black text-[#0f0]"
278275
></textarea>
279276
</div>
@@ -391,7 +388,7 @@
391388
class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black"
392389
onclick={() => {
393390
isProgress = false;
394-
sendEvent("boardreset");
391+
sendEvent("board_reset");
395392
}}
396393
>
397394
{isJapanese ? "リセット" : "Reset"}
@@ -401,7 +398,7 @@
401398
class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black"
402399
onclick={() => {
403400
isProgress = false;
404-
sendEvent("boardrandom");
401+
sendEvent("board_randomize");
405402
}}
406403
>
407404
{isJapanese ? "ランダム" : "Random"}
@@ -413,7 +410,7 @@
413410
<button
414411
class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black"
415412
onclick={() => {
416-
appliedCode = editingcode;
413+
appliedCode = editingCode;
417414
}}
418415
>
419416
{isJapanese ? "コードを適用" : "Apply Code"}

0 commit comments

Comments
 (0)