Merge commit '510a6977bec3c122382ed45788b7f6690770b56b' into feature-clean

This commit is contained in:
2024-11-21 02:23:19 +03:00
10 changed files with 232 additions and 43 deletions

View File

@@ -12,17 +12,21 @@ function hCaptchaReady() {
}
onMounted(() => {
window.hCaptchaReady = hCaptchaReady;
if (window.hcaptcha) {
hCaptchaReady();
} else {
window.hCaptchaReady = hCaptchaReady;
useHead({
script: [
{
src: "https://js.hcaptcha.com/1/api.js?render=explicit&onload=hCaptchaReady",
async: true,
defer: true,
},
],
});
useHead({
script: [
{
src: "https://js.hcaptcha.com/1/api.js?render=explicit&onload=hCaptchaReady",
async: true,
defer: true,
},
],
});
}
});
defineExpose({

View File

@@ -17,6 +17,9 @@
<span class="font-semibold"> Backup #{{ newBackupAmount }}</span>
</span>
</div>
<div v-if="isRateLimited" class="mt-2 text-sm text-red">
You're creating backups too fast. Please wait a moment before trying again.
</div>
</div>
<div class="mb-1 mt-4 flex justify-start gap-4">
<ButtonStyled color="brand">
@@ -36,10 +39,9 @@
</template>
<script setup lang="ts">
import { ref, nextTick } from "vue";
import { ref, nextTick, computed } from "vue";
import { ButtonStyled, NewModal } from "@modrinth/ui";
import { PlusIcon, XIcon, InfoIcon } from "@modrinth/assets";
import type { Server } from "~/composables/pyroServers";
const props = defineProps<{
server: Server<["general", "mods", "backups", "network", "startup", "ws", "fs"]>;
@@ -50,6 +52,7 @@ const emit = defineEmits(["backupCreated"]);
const modal = ref<InstanceType<typeof NewModal>>();
const input = ref<HTMLInputElement>();
const isCreating = ref(false);
const isRateLimited = ref(false);
const backupError = ref<string | null>(null);
const backupName = ref("");
const newBackupAmount = computed(() =>
@@ -75,14 +78,20 @@ const createBackup = async () => {
}
isCreating.value = true;
isRateLimited.value = false;
try {
await props.server.backups?.create(backupName.value);
await props.server.refresh();
hideModal();
emit("backupCreated", { success: true, message: "Backup created successfully" });
} catch (error) {
backupError.value = error instanceof Error ? error.message : String(error);
emit("backupCreated", { success: false, message: backupError.value });
if (error instanceof PyroFetchError && error.statusCode === 429) {
isRateLimited.value = true;
backupError.value = "You're creating backups too fast.";
} else {
backupError.value = error instanceof Error ? error.message : String(error);
emit("backupCreated", { success: false, message: backupError.value });
}
} finally {
isCreating.value = false;
}