Skip to content

Commit c8a411d

Browse files
authored
Merge pull request #58 from Chessweeper/loading-ex
Add loading bar
2 parents 6ec0b7c + bb2d1db commit c8a411d

File tree

5 files changed

+69
-12
lines changed

5 files changed

+69
-12
lines changed

src/Algs.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -402,7 +402,8 @@ export function generatePuzzleBoard(
402402
pieces: Record<string, number>,
403403
size: number,
404404
count: number,
405-
difficulty: number
405+
difficulty: number,
406+
updateProgress: (value: number) => void
406407
) {
407408
let data: Array<number | string> = [];
408409
let error: string | null = null;
@@ -433,6 +434,7 @@ export function generatePuzzleBoard(
433434
const subGenMaxIt = 50; // Max iteration count to attempt to place pieces for the sub generation part
434435
const firstGenCount = 4; // Number of pieces we place in the first generation
435436
for (; c < maxIt; c++) {
437+
updateProgress(0);
436438
resetState(pieces); // Reset pieces on new loop
437439
const firstCount = count > firstGenCount ? firstGenCount : count; // Generate a first board with a max of 4 pieces
438440

@@ -452,15 +454,16 @@ export function generatePuzzleBoard(
452454
discovered = digData["discovered"];
453455

454456
if (!isSolved) {
455-
console.log(
457+
console.debug(
456458
`[${getTimeElapsed(
457459
startTime
458460
)}s] - Skipping unsolvabled puzzle (${firstGenCount} pieces construction, iteration n°${c})`
459461
);
460462
continue;
461463
}
462464

463-
console.log(
465+
updateProgress(firstGenCount / count);
466+
console.debug(
464467
`[${getTimeElapsed(
465468
startTime
466469
)}s] - ${firstGenCount} pieces puzzle generated`
@@ -491,28 +494,29 @@ export function generatePuzzleBoard(
491494
if (isSolved) {
492495
break;
493496
} else {
494-
console.log(
497+
console.debug(
495498
`[${getTimeElapsed(startTime)}s] - Skipping unsolvabled puzzle (${
496499
i + 1
497500
} pieces construction, sub-iteration n°${c2})`
498501
);
499502
resetState(piecesSaveState);
500503
}
501504
}
505+
updateProgress(i / count);
502506
if (!isSolved) {
503507
break;
504508
}
505509
}
506510

507511
// We try to remove tiles to match the difficulty
508512
if (!isSolved) {
509-
console.log(
513+
console.debug(
510514
`[${getTimeElapsed(
511515
startTime
512516
)}s] - Skipping unsolvabled puzzle (iteration n°${c})`
513517
);
514518
} else {
515-
console.log(
519+
console.debug(
516520
`[${getTimeElapsed(startTime)}s] - ${count} pieces puzzle generated`
517521
);
518522
for (let i = 0; i < data.length; i++) {
@@ -530,7 +534,7 @@ export function generatePuzzleBoard(
530534
const emptyCasesAfter = discovered.filter((x) => x === false).length;
531535

532536
if (difficulty !== -1 && difficulty > emptyCasesAfter) {
533-
console.log(
537+
console.debug(
534538
`[${getTimeElapsed(
535539
startTime
536540
)}s] - Skipping puzzle with ${emptyCasesAfter} empty tiles`

src/PuzzleGenWorker.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@ import { SetupData } from "./Game";
44
onmessage = (e: MessageEvent<SetupData>) => {
55
const { seed, pieces, size, count, difficulty } = e.data;
66

7+
const updateProgress = (value: number) => {
8+
postMessage(value);
9+
};
10+
711
const { cells, error } = generatePuzzleBoard(
812
seed,
913
pieces,
1014
size,
1115
count,
12-
difficulty
16+
difficulty,
17+
updateProgress
1318
);
1419

1520
if (error) {

src/components/Client.tsx

+11-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { parseUrl } from "../Parsing";
77
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
88
import { useSearchParams } from "react-router-dom";
99
import { Random } from "../Random";
10+
import { LoadingBar } from "./LoadingBar";
1011
import PuzzleGenWorker from "../PuzzleGenWorker?worker";
1112

1213
export interface BoardPropsWithReload extends BoardProps<GameState> {
@@ -30,6 +31,7 @@ export const Client = (): JSX.Element => {
3031
const [game, setGame] = useState<BgioGame | null>(null);
3132
const [settingNextGame, setSettingNextGame] = useState(false);
3233
const [worker, setWorker] = useState<Worker | null>();
34+
const [progress, setProgress] = useState(0);
3335

3436
const nextGame = useRef<BgioGame | null>(null);
3537

@@ -57,7 +59,8 @@ export const Client = (): JSX.Element => {
5759
setupData.pieces,
5860
setupData.size,
5961
setupData.count,
60-
setupData.difficulty
62+
setupData.difficulty,
63+
setProgress
6164
);
6265

6366
if (error) {
@@ -90,9 +93,13 @@ export const Client = (): JSX.Element => {
9093

9194
if (isWorkerAvailable) {
9295
w = new PuzzleGenWorker();
93-
w.onmessage = (e: MessageEvent<SetupData> | MessageEvent<string>) => {
96+
w.onmessage = (
97+
e: MessageEvent<SetupData> | MessageEvent<string> | MessageEvent<number>
98+
) => {
9499
if (typeof e.data === "string") {
95100
console.error(e.data);
101+
} else if (typeof e.data === "number") {
102+
setProgress(e.data);
96103
} else {
97104
const setupData = e.data;
98105
nextGame.current = Game(setupData);
@@ -156,9 +163,9 @@ export const Client = (): JSX.Element => {
156163
collapseOnLoad: true,
157164
},
158165
})
159-
: () => <div>Generating Board...</div>,
166+
: () => null,
160167
[game, setupGame]
161168
);
162169

163-
return <Client />;
170+
return game ? <Client /> : <LoadingBar value={progress} />;
164171
};

src/components/LoadingBar.css

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#progress-container {
2+
width: 100%;
3+
text-align: center;
4+
font-size: 1.2em;
5+
}
6+
7+
#progress {
8+
width: 100%;
9+
background-color: grey;
10+
}
11+
12+
#progress-content {
13+
width: 0;
14+
height: 30px;
15+
background-color: green;
16+
}

src/components/LoadingBar.tsx

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { useEffect, useRef } from "react";
2+
import "./LoadingBar.css";
3+
4+
interface LoadingBarProps {
5+
value: number;
6+
}
7+
8+
export const LoadingBar = ({ value }: LoadingBarProps): JSX.Element => {
9+
const ref = useRef<HTMLDivElement | null>(null);
10+
11+
useEffect(() => {
12+
if (ref.current) {
13+
ref.current.style.width = value * 100 + "%";
14+
}
15+
}, [value]);
16+
17+
return (
18+
<div id="progress-container">
19+
Generating Board...
20+
<div id="progress">
21+
<div id="progress-content" ref={ref} />
22+
</div>
23+
</div>
24+
);
25+
};

0 commit comments

Comments
 (0)