|
33 | 33 | let generationFigure = $state(0); |
34 | 34 | let sizeInputValue = $state(20); |
35 | 35 |
|
| 36 | + type SaveState = { saving: false } | { saving: true; boardData: boolean[][] }; |
| 37 | + let saveState: SaveState = $state({ saving: false }); |
| 38 | + let boardNameInput = $state(""); |
| 39 | +
|
36 | 40 | onMount(() => { |
37 | 41 | const handleMessage = (event: MessageEvent) => { |
38 | 42 | if (event.data.type === "patternError") { |
|
60 | 64 |
|
61 | 65 | onMount(() => { |
62 | 66 | const handler = async (event: MessageEvent<unknown>) => { |
63 | | - console.log("handler call"); |
64 | 67 | const data = event.data as |
65 | 68 | | { type: "unknown event" } |
66 | | - | { type: "save_board"; data: boolean[][] } |
67 | | - | { type: "request:load_board" }; |
| 69 | + | { type: "save_board"; data: boolean[][] }; |
68 | 70 | if (data.type === "save_board") { |
69 | | - console.log("board saved!"); |
70 | | - await saveBoard(data.data); |
71 | | - return; |
72 | | - } |
73 | | -
|
74 | | - if (data.type === "request:load_board") { |
75 | | - console.log("loaded board"); |
76 | | - const board = await loadBoard(); |
77 | | - if (board) { |
78 | | - sendEvent("load_board", board); |
79 | | - } |
| 71 | + saveState = { saving: true, boardData: data.data }; |
| 72 | + boardNameInput = ""; |
80 | 73 | return; |
81 | 74 | } |
82 | 75 | }; |
83 | 76 |
|
84 | 77 | window.addEventListener("message", handler); |
85 | 78 | return () => window.removeEventListener("message", handler); |
86 | 79 | }); |
| 80 | +
|
| 81 | + async function handleSave() { |
| 82 | + if (!saveState.saving) return; |
| 83 | +
|
| 84 | + const name = boardNameInput.trim() === "" ? "Unnamed Board" : boardNameInput.trim(); |
| 85 | +
|
| 86 | + await saveBoard({ board: saveState.boardData, name: name }); |
| 87 | +
|
| 88 | + saveState = { saving: false }; |
| 89 | + boardNameInput = ""; |
| 90 | + } |
| 91 | +
|
| 92 | + async function handleLoad() { |
| 93 | + const board = await loadBoard(); |
| 94 | + if (board) { |
| 95 | + sendEvent("apply_board", board); |
| 96 | + } |
| 97 | + return; |
| 98 | + } |
87 | 99 | </script> |
88 | 100 |
|
89 | 101 | <div class="navbar bg-[#E0E0E0] shadow-sm"> |
|
146 | 158 | </div> |
147 | 159 | </div> |
148 | 160 |
|
| 161 | +<input type="checkbox" class="modal-toggle" bind:checked={saveState.saving} /> |
| 162 | +<div class="modal" class:modal-open={saveState.saving}> |
| 163 | + <div class="modal-box"> |
| 164 | + <h3 class="font-bold text-lg">盤面を保存</h3> |
| 165 | + <p class="py-4">保存する盤面に名前を付けてください(任意)。</p> |
| 166 | + <input |
| 167 | + type="text" |
| 168 | + placeholder="盤面名を入力" |
| 169 | + class="input input-bordered w-full max-w-xs" |
| 170 | + bind:value={boardNameInput} |
| 171 | + /> |
| 172 | + <div class="modal-action"> |
| 173 | + <button class="btn" onclick={() => (saveState = { saving: false })}>キャンセル</button> |
| 174 | + <button class="btn btn-primary" onclick={handleSave} disabled={!saveState.saving}> |
| 175 | + 保存 |
| 176 | + </button> |
| 177 | + </div> |
| 178 | + </div> |
| 179 | +</div> |
| 180 | + |
149 | 181 | <input type="checkbox" class="modal-toggle" bind:checked={resetModalOpen} /> |
150 | 182 | <div class="modal" class:modal-open={resetModalOpen}> |
151 | 183 | <div class="modal-box"> |
|
256 | 288 | </div> |
257 | 289 |
|
258 | 290 | <button |
259 | | - class="btn btn-ghost hover:bg-[rgb(220,220,220)] ml-100 text-black" |
| 291 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] ml-50 text-black" |
260 | 292 | onclick={() => { |
261 | 293 | isProgress = false; |
262 | 294 | sendEvent("boardreset"); |
|
275 | 307 | Random |
276 | 308 | </button> |
277 | 309 |
|
| 310 | + <button |
| 311 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black" |
| 312 | + onclick={() => { |
| 313 | + isProgress = false; |
| 314 | + sendEvent("save_board"); |
| 315 | + }} |
| 316 | + > |
| 317 | + Save |
| 318 | + </button> |
| 319 | + |
| 320 | + <button |
| 321 | + class="btn btn-ghost hover:bg-[rgb(220,220,220)] text-black" |
| 322 | + onclick={() => { |
| 323 | + isProgress = false; |
| 324 | + sendEvent("pause"); |
| 325 | + handleLoad(); |
| 326 | + }} |
| 327 | + > |
| 328 | + Load |
| 329 | + </button> |
| 330 | + |
278 | 331 | <button |
279 | 332 | class="btn btn-ghost hover:bg-[rgb(220,220,220)] ml-5 text-black" |
280 | 333 | onclick={() => { |
|
0 commit comments