Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
replace share with a post reauest
Browse files- src/lib/components/community/reactions/Reaction.svelte +0 -1
- src/lib/components/community/reactions/Reactions.svelte +3 -3
- src/lib/components/generate/Response.svelte +7 -12
- src/routes/api/community/+server.ts +1 -0
- src/routes/api/community/[id]/publish/+server.ts +47 -0
- src/routes/api/generate/+server.ts +2 -2
- src/routes/api/models/[id]/+server.ts +3 -0
src/lib/components/community/reactions/Reaction.svelte
CHANGED
@@ -23,7 +23,6 @@
|
|
23 |
</script>
|
24 |
|
25 |
<UserIsLogged>
|
26 |
-
<!-- liked -->
|
27 |
<button
|
28 |
class="rounded-full bg-white text-neutral-800 font-bold flex items-center justify-start gap-1.5 px-3 py-1 border border-white hover:bg-neutral-200 text-sm"
|
29 |
class:bg-opacity-60={!liked}
|
|
|
23 |
</script>
|
24 |
|
25 |
<UserIsLogged>
|
|
|
26 |
<button
|
27 |
class="rounded-full bg-white text-neutral-800 font-bold flex items-center justify-start gap-1.5 px-3 py-1 border border-white hover:bg-neutral-200 text-sm"
|
28 |
class:bg-opacity-60={!liked}
|
src/lib/components/community/reactions/Reactions.svelte
CHANGED
@@ -16,7 +16,7 @@
|
|
16 |
return {
|
17 |
emoji,
|
18 |
count: reactions.filter((reaction) => reaction.emoji === emoji).length,
|
19 |
-
liked: !!reactions.find((reaction) => reaction.emoji === emoji && reaction.
|
20 |
};
|
21 |
});
|
22 |
};
|
@@ -34,7 +34,7 @@
|
|
34 |
if (deleted) {
|
35 |
reactions = reactions.filter((reaction) => reaction.id !== id);
|
36 |
} else {
|
37 |
-
reactions = [...reactions, { emoji,
|
38 |
}
|
39 |
}}
|
40 |
/>
|
@@ -44,6 +44,6 @@
|
|
44 |
reactions={groupedReactions}
|
45 |
{gallery_id}
|
46 |
onAdd={(emoji, id) => {
|
47 |
-
reactions = [...reactions, { emoji,
|
48 |
}}
|
49 |
/>
|
|
|
16 |
return {
|
17 |
emoji,
|
18 |
count: reactions.filter((reaction) => reaction.emoji === emoji).length,
|
19 |
+
liked: !!reactions.find((reaction) => reaction.emoji === emoji && reaction.userId === user?.sub)
|
20 |
};
|
21 |
});
|
22 |
};
|
|
|
34 |
if (deleted) {
|
35 |
reactions = reactions.filter((reaction) => reaction.id !== id);
|
36 |
} else {
|
37 |
+
reactions = [...reactions, { emoji, userId: user?.sub, galleryId: gallery_id, id }];
|
38 |
}
|
39 |
}}
|
40 |
/>
|
|
|
44 |
reactions={groupedReactions}
|
45 |
{gallery_id}
|
46 |
onAdd={(emoji, id) => {
|
47 |
+
reactions = [...reactions, { emoji, userId: user?.sub, galleryId: gallery_id, id }];
|
48 |
}}
|
49 |
/>
|
src/lib/components/generate/Response.svelte
CHANGED
@@ -1,15 +1,16 @@
|
|
1 |
<script lang="ts">
|
2 |
import { get } from "svelte/store";
|
3 |
import { generationStore } from "$lib/stores/use-generation";
|
4 |
-
import UserIsLogged from '$lib/components/UserIsLogged.svelte';
|
5 |
|
6 |
import Button from "$lib/components/Button.svelte";
|
|
|
7 |
|
8 |
let generation = get(generationStore);
|
9 |
export let loading_generation: boolean = false;
|
10 |
|
11 |
let loading: boolean = false;
|
12 |
let already_saved: boolean = false;
|
|
|
13 |
|
14 |
const saveImage = () => {
|
15 |
const link = document.createElement('a');
|
@@ -23,12 +24,11 @@
|
|
23 |
const share = () => {
|
24 |
if (loading) return;
|
25 |
loading = true;
|
26 |
-
fetch(`/api/
|
27 |
method: "POST",
|
28 |
headers: {
|
29 |
"Content-Type": "application/json"
|
30 |
},
|
31 |
-
body: JSON.stringify({ image: generation?.image, generation: generation?.form })
|
32 |
}).then(() => {
|
33 |
loading = false;
|
34 |
already_saved = true;
|
@@ -85,7 +85,7 @@
|
|
85 |
<div class="p-8 w-full">
|
86 |
<div class="w-full flex items-center justify-end gap-4">
|
87 |
<Button size="lg" theme="light" icon="material-symbols:save" iconPosition="right" onClick={saveImage}>Download</Button>
|
88 |
-
|
89 |
<Button
|
90 |
size="lg"
|
91 |
theme="blue"
|
@@ -93,21 +93,16 @@
|
|
93 |
iconPosition="right"
|
94 |
loading={loading}
|
95 |
onClick={share}
|
96 |
-
|
97 |
-
|
98 |
{#if already_saved}
|
99 |
Shared!
|
100 |
{:else}
|
101 |
Share with community
|
102 |
{/if}
|
103 |
</Button>
|
104 |
-
|
105 |
</div>
|
106 |
-
<p class="text-neutral-500 text-sm text-right mt-2.5">
|
107 |
-
All images not shared with the community are deleted right after generation.
|
108 |
-
<br>
|
109 |
-
Your informations are not shared with anyone.
|
110 |
-
</p>
|
111 |
{#if generation?.form}
|
112 |
<div class="mt-6 grid grid-cols-1 gap-4">
|
113 |
<div>
|
|
|
1 |
<script lang="ts">
|
2 |
import { get } from "svelte/store";
|
3 |
import { generationStore } from "$lib/stores/use-generation";
|
|
|
4 |
|
5 |
import Button from "$lib/components/Button.svelte";
|
6 |
+
import { userStore } from "$lib/stores/use-user";
|
7 |
|
8 |
let generation = get(generationStore);
|
9 |
export let loading_generation: boolean = false;
|
10 |
|
11 |
let loading: boolean = false;
|
12 |
let already_saved: boolean = false;
|
13 |
+
let user = get(userStore)
|
14 |
|
15 |
const saveImage = () => {
|
16 |
const link = document.createElement('a');
|
|
|
24 |
const share = () => {
|
25 |
if (loading) return;
|
26 |
loading = true;
|
27 |
+
fetch(`/api/community/${generation?.gallery?.id}/publish`, {
|
28 |
method: "POST",
|
29 |
headers: {
|
30 |
"Content-Type": "application/json"
|
31 |
},
|
|
|
32 |
}).then(() => {
|
33 |
loading = false;
|
34 |
already_saved = true;
|
|
|
85 |
<div class="p-8 w-full">
|
86 |
<div class="w-full flex items-center justify-end gap-4">
|
87 |
<Button size="lg" theme="light" icon="material-symbols:save" iconPosition="right" onClick={saveImage}>Download</Button>
|
88 |
+
{#if user?.sub}
|
89 |
<Button
|
90 |
size="lg"
|
91 |
theme="blue"
|
|
|
93 |
iconPosition="right"
|
94 |
loading={loading}
|
95 |
onClick={share}
|
96 |
+
disabled={loading || already_saved}
|
97 |
+
>
|
98 |
{#if already_saved}
|
99 |
Shared!
|
100 |
{:else}
|
101 |
Share with community
|
102 |
{/if}
|
103 |
</Button>
|
104 |
+
{/if}
|
105 |
</div>
|
|
|
|
|
|
|
|
|
|
|
106 |
{#if generation?.form}
|
107 |
<div class="mt-6 grid grid-cols-1 gap-4">
|
108 |
<div>
|
src/routes/api/community/+server.ts
CHANGED
@@ -39,6 +39,7 @@ export async function GET(request : RequestEvent) {
|
|
39 |
|
40 |
const total_reposId = await prisma.gallery.count({
|
41 |
where: {
|
|
|
42 |
OR: [
|
43 |
{ prompt: { contains: search } },
|
44 |
]
|
|
|
39 |
|
40 |
const total_reposId = await prisma.gallery.count({
|
41 |
where: {
|
42 |
+
isPublic: true,
|
43 |
OR: [
|
44 |
{ prompt: { contains: search } },
|
45 |
]
|
src/routes/api/community/[id]/publish/+server.ts
ADDED
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { json, type RequestEvent } from '@sveltejs/kit';
|
2 |
+
import { tokenIsAvailable } from '$lib/utils';
|
3 |
+
import prisma from '$lib/prisma';
|
4 |
+
|
5 |
+
/** @type {import('./$types').RequestHandler} */
|
6 |
+
|
7 |
+
export async function POST({ cookies, params } : RequestEvent) {
|
8 |
+
const id = params.id
|
9 |
+
|
10 |
+
const gallery = await prisma.gallery.findFirst({
|
11 |
+
where: {
|
12 |
+
id,
|
13 |
+
},
|
14 |
+
})
|
15 |
+
if (!gallery) {
|
16 |
+
return json({
|
17 |
+
error: "Image not found",
|
18 |
+
}, { status: 404 })
|
19 |
+
}
|
20 |
+
|
21 |
+
const token = cookies.get('hf_access_token')
|
22 |
+
if (!token) {
|
23 |
+
return json({
|
24 |
+
error: "You must be logged",
|
25 |
+
}, { status: 401 })
|
26 |
+
}
|
27 |
+
|
28 |
+
const is_token_available = await tokenIsAvailable(token)
|
29 |
+
if (!is_token_available) {
|
30 |
+
return json({
|
31 |
+
error: "Invalid token",
|
32 |
+
}, { status: 401 })
|
33 |
+
}
|
34 |
+
|
35 |
+
await prisma.gallery.update({
|
36 |
+
where: {
|
37 |
+
id,
|
38 |
+
},
|
39 |
+
data: {
|
40 |
+
isPublic: true,
|
41 |
+
}
|
42 |
+
})
|
43 |
+
|
44 |
+
return json({
|
45 |
+
success: true,
|
46 |
+
})
|
47 |
+
}
|
src/routes/api/generate/+server.ts
CHANGED
@@ -63,9 +63,9 @@ export async function POST({ request, cookies } : RequestEvent) {
|
|
63 |
if (token) {
|
64 |
const user = await tokenIsAvailable(token)
|
65 |
if (user?.sub) {
|
66 |
-
const dir = await promises.opendir(
|
67 |
if (!dir) {
|
68 |
-
await promises.mkdir(
|
69 |
}
|
70 |
const file_name_formatted = randomUUID() + "_" + generation?.inputs?.replaceAll(/[^a-zA-Z0-9]/g, "-") + ".png"
|
71 |
await promises.writeFile(`${publicEnv.PUBLIC_FILE_UPLOAD_DIR}/${file_name_formatted}`, response)
|
|
|
63 |
if (token) {
|
64 |
const user = await tokenIsAvailable(token)
|
65 |
if (user?.sub) {
|
66 |
+
const dir = await promises.opendir(publicEnv.PUBLIC_FILE_UPLOAD_DIR).catch(() => null)
|
67 |
if (!dir) {
|
68 |
+
await promises.mkdir(publicEnv.PUBLIC_FILE_UPLOAD_DIR)
|
69 |
}
|
70 |
const file_name_formatted = randomUUID() + "_" + generation?.inputs?.replaceAll(/[^a-zA-Z0-9]/g, "-") + ".png"
|
71 |
await promises.writeFile(`${publicEnv.PUBLIC_FILE_UPLOAD_DIR}/${file_name_formatted}`, response)
|
src/routes/api/models/[id]/+server.ts
CHANGED
@@ -25,6 +25,9 @@ export async function GET({ url, params } : RequestEvent) {
|
|
25 |
prompt: true,
|
26 |
image: true,
|
27 |
createdAt: true,
|
|
|
|
|
|
|
28 |
}
|
29 |
},
|
30 |
comments: {
|
|
|
25 |
prompt: true,
|
26 |
image: true,
|
27 |
createdAt: true,
|
28 |
+
},
|
29 |
+
where: {
|
30 |
+
isPublic: true
|
31 |
}
|
32 |
},
|
33 |
comments: {
|