happyDomain/ui/src/lib/components/NewDomainInput.svelte

109 lines
3.3 KiB
Svelte

<script lang="ts">
import { goto } from '$app/navigation';
import {
Button,
Icon,
Input,
InputGroup,
ListGroup,
ListGroupItem,
Spinner,
} from 'sveltestrap';
import { addDomain } from '$lib/api/domains';
import { validateDomain } from '$lib/dns';
import type { Provider } from '$lib/model/provider';
import { refreshDomains } from '$lib/stores/domains';
import { toasts } from '$lib/stores/toasts';
import { t } from '$lib/translations';
export let autofocus = false;
export let provider: Provider|null = null;
export let value = "";
let addingNewDomain = false;
let newDomainState: boolean|undefined = undefined;
function addDomainToProvider() {
addingNewDomain = true;
if (!provider) {
goto('/domains/new/' + encodeURIComponent(value));
} else {
addDomain(value, provider)
.then(
(domain) => {
addingNewDomain = false;
toasts.addToast({
title: $t('domains.attached-new'),
message: $t('domains.added-success', { domain: domain.domain }),
href: '/domains/' + domain.domain,
color: 'success',
timeout: 5000,
});
value = "";
refreshDomains();
},
(error) => {
addingNewDomain = false;
throw error;
}
);
}
}
function validateNewDomain(val: string|undefined): boolean|undefined {
if (val) {
newDomainState = validateDomain(val);
} else {
newDomainState = validateDomain(value);
}
return newDomainState;
}
function inputChange(event: Event) {
if (event instanceof InputEvent) {
validateNewDomain(event.data?value+event.data:value.substring(0,value.length-1));
}
}
</script>
<ListGroup {...$$restProps}>
<form on:submit|preventDefault={addDomainToProvider}>
<ListGroupItem class="d-flex justify-content-between align-items-center">
<InputGroup>
<label for="newdomaininput" class="text-center" style="width: 50px; font-size: 2.3rem">
<Icon name="plus" />
</label>
<Input
id="newdomaininput"
{autofocus}
class="font-monospace"
placeholder={$t('domains.placeholder-new')}
invalid={value.length ? newDomainState !== undefined && !newDomainState : undefined}
valid={value.length ? newDomainState : undefined}
style="border:none;box-shadow:none;z-index:0"
bind:value={value}
on:input={inputChange}
/>
{#if value.length}
<Button
type="submit"
outline
color="primary"
disabled={addingNewDomain}
>
{#if addingNewDomain}
<Spinner size="sm" class="me-1" />
{/if}
{$t('common.add-new-thing', { thing: $t('domains.kind') })}
</Button>
{/if}
</InputGroup>
</ListGroupItem>
</form>
</ListGroup>