<script lang="ts"> import type { ModelCard } from "$lib/type"; import Icon from "@iconify/svelte"; import { goto, invalidate } from "$app/navigation"; import { page } from "$app/stores"; import Button from "$lib/components/Button.svelte"; import { success } from "$lib/utils/toaster"; import { userStore } from "$lib/stores/use-user"; import Image from "./image/Image.svelte"; export let card: ModelCard; const handleClick = async () => { $page.url.searchParams.set('model', card?.id); goto(`/models/${card?.id}`); }; const publish = async () => { const request = await fetch(`/api/models/${card.id.replace("/", "@")}`, { method: "POST", }); const response = await request.json(); if (response.success) { card.isPublic = true; success("Model published successfully!"); } }; const remove = async () => { const request = await fetch(`/api/models/${card.id.replace("/", "@")}`, { method: "DELETE", }); const response = await request.json(); if (response.success) { card.isPublic = false; success("Model unpublished successfully!"); } }; </script> <!-- svelte-ignore a11y-no-static-element-interactions --> <!-- svelte-ignore a11y-click-events-have-key-events --> <div class="w-full cursor-pointer group bg-neutral-900 rounded-xl relative flex items-start justify-between flex-col p-3 border border-neutral-800 transition-all duration-200 brightness-90 hover:brightness-100 z-[1]" on:click={handleClick} > <div class="w-full h-[350px] relative z-[1] mb-3 overflow-hidden"> <Image src={card?.image} generatedImage={card?.gallery?.[0]?.image} className="w-full h-full bg-center bg-cover rounded-lg object-cover object-center bg-neutral-800" alt={card?.id} /> {#if $userStore?.is_admin} <div class="absolute flex items-center justify-between bottom-0 left-0 w-full p-5 bg-gradient-to-t from-black to-transparent" on:click={e => e.stopPropagation()} > {#if !card.isPublic} <Button theme="blue" icon="icon-park-solid:check-one" onClick={publish}>Publish</Button> {:else} <Button theme="red" onClick={remove}>Delete</Button> {/if} </div> {/if} </div> <div class="flex items-center justify-between w-full gap-4 py-1"> <p class="text-white font-semibold text-base mb-1 break-all truncate">{card?.id}</p> <div class="flex items-center justify-end gap-3"> <div class="text-white text-sm flex items-center justify-end gap-1.5"> <Icon icon="solar:heart-bold" class="w-5 h-5 text-red-500" /> {card.likes ?? 0} </div> <div class="text-white text-sm flex items-center justify-end gap-1.5"> <Icon icon="solar:download-square-bold" class="w-5 h-5 text-blue-500" /> {card.downloads ?? 0} </div> </div> </div> </div>