|
2 | 2 | import Card from './Card.svelte'; |
3 | 3 | import { moveCount } from "./stores/moveCount" |
4 | 4 |
|
5 | | - export let puzzle = []; |
6 | | - export let onCompleted; |
| 5 | + let { puzzle = $bindable([]), completed } = $props(); |
7 | 6 |
|
8 | | - let opened = [] |
| 7 | + let opened = $state([]) |
9 | 8 |
|
10 | 9 | function delayOf(ms, ...args) { |
11 | 10 | return new Promise(resolve => setTimeout(resolve, ms, ...args)) |
12 | 11 | } |
13 | 12 |
|
14 | 13 | function resetItem(item) { |
15 | 14 | item.backfaceIsUp = false |
16 | | - puzzle = puzzle |
17 | | - // puzzle[item.index].backfaceIsUp = false |
18 | 15 | } |
19 | 16 |
|
20 | 17 | function checkCompletion() { |
21 | | - const completed = (puzzle.length === puzzle.filter((item) => item.backfaceIsUp).length) |
| 18 | + const puzzleCompleted = (puzzle.length === puzzle.filter((item) => item.backfaceIsUp).length) |
22 | 19 |
|
23 | | - if (completed) { |
| 20 | + if (puzzleCompleted) { |
24 | 21 | delayOf(300).then(() => { |
25 | | - onCompleted() |
| 22 | + completed() |
26 | 23 | }) |
27 | 24 | } |
28 | 25 | } |
|
39 | 36 | return opened[0].type === opened[1].type |
40 | 37 | } |
41 | 38 |
|
42 | | - function handleFlip(event) { |
43 | | - const item = event.detail |
44 | | - puzzle[item.index].backfaceIsUp = !puzzle[item.index].backfaceIsUp |
45 | | - // puzzle = [...puzzle] |
| 39 | + function handleFlip(item) { |
| 40 | + item.backfaceIsUp = !item.backfaceIsUp |
46 | 41 |
|
47 | 42 | opened = [...opened, item] |
48 | 43 |
|
|
62 | 57 |
|
63 | 58 | <div class="full-grid disable-text-selection"> |
64 | 59 | {#each puzzle as item, index (index)} |
65 | | - <Card index={index} item={item} flipped={item.backfaceIsUp} on:flip={handleFlip} flippable={opened.length < 2}> |
| 60 | + <Card index={index} item={item} flipped={item.backfaceIsUp} flip={handleFlip} flippable={opened.length < 2}> |
66 | 61 | {item.type.toString()} |
67 | 62 | </Card> |
68 | 63 | {/each} |
|
0 commit comments