hackathon/web_src/lib/components/ErrorModal.svelte

53 lines
1.6 KiB
Svelte

<script lang="ts">
import { getContext } from 'svelte';
const { close } = getContext('simple-modal');
export let title: string = 'Error';
export let reason: string;
export let btn: { title: string; do: any } = null;
const perform = () => {
close();
btn.do();
};
let cleaned = '';
$: {
let first = reason[0] || '';
let rest = reason.slice(1) || '';
if (!['.', '!'].includes(rest.slice(-1))) {
rest += '.';
}
cleaned = first.toUpperCase() + rest;
}
</script>
<div class="sm:flex sm:items-start pl-3 pt-2">
<div
class="mx-auto flex-shrink-0 flex items-center justify-center h-12 w-12 rounded-full bg-red-100 sm:mx-0 sm:h-10 sm:w-10"
>
<!-- prettier-ignore -->
<svg class="h-6 w-6 text-red-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" />
</svg>
</div>
<div class="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3 class="text-xl leading-6 font-medium text-gray-900" id="modal-title">
{title}
</h3>
<div class="mt-2">
<p class="text-lg text-gray-500">{cleaned}</p>
</div>
</div>
</div>
<div class="px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse gap-4">
{#if btn}
<button type="button" class="btn px-2 text-lg md:py-1 rounded" on:click={perform}>
{btn.title}
</button>
{/if}
<button type="button" class="btn cancel px-2 text-lg md:py-1 rounded" on:click={close}>
Close
</button>
</div>