Spaces:
Runtime error
Runtime error
| <script lang="ts"> | |
| let canvas: HTMLCanvasElement; | |
| import { API } from '../data'; | |
| import { nanoid } from 'nanoid'; | |
| import type { Params } from '../types'; | |
| import { | |
| selectedParams, | |
| generateMap, | |
| currentCanvas, | |
| resultImage, | |
| saveResult | |
| } from '$lib/store'; | |
| $: (async () => { | |
| if ($generateMap) { | |
| const results = await predict($currentCanvas.toDataURL(), $selectedParams); | |
| $resultImage = results; | |
| $generateMap = false; | |
| } | |
| })(); | |
| $: (async () => { | |
| if ($saveResult) { | |
| const results = await saveImage($resultImage); | |
| $saveResult = false; | |
| } | |
| })(); | |
| let predictStatus: string = ''; | |
| async function saveImage(base64Image: string) { | |
| return new Promise((resolve, reject) => { | |
| try { | |
| const a = document.createElement('a'); | |
| a.download = `sucess-${Date.now()}.png`; | |
| a.target = '_self'; | |
| a.onclick = async (e) => { | |
| if (a.href) { | |
| URL.revokeObjectURL(a.href); | |
| } | |
| a.href = base64Image; | |
| }; | |
| requestAnimationFrame(() => { | |
| console.log('Downloading image.'); | |
| a.click(); | |
| resolve(null); | |
| }); | |
| } catch (err) { | |
| reject(); | |
| } | |
| }); | |
| } | |
| async function predict(base64Image: string, { prompt, modifier, steps, seed }: Params) { | |
| const response = await fetch('/predict', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json', | |
| }, | |
| body: JSON.stringify({ | |
| data: [base64Image, prompt+'. '+modifier, steps, seed.toString()], | |
| }), | |
| }); | |
| if (!response.ok) { | |
| throw new Error('Prediction request failed.'); | |
| } | |
| const result = await response.text(); | |
| return result; | |
| } | |
| </script> | |
| <div class="relative overflow-clip flex flex-col justify-center items-center w-full h-full"> | |
| {#if $resultImage} | |
| <img | |
| class="image {$generateMap ? 'opacity-30' : ''}" | |
| alt="Generative Map Result" | |
| src={$resultImage} | |
| width="512" | |
| height="512" | |
| /> | |
| {/if} | |
| {#if $generateMap} | |
| <div class="loading"> | |
| <svg | |
| xmlns="http://www.w3.org/2000/svg" | |
| fill="none" | |
| viewBox="0 0 24 24" | |
| class="animate-spin max-w-[3rem]" | |
| > | |
| <path | |
| fill="currentColor" | |
| d="M20 12a8 8 0 0 1-8 8v4a12 12 0 0 0 12-12h-4Zm-2-5.3a8 8 0 0 1 2 5.3h4c0-3-1.1-5.8-3-8l-3 2.7Z" | |
| /> | |
| </svg> | |
| <span class="text-xs">{predictStatus}</span> | |
| </div> | |
| {/if} | |
| </div> | |
| <!-- {/if} --> | |
| <style lang="postcss" scoped> | |
| .image { | |
| @apply box-border z-0 border dark:border-gray-300 border-gray-500 aspect-[512/512]; | |
| } | |
| .loading { | |
| @apply absolute top-0 left-0 right-0 bottom-0 flex flex-col justify-center items-center; | |
| } | |
| </style> | |