84 lines
2.5 KiB
Vue
84 lines
2.5 KiB
Vue
<template>
|
|
<v-dialog max-width="640">
|
|
<template v-slot:activator="{ props }">
|
|
<slot name="activator" v-bind="{ props }" />
|
|
</template>
|
|
|
|
<template v-slot:default="{ isActive }">
|
|
<v-card title="Create Bot Key" :subtitle="`for bot @${props.item.name}`">
|
|
<v-form @submit.prevent="(evt) => { submit(evt).then(() => isActive.value = false) }">
|
|
<v-card-text class="pt-0 px-5">
|
|
<v-expand-transition>
|
|
<v-alert v-if="error" variant="tonal" type="error" class="text-xs mb-5">
|
|
{{ t("errorOccurred", [error]) }}
|
|
</v-alert>
|
|
</v-expand-transition>
|
|
|
|
<v-row>
|
|
<v-col cols="12" md="6">
|
|
<v-text-field label="Name" name="name" variant="outlined" hide-details />
|
|
</v-col>
|
|
<v-col cols="12" md="6">
|
|
<v-textarea auto-grow rows="1" label="Description" name="description" variant="outlined" hide-details />
|
|
</v-col>
|
|
<v-col cols="12">
|
|
<v-text-field type="number" label="Lifecycle" name="lifecycle" variant="outlined"
|
|
hint="How long will this key last (in seconds)" clearable persistent-hint />
|
|
</v-col>
|
|
</v-row>
|
|
</v-card-text>
|
|
|
|
<v-card-actions>
|
|
<v-spacer />
|
|
|
|
<v-btn
|
|
text="Cancel"
|
|
color="grey"
|
|
@click="isActive.value = false"
|
|
/>
|
|
<v-btn
|
|
text="Create"
|
|
type="submit"
|
|
/>
|
|
</v-card-actions>
|
|
</v-form>
|
|
</v-card>
|
|
</template>
|
|
</v-dialog>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
const props = defineProps<{ item: any }>()
|
|
const emits = defineEmits(["completed"])
|
|
|
|
const { t } = useI18n()
|
|
|
|
const error = ref<null | string>(null)
|
|
|
|
const submitting = ref(false)
|
|
|
|
async function submit(evt: SubmitEvent) {
|
|
const data: any = Object.fromEntries(new FormData(evt.target as HTMLFormElement).entries())
|
|
if (!data.name) return
|
|
|
|
data.lifecycle = parseInt(data.lifecycle)
|
|
if (Number.isNaN(data.lifecycle)) delete data.lifecycle
|
|
|
|
submitting.value = true
|
|
|
|
const res = await solarFetch(`/cgi/id/dev/bots/${props.item.id}/keys`, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(data),
|
|
})
|
|
if (res.status != 200) {
|
|
error.value = await res.text()
|
|
throw new Error(error.value)
|
|
} else {
|
|
emits("completed")
|
|
}
|
|
|
|
submitting.value = false
|
|
}
|
|
</script>
|