File size: 2,915 Bytes
dd7ec11
404baa5
f05d33c
 
35140b4
f05d33c
 
 
35140b4
eb29a95
97ec6f2
 
35140b4
 
 
 
 
dd7ec11
f05d33c
644d65a
f05d33c
 
 
 
 
 
 
 
 
 
 
35140b4
 
 
 
 
 
 
c051b6f
 
f05d33c
 
 
 
dd7ec11
644d65a
f05d33c
dd7ec11
35140b4
c051b6f
dd7ec11
a764df6
 
 
 
 
dd7ec11
35140b4
 
 
 
41d37c3
 
 
 
 
 
 
 
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
68
69
70
71
72
73
74
75
76
<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;
  }

  console.log(import.meta.env.BASE_URL)
</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('{import.meta.env.BASE_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={(e) => {
        e.stopPropagation();
        e.preventDefault();
        handleDelete(card.id);
      }}
    >
      <Icon icon="ic:round-delete" class="text-white w-5 h-5" />
    </button>
  {/if}
  {#if loading}
    <Loading />
  {/if}
</div>