File size: 2,754 Bytes
dd7ec11
404baa5
f05d33c
 
35140b4
f05d33c
 
 
35140b4
eb29a95
97ec6f2
 
35140b4
 
 
 
 
dd7ec11
f05d33c
644d65a
f05d33c
 
 
 
 
 
 
 
 
 
 
35140b4
 
 
 
 
 
 
f05d33c
 
 
 
dd7ec11
644d65a
f05d33c
dd7ec11
35140b4
404baa5
dd7ec11
a764df6
 
 
 
 
dd7ec11
35140b4
 
 
 
 
 
 
 
 
 
 
dd7ec11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<script lang="ts">
  import { env } from "$env/dynamic/public";
  import { goto } from "$app/navigation";
  import { page } from "$app/stores"; 
	import Icon from "@iconify/svelte";
  
	import type { CommunityCard } from "$lib/type";
  import { galleryStore } from "$lib/stores/use-gallery";
	import Loading from "$lib/components/Loading.svelte";
	import Reactions from "./reactions/Reactions.svelte";

  export let card: CommunityCard;
  export let form: Record<string, string> | undefined = undefined;
  export let displayReactions: boolean = true;
  export let onDelete: ((id: string) => Promise<void>) | undefined = undefined;

  let loading = false;

  const handleClick = async () => {
    const request = await fetch(`/api/community/${card?.id}?${new URLSearchParams(form)}`);
    const { gallery, next, previous } = await request.json();
    galleryStore.set({
      gallery,
      open: true,
      next,
      previous
    });

    $page.url.searchParams.set('gallery', card?.id);
    goto(`?${$page.url.searchParams.toString()}`);
  };

  const handleDelete = async (id: string) => {
    if (loading || !onDelete) return;
    loading = true
    await onDelete?.(id);
    loading = false;
  }
</script>

<!-- svelte-ignore a11y-no-static-element-interactions -->
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div
  class="cursor-pointer group bg-neutral-700 rounded-xl h-[400px] relative flex items-start justify-between flex-col p-5 transition-all duration-200 brightness-90 hover:brightness-100 z-[1] overflow-hidden"
  on:click={handleClick}
>
  <div class="w-full h-full absolute top-0 left-0 -z-[1] rounded-xl overflow-hidden" class:!brightness-50={loading}>
    <div class="w-full h-full bg-center bg-cover transition-all duration-200 group-hover:scale-110 " style="background-image: url('{env.PUBLIC_FILE_UPLOAD_DIR}/{card.image}');"></div>
  </div>
  <div class="group-hover:opacity-100 opacity-0 translate-y-full group-hover:translate-y-0 transition-all duration-200 flex flex-col gap-4 w-full">
    <div class="bg-black/40 backdrop-blur-sm border border-white/30 rounded-lg px-6 py-3 text-white transition-all duration-200 w-full">
      <p class="text-white font-semibold text-lg">{card.prompt}</p>
      <p class="text-white/75 font-regular text-base">{card.model.id}</p>
    </div>
  </div>
  {#if displayReactions}
    <Reactions reactions={card.reactions} gallery_id={card.id} />
  {/if}
  {#if onDelete}
    <button class="absolute bottom-3 right-3 p-2.5  rounded-full bg-red-500 backdrop-blur-sm transition-all duration-200 hover:bg-red-700" on:click={() => handleDelete(card.id)}>
      <Icon icon="ic:round-delete" class="text-white w-5 h-5" />
    </button>
  {/if}
  {#if loading}
    <Loading />
  {/if}
</div>