Spaces:
Runtime error
Runtime error
redesign results page
Browse files- frontend/src/lib/Result.svelte +34 -33
- frontend/src/routes/index.svelte +22 -15
frontend/src/lib/Result.svelte
CHANGED
@@ -2,6 +2,10 @@
|
|
2 |
import { colors, cheersMessages } from '$lib/utils';
|
3 |
import type { Board } from '../types';
|
4 |
import { fade } from 'svelte/transition';
|
|
|
|
|
|
|
|
|
5 |
export let board: Board;
|
6 |
export let currentRowIndex: number;
|
7 |
export let imagePaths: string[];
|
@@ -11,26 +15,29 @@
|
|
11 |
const imageBaseUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/' : '';
|
12 |
|
13 |
let elToShare: HTMLDivElement;
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
// domToImage = (await import('dom-to-image')) as unknown as DomToImage;
|
18 |
-
// });
|
19 |
-
async function writeClipDOM(node: HTMLDivElement) {
|
20 |
try {
|
21 |
-
await
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
29 |
} catch (err) {
|
30 |
console.log(err.name, err.message);
|
31 |
}
|
32 |
}
|
33 |
-
|
34 |
const s = 10;
|
35 |
const p = 1;
|
36 |
const rx = s / 10;
|
@@ -41,6 +48,12 @@
|
|
41 |
<div class="message">
|
42 |
<div class="border-0">
|
43 |
<div class="p-3" bind:this={elToShare}>
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
<h2 class="text-center uppercase tracking-widest font-extrabold">{message}</h2>
|
45 |
<div class="grid grid-cols-3 gap-2 p-3">
|
46 |
{#each imagePaths as image}
|
@@ -67,26 +80,14 @@
|
|
67 |
{/each}
|
68 |
{/each}
|
69 |
</svg>
|
70 |
-
<p class="text-[0.6rem] font-extralight text-gray-300 opacity-50">
|
71 |
-
https://huggingface.co/spaces/huggingface-projects/wordalle
|
72 |
-
</p>
|
73 |
</div>
|
74 |
</div>
|
75 |
-
<
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
class="go-tweet"
|
82 |
-
target="_blank"
|
83 |
-
rel="noopener noreferrer"
|
84 |
-
href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fhuggingface.co%2Fspaces%2Fosanseviero%2Fwordalle&via=huggingface&hashtags=dallemini"
|
85 |
-
>
|
86 |
-
Share on Twitter
|
87 |
-
</a>
|
88 |
-
or <button class="min-w-[6ch]" on:click={() => window.location.reload()}> Try again </button>
|
89 |
-
</p>
|
90 |
</div>
|
91 |
</div>
|
92 |
|
|
|
2 |
import { colors, cheersMessages } from '$lib/utils';
|
3 |
import type { Board } from '../types';
|
4 |
import { fade } from 'svelte/transition';
|
5 |
+
import { createEventDispatcher } from 'svelte';
|
6 |
+
|
7 |
+
const dispatch = createEventDispatcher();
|
8 |
+
|
9 |
export let board: Board;
|
10 |
export let currentRowIndex: number;
|
11 |
export let imagePaths: string[];
|
|
|
15 |
const imageBaseUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/' : '';
|
16 |
|
17 |
let elToShare: HTMLDivElement;
|
18 |
+
let disableDownload: boolean = false;
|
19 |
+
async function saveFile(node: HTMLDivElement) {
|
20 |
+
disableDownload = true;
|
|
|
|
|
|
|
21 |
try {
|
22 |
+
const blob = await domtoimage.toBlob(node, { bgcolor: '#000' });
|
23 |
+
const a = document.createElement('a');
|
24 |
+
a.download = `sucess-${Date.now()}.png`;
|
25 |
+
a.onclick = async (e) => {
|
26 |
+
disableDownload = true;
|
27 |
+
if (a.href) {
|
28 |
+
URL.revokeObjectURL(a.href);
|
29 |
+
disableDownload = false;
|
30 |
+
return;
|
31 |
+
}
|
32 |
+
a.href = URL.createObjectURL(blob);
|
33 |
+
disableDownload = false;
|
34 |
+
};
|
35 |
+
a.click();
|
36 |
+
console.log('Downloding image.');
|
37 |
} catch (err) {
|
38 |
console.log(err.name, err.message);
|
39 |
}
|
40 |
}
|
|
|
41 |
const s = 10;
|
42 |
const p = 1;
|
43 |
const rx = s / 10;
|
|
|
48 |
<div class="message">
|
49 |
<div class="border-0">
|
50 |
<div class="p-3" bind:this={elToShare}>
|
51 |
+
<header class="p-3 flex justify-between items-center">
|
52 |
+
<h1 class="text-xs font-bold uppercase whitespace-nowrap">WORDALLE π₯</h1>
|
53 |
+
<span class="font-light text-[0.6rem]"
|
54 |
+
><span class="text-gray-50 opacity-50">https://</span>hf.co/wordalle</span
|
55 |
+
>
|
56 |
+
</header>
|
57 |
<h2 class="text-center uppercase tracking-widest font-extrabold">{message}</h2>
|
58 |
<div class="grid grid-cols-3 gap-2 p-3">
|
59 |
{#each imagePaths as image}
|
|
|
80 |
{/each}
|
81 |
{/each}
|
82 |
</svg>
|
|
|
|
|
|
|
83 |
</div>
|
84 |
</div>
|
85 |
+
<div class="p-3 px-6 flex text-base">
|
86 |
+
<button disabled={disableDownload} class="min-w-[15ch] flex-1 mr-1" on:click={() => saveFile(elToShare)}>
|
87 |
+
{!disableDownload ? 'SAVE SCREENSHOT' : 'SAVING..'}
|
88 |
+
</button>
|
89 |
+
<button class="flex-1 ml-1" on:click={() => dispatch('restart')}> TRY AGAIN </button>
|
90 |
+
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
91 |
</div>
|
92 |
</div>
|
93 |
|
frontend/src/routes/index.svelte
CHANGED
@@ -13,6 +13,18 @@
|
|
13 |
const totalTime = 1000;
|
14 |
const apiUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/data' : 'data';
|
15 |
const imageBaseUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/' : '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
// Get word of the day
|
17 |
let answer: string;
|
18 |
let imagePaths: string[];
|
@@ -27,25 +39,20 @@
|
|
27 |
|
28 |
// Feedback state: message and shake
|
29 |
let message = '';
|
30 |
-
let grid = '';
|
31 |
let shakeRowIndex = -1;
|
32 |
let success = false;
|
33 |
// Handle keyboard input.
|
34 |
let allowInput = true;
|
35 |
|
36 |
-
let promptsData: PromptsData;
|
37 |
-
let completedPrompts: SuccessPrompt[] = [];
|
38 |
-
let currPromptIndex: number;
|
39 |
-
|
40 |
-
onMount(async () => {
|
41 |
-
promptsData = await fetch(apiUrl).then((d) => d.json());
|
42 |
-
restartBoard();
|
43 |
-
|
44 |
-
window.addEventListener('keyup', onKeyup);
|
45 |
-
return () => window.removeEventListener('keyup', onKeyup);
|
46 |
-
});
|
47 |
-
|
48 |
function restartBoard() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
const prompts: string[] = Object.keys(promptsData);
|
50 |
currPromptIndex = ~~(Math.random() * prompts.length);
|
51 |
const randomPrompt: string = prompts[currPromptIndex];
|
@@ -171,7 +178,7 @@
|
|
171 |
<Message {message} />
|
172 |
{/if}
|
173 |
{#if success}
|
174 |
-
<Result {board} {currentRowIndex} {imagePaths} />
|
175 |
{/if}
|
176 |
<!-- <div class="message" transition:fade>
|
177 |
{message}
|
@@ -183,7 +190,7 @@
|
|
183 |
<header class="flex justify-between items-center uppercase sm:px-2 text-center">
|
184 |
<span class="font-light flex-1 text-xs sm:text-base"> Guess the prompt!</span>
|
185 |
<span class="sm:block hidden mx-3 flex-1 border-[0.5px] border-opacity-50 border-gray-400" />
|
186 |
-
<h1 class="text-xl font-bold text-center">π₯ WORDALLE π₯</h1>
|
187 |
<span class="sm:block hidden mx-3 flex-1 border-[0.5px] border-opacity-50 border-gray-400" />
|
188 |
<span class="font-light flex-1 text-xs sm:text-base">
|
189 |
<button
|
|
|
13 |
const totalTime = 1000;
|
14 |
const apiUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/data' : 'data';
|
15 |
const imageBaseUrl = import.meta.env.MODE === 'development' ? 'http://localhost:7860/' : '';
|
16 |
+
|
17 |
+
let promptsData: PromptsData;
|
18 |
+
let completedPrompts: SuccessPrompt[] = [];
|
19 |
+
let currPromptIndex: number;
|
20 |
+
onMount(async () => {
|
21 |
+
promptsData = await fetch(apiUrl).then((d) => d.json());
|
22 |
+
restartBoard();
|
23 |
+
|
24 |
+
window.addEventListener('keyup', onKeyup);
|
25 |
+
return () => window.removeEventListener('keyup', onKeyup);
|
26 |
+
});
|
27 |
+
|
28 |
// Get word of the day
|
29 |
let answer: string;
|
30 |
let imagePaths: string[];
|
|
|
39 |
|
40 |
// Feedback state: message and shake
|
41 |
let message = '';
|
|
|
42 |
let shakeRowIndex = -1;
|
43 |
let success = false;
|
44 |
// Handle keyboard input.
|
45 |
let allowInput = true;
|
46 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
47 |
function restartBoard() {
|
48 |
+
//reset all states
|
49 |
+
success = false;
|
50 |
+
shakeRowIndex = -1;
|
51 |
+
message = '';
|
52 |
+
currentRowIndex = 0;
|
53 |
+
letterStates = {}
|
54 |
+
allowInput= true;
|
55 |
+
|
56 |
const prompts: string[] = Object.keys(promptsData);
|
57 |
currPromptIndex = ~~(Math.random() * prompts.length);
|
58 |
const randomPrompt: string = prompts[currPromptIndex];
|
|
|
178 |
<Message {message} />
|
179 |
{/if}
|
180 |
{#if success}
|
181 |
+
<Result {board} {currentRowIndex} {imagePaths} on:restart={restartBoard} />
|
182 |
{/if}
|
183 |
<!-- <div class="message" transition:fade>
|
184 |
{message}
|
|
|
190 |
<header class="flex justify-between items-center uppercase sm:px-2 text-center">
|
191 |
<span class="font-light flex-1 text-xs sm:text-base"> Guess the prompt!</span>
|
192 |
<span class="sm:block hidden mx-3 flex-1 border-[0.5px] border-opacity-50 border-gray-400" />
|
193 |
+
<h1 class="text-xl font-bold text-center whitespace-nowrap">π₯ WORDALLE π₯</h1>
|
194 |
<span class="sm:block hidden mx-3 flex-1 border-[0.5px] border-opacity-50 border-gray-400" />
|
195 |
<span class="font-light flex-1 text-xs sm:text-base">
|
196 |
<button
|