|
31 | 31 | let generationFigure = $state(0); |
32 | 32 | let sizeValue = $state(20); |
33 | 33 |
|
| 34 | + type SaveState = { saving: false } | { saving: true; boardData: boolean[][] }; |
| 35 | + let saveState: SaveState = $state({ saving: false }); |
| 36 | + let boardNameInput = $state(""); |
| 37 | +
|
34 | 38 | onMount(() => { |
35 | 39 | const handleMessage = (event: MessageEvent) => { |
36 | 40 | if (event.data.type === "generation_change") { |
|
55 | 59 |
|
56 | 60 | onMount(() => { |
57 | 61 | const handler = async (event: MessageEvent<unknown>) => { |
58 | | - console.log("handler call"); |
59 | 62 | const data = event.data as |
60 | 63 | | { type: "unknown event" } |
61 | | - | { type: "save_board"; data: boolean[][] } |
62 | | - | { type: "request:load_board" }; |
| 64 | + | { type: "save_board"; data: boolean[][] }; |
63 | 65 | if (data.type === "save_board") { |
64 | | - console.log("board saved!"); |
65 | | - await saveBoard(data.data); |
66 | | - return; |
67 | | - } |
68 | | -
|
69 | | - if (data.type === "request:load_board") { |
70 | | - console.log("loaded board"); |
71 | | - const board = await loadBoard(); |
72 | | - if (board) { |
73 | | - sendEvent("load_board", board); |
74 | | - } |
| 66 | + saveState = { saving: true, boardData: data.data }; |
| 67 | + boardNameInput = ""; |
75 | 68 | return; |
76 | 69 | } |
77 | 70 | }; |
78 | 71 |
|
79 | 72 | window.addEventListener("message", handler); |
80 | 73 | return () => window.removeEventListener("message", handler); |
81 | 74 | }); |
| 75 | +
|
| 76 | + async function handleSave() { |
| 77 | + if (!saveState.saving) return; |
| 78 | +
|
| 79 | + const name = boardNameInput.trim() === "" ? "Unnamed Board" : boardNameInput.trim(); |
| 80 | +
|
| 81 | + await saveBoard({ board: saveState.boardData, name: name }); |
| 82 | +
|
| 83 | + saveState = { saving: false }; |
| 84 | + boardNameInput = ""; |
| 85 | + } |
| 86 | +
|
| 87 | + async function handleLoad() { |
| 88 | + const board = await loadBoard(); |
| 89 | + if (board) { |
| 90 | + sendEvent("apply_board", board); |
| 91 | + } |
| 92 | + return; |
| 93 | + } |
82 | 94 | </script> |
83 | 95 |
|
84 | 96 | <div class="navbar bg-[#E0E0E0] shadow-sm"> |
|
165 | 177 | </div> |
166 | 178 | </div> |
167 | 179 |
|
| 180 | +<input type="checkbox" class="modal-toggle" bind:checked={saveState.saving} /> |
| 181 | +<div class="modal" class:modal-open={saveState.saving}> |
| 182 | + <div class="modal-box"> |
| 183 | + <h3 class="font-bold text-lg">盤面を保存</h3> |
| 184 | + <p class="py-4">保存する盤面に名前を付けてください(任意)。</p> |
| 185 | + <input |
| 186 | + type="text" |
| 187 | + placeholder="盤面名を入力" |
| 188 | + class="input input-bordered w-full max-w-xs" |
| 189 | + bind:value={boardNameInput} |
| 190 | + /> |
| 191 | + <div class="modal-action"> |
| 192 | + <button class="btn" onclick={() => (saveState = { saving: false })}>キャンセル</button> |
| 193 | + <button class="btn btn-primary" onclick={handleSave} disabled={!saveState.saving}> |
| 194 | + 保存 |
| 195 | + </button> |
| 196 | + </div> |
| 197 | + </div> |
| 198 | +</div> |
| 199 | + |
168 | 200 | <input type="checkbox" class="modal-toggle" bind:checked={resetModalOpen} /> |
169 | 201 | <div class="modal" class:modal-open={resetModalOpen}> |
170 | 202 | <div class="modal-box"> |
|
291 | 323 | <img class="size-6" src={icons.RightArrow} alt="Right Arrow" /> |
292 | 324 | </div> |
293 | 325 |
|
| 326 | + <div class="font-bold text-black absolute right-143">Board:</div> |
| 327 | + |
| 328 | + <button |
| 329 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-125 bottom-1" |
| 330 | + onclick={() => { |
| 331 | + isProgress = false; |
| 332 | + sendEvent("save_board"); |
| 333 | + }} |
| 334 | + > |
| 335 | + Save |
| 336 | + </button> |
| 337 | + |
| 338 | + <button |
| 339 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-109 bottom-1" |
| 340 | + onclick={() => { |
| 341 | + isProgress = false; |
| 342 | + sendEvent("pause"); |
| 343 | + handleLoad(); |
| 344 | + }} |
| 345 | + > |
| 346 | + Load |
| 347 | + </button> |
| 348 | + |
294 | 349 | <button |
295 | | - class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-114 bottom-1" |
| 350 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-92 bottom-1" |
296 | 351 | onclick={() => { |
297 | 352 | isProgress = false; |
298 | 353 | sendEvent("boardreset"); |
299 | 354 | }} |
300 | 355 | > |
301 | | - Reset board |
| 356 | + Reset |
302 | 357 | </button> |
303 | 358 |
|
304 | 359 | <button |
305 | | - class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-90 bottom-1" |
| 360 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black fixed right-70 bottom-1" |
306 | 361 | onclick={() => { |
307 | 362 | isProgress = false; |
308 | 363 | sendEvent("boardrandom"); |
|
0 commit comments