Cleanup API functions

This commit is contained in:
2025-10-31 14:07:36 +03:30
parent 8938d893ad
commit 25a968ba53
2 changed files with 96 additions and 49 deletions

72
app/lib/api.ts Normal file
View File

@@ -0,0 +1,72 @@
interface MaxedMagnetResponse {
totalTrackers: number;
name?: string;
id: string;
maxedMagnet: string;
error?: string;
}
export async function getMaxedMagnetUrl(
magnet: string
): Promise<MaxedMagnetResponse> {
try {
const response = await fetch("/api/magnet", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ magnet }),
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
return {
totalTrackers: 0,
id: "",
maxedMagnet: "",
error: errorData.message || `HTTP error! status: ${response.status}`,
} as MaxedMagnetResponse;
}
return await response.json();
} catch (err) {
return {
totalTrackers: 0,
id: "",
maxedMagnet: "",
error: err instanceof Error ? err.message : "An unknown error occurred",
} as MaxedMagnetResponse;
}
}
export async function getMaxedMagnetFromTorrent(
file: File
): Promise<MaxedMagnetResponse> {
try {
const form = new FormData();
form.append("file", file);
const response = await fetch("/api/torrent", {
method: "POST",
body: form,
});
if (!response.ok) {
const errorData = await response.json().catch(() => ({}));
return {
totalTrackers: 0,
id: "",
maxedMagnet: "",
error: errorData.message || `HTTP error! status: ${response.status}`,
} as MaxedMagnetResponse;
}
return await response.json();
} catch (err) {
return {
totalTrackers: 0,
id: "",
maxedMagnet: "",
error: err instanceof Error ? err.message : "An unknown error occurred",
} as MaxedMagnetResponse;
}
}

View File

@@ -2,70 +2,45 @@
import MagnetCard from "~/components/MagnetCard.vue"; import MagnetCard from "~/components/MagnetCard.vue";
import { ref } from "vue"; import { ref } from "vue";
import IndexHero from "~/components/IndexHero.vue"; import IndexHero from "~/components/IndexHero.vue";
import { getMaxedMagnetFromTorrent, getMaxedMagnetUrl } from "~/lib/api";
interface MaxedMagnetResponse { interface MaxedMagnetResponse {
totalTrackers: number; totalTrackers: number;
name?: string; name?: string;
id: string; id: string;
maxedMagnet: string; maxedMagnet: string;
error?: string;
} }
const maxedMagnet = ref<MaxedMagnetResponse | null>(null); const maxedMagnet = ref<MaxedMagnetResponse | null>(null);
const error = ref<string | null>(null); const error = ref<string | null>(null);
const loading = ref(false); const loading = ref(false);
async function getMaxedMagnetUrl(magnet: string) { async function handleMagnetSubmit(magnet: string) {
error.value = null; // Clear any previous error loading.value = true;
loading.value = true; // Set loading to true error.value = null;
maxedMagnet.value = null;
try { const result = await getMaxedMagnetUrl(magnet);
const response = await fetch("/api/magnet", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ magnet }),
});
if (!response.ok) { loading.value = false;
const errorData = await response.json().catch(() => ({}));
error.value =
errorData.message || `HTTP error! status: ${response.status}`;
console.error("API error:", error.value);
return;
}
maxedMagnet.value = await response.json(); if (result.error) {
} catch (err) { error.value = result.error;
error.value = } else {
err instanceof Error ? err.message : "An unknown error occurred"; maxedMagnet.value = result;
console.error("Network error:", err);
} finally {
loading.value = false; // Reset loading state
} }
} }
async function getMaxedMagnetFromTorrent(file: File) { async function handleTorrentUpload(file: File) {
error.value = null; // Clear any previous error loading.value = true;
loading.value = true; // Set loading to true const result = await getMaxedMagnetFromTorrent(file);
loading.value = false;
try { if (result.error) {
const form = new FormData(); error.value = result.error;
form.append("file", file); } else {
maxedMagnet.value = result;
const res = await fetch("/api/torrent", {
method: "POST",
body: form,
});
const data = await res.json();
if (!res.ok) throw new Error(data.message || `HTTP ${res.status}`);
maxedMagnet.value = data;
} catch (e: any) {
error.value = e.message || "Upload failed";
} finally {
loading.value = false;
} }
} }
</script> </script>
@@ -73,12 +48,12 @@ async function getMaxedMagnetFromTorrent(file: File) {
<template> <template>
<div class="flex flex-col min-h-screen bg-base-300"> <div class="flex flex-col min-h-screen bg-base-300">
<div class="grow flex items-start justify-center pt-40 px-4"> <div class="grow flex items-start justify-center pt-40 px-4">
<div class="w-full max-w-2xl" > <div class="w-full max-w-2xl">
<IndexHero /> <IndexHero />
<div v-if="!maxedMagnet && !loading" class="space-y-6"> <div v-if="!maxedMagnet && !loading" class="space-y-6">
<SearchBar @submit="getMaxedMagnetUrl" /> <SearchBar @submit="handleMagnetSubmit" />
<div class="divider divider-neutral">OR</div> <div class="divider divider-neutral">OR</div>
<TorrentUpload @submit="getMaxedMagnetFromTorrent" /> <TorrentUpload @submit="handleTorrentUpload" />
</div> </div>
<div <div
@@ -86,7 +61,7 @@ async function getMaxedMagnetFromTorrent(file: File) {
v-motion-fade v-motion-fade
class="flex justify-center items-center p-8" class="flex justify-center items-center p-8"
> >
<span class="loading loading-infinity loading-lg" /> <span class="loading loading-infinity loading-xl" />
</div> </div>
<!-- Error message display --> <!-- Error message display -->