<template> <v-container class="px-12"> <div class="flex justify-between items-center mt-5"> <div class="flex items-end gap-2"> <h1 class="text-2xl">Edit sticker: {{ data?.name ?? "Loading" }}</h1> </div> <div class="flex gap-2"> <v-btn color="grey" text="Cancel" prepend-icon="mdi-arrow-left" variant="tonal" to="/creator/stickers" /> </div> </div> <v-expand-transition> <v-alert v-if="error" variant="tonal" type="error" class="text-xs mt-5 mb-3"> {{ t("errorOccurred", [error]) }} </v-alert> </v-expand-transition> <v-form class="mt-5" @submit.prevent="submit"> <v-row> <v-col cols="12"> <v-card title="Pack info" prepend-icon="mdi-sticker-emoji" density="compact"> <v-card-text class="mt-2"> <p class="text-lg"><b>{{ pack?.name ?? "Loading..." }}</b></p> <p>{{ pack?.description ?? "Please stand by..." }}</p> </v-card-text> </v-card> </v-col> <v-col cols="12" md="6"> <v-text-field label="Name" name="name" variant="outlined" persistent-hint hint="A human friendly name for user to recognize this sticker" v-model="stickerName" /> </v-col> <v-col cols="12" md="6"> <v-text-field label="Alias" name="alias" variant="outlined" persistent-hint hint="A placeholder of this sticker, will prepend pack's prefix" v-model="stickerAlias" > <template #prepend-inner> <p class="ms-1 me-[-5px] text-grey">{{ pack?.prefix }}</p> </template> </v-text-field> </v-col> <v-col cols="12"> <v-text-field label="Attachment" name="attachment_id" variant="outlined" persistent-hint v-model="attachmentRid" > <template #details> <p class="order-first v-messages"> The texture / image of this sticker, you can upload one from <nuxt-link to="/gallery/new?pool=c3RpY2tlcg" target="_blank" class="underline">here</nuxt-link> </p> </template> <template #prepend-inner> <v-img cover aspect-ratio="1" width="28" height="28" color="grey-lighten-2" rounded="sm" :src="attachmentRid.length > 0 ? `${config.public.solarNetworkApi}/cgi/uc/attachments/${attachmentRid}` : `example.com/not-found`" > <template #placeholder> <div class="d-flex align-center justify-center fill-height" v-if="attachmentRid.length > 0"> <v-progress-circular size="x-small" width="3" color="grey-lighten-4" indeterminate ></v-progress-circular> </div> <div class="d-flex align-center justify-center fill-height" v-else> <v-icon icon="mdi-image-broken-variant" class="block" size="18" /> </div> </template> </v-img> </template> </v-text-field> </v-col> </v-row> <div class="flex justify-end"> <v-btn type="submit" text="Save changes" append-icon="mdi-content-save" :disabled="data == null" :loading="submitting" /> </div> </v-form> </v-container> </template> <script setup lang="ts"> definePageMeta({ layout: "creator-hub", middleware: ["auth"], }) useHead({ title: "Edit Sticker", }) const { t } = useI18n() const route = useRoute() const config = useRuntimeConfig() const data = ref<any>(null) const pack = ref<any>(null) const attachmentRid = ref<string>("") const stickerName = ref<string>("") const stickerAlias = ref<string>("") async function readPack() { const res = await solarFetch(`/cgi/uc/stickers/packs/${route.params.id}`) if (res.status != 200) { error.value = await res.text() } else { pack.value = await res.json() } } async function readSticker() { const res = await solarFetch(`/cgi/uc/stickers/${route.params.sticker}`) if (res.status != 200) { error.value = await res.text() } else { data.value = await res.json() stickerName.value = data.value?.name stickerAlias.value = data.value?.alias attachmentRid.value = data.value?.attachment.rid } } onMounted(() => Promise.all([readPack(), readSticker()])) const error = ref<null | string>(null) const submitting = ref(false) async function submit(evt: SubmitEvent) { const data = Object.fromEntries(new FormData(evt.target as HTMLFormElement).entries()) if (!data.name) return submitting.value = true const res = await solarFetch(`/cgi/uc/stickers/${route.params.sticker}`, { method: "PUT", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ pack_id: parseInt(route.params.id.toString()), ...data, }), }) if (res.status != 200) { error.value = await res.text() } else { navigateTo("/creator/stickers") } submitting.value = false } </script>