Spaces:
Runtime error
Runtime error
Esteves Enzo commited on
Commit ·
0891679
1
Parent(s): 25c0ab6
manage error
Browse files
app/api/route.ts
CHANGED
|
@@ -6,13 +6,11 @@ const prisma = new PrismaClient()
|
|
| 6 |
export async function POST(
|
| 7 |
request: Request,
|
| 8 |
) {
|
| 9 |
-
const { inputs } = await request.json()
|
| 10 |
-
|
| 11 |
const response = await fetch('https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0', {
|
| 12 |
method: 'POST',
|
| 13 |
body: JSON.stringify({
|
| 14 |
inputs,
|
| 15 |
-
stream: true,
|
| 16 |
}),
|
| 17 |
headers: {
|
| 18 |
Authorization: `Bearer ${process.env.NEXT_PUBLIC_APP_HF_TOKEN}`,
|
|
@@ -21,6 +19,10 @@ export async function POST(
|
|
| 21 |
},
|
| 22 |
})
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
const blob = await response.blob()
|
| 25 |
const headers = new Headers();
|
| 26 |
headers.set("Content-Type", "image/*");
|
|
@@ -35,5 +37,6 @@ export async function POST(
|
|
| 35 |
},
|
| 36 |
})
|
| 37 |
|
| 38 |
-
return Response.json({ blob: new_blob, status: 200,
|
|
|
|
| 39 |
}
|
|
|
|
| 6 |
export async function POST(
|
| 7 |
request: Request,
|
| 8 |
) {
|
| 9 |
+
const { inputs } = await request.json()
|
|
|
|
| 10 |
const response = await fetch('https://api-inference.huggingface.co/models/stabilityai/stable-diffusion-xl-base-1.0', {
|
| 11 |
method: 'POST',
|
| 12 |
body: JSON.stringify({
|
| 13 |
inputs,
|
|
|
|
| 14 |
}),
|
| 15 |
headers: {
|
| 16 |
Authorization: `Bearer ${process.env.NEXT_PUBLIC_APP_HF_TOKEN}`,
|
|
|
|
| 19 |
},
|
| 20 |
})
|
| 21 |
|
| 22 |
+
// avoid json parse error
|
| 23 |
+
const res = await response.clone().json().catch(() => ({}));
|
| 24 |
+
if (res?.error) return Response.json({ status: response.status, ok: false, message: res.error });
|
| 25 |
+
|
| 26 |
const blob = await response.blob()
|
| 27 |
const headers = new Headers();
|
| 28 |
headers.set("Content-Type", "image/*");
|
|
|
|
| 37 |
},
|
| 38 |
})
|
| 39 |
|
| 40 |
+
return Response.json({ blob: new_blob, status: 200, ok: true, headers });
|
| 41 |
+
|
| 42 |
}
|
components/main/collections/collection.tsx
CHANGED
|
@@ -9,7 +9,7 @@ interface Props {
|
|
| 9 |
index: number;
|
| 10 |
collection: CollectionType;
|
| 11 |
className?: string;
|
| 12 |
-
onOpen: (id:
|
| 13 |
}
|
| 14 |
|
| 15 |
export const Collection: React.FC<Props> = ({
|
|
|
|
| 9 |
index: number;
|
| 10 |
collection: CollectionType;
|
| 11 |
className?: string;
|
| 12 |
+
onOpen: (id: string) => void;
|
| 13 |
}
|
| 14 |
|
| 15 |
export const Collection: React.FC<Props> = ({
|
components/main/collections/index.tsx
CHANGED
|
@@ -23,8 +23,24 @@ export const Collections: React.FC<{ category: string }> = ({ category }) => {
|
|
| 23 |
<>
|
| 24 |
<div className="mx-auto grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-5 mt-8 lg:mt-14">
|
| 25 |
{collections?.map((collection: CollectionType, i: number) =>
|
| 26 |
-
collection?.
|
| 27 |
-
<CollectionLoading
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
) : (
|
| 29 |
<Collection
|
| 30 |
key={category + collection.id}
|
|
|
|
| 23 |
<>
|
| 24 |
<div className="mx-auto grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-5 mt-8 lg:mt-14">
|
| 25 |
{collections?.map((collection: CollectionType, i: number) =>
|
| 26 |
+
collection?.loading ? (
|
| 27 |
+
<CollectionLoading
|
| 28 |
+
key={i}
|
| 29 |
+
prompt={collection.prompt}
|
| 30 |
+
error={collection.error}
|
| 31 |
+
className={classNames("", {
|
| 32 |
+
"!translate-y-12":
|
| 33 |
+
breakpoint === "XL"
|
| 34 |
+
? i % 5 === 1 || i % 5 === 3
|
| 35 |
+
: breakpoint === "L"
|
| 36 |
+
? i % 4 === 1 || i % 4 === 3
|
| 37 |
+
: breakpoint === "S"
|
| 38 |
+
? i % 3 === 1
|
| 39 |
+
: breakpoint === "XS"
|
| 40 |
+
? i % 2 === 1
|
| 41 |
+
: false,
|
| 42 |
+
})}
|
| 43 |
+
/>
|
| 44 |
) : (
|
| 45 |
<Collection
|
| 46 |
key={category + collection.id}
|
components/main/collections/loading.tsx
CHANGED
|
@@ -1,27 +1,42 @@
|
|
| 1 |
-
import { useMemo } from "react";
|
| 2 |
import { motion } from "framer-motion";
|
| 3 |
-
|
| 4 |
-
import
|
| 5 |
|
| 6 |
interface Props {
|
| 7 |
prompt: string;
|
|
|
|
|
|
|
| 8 |
}
|
| 9 |
|
| 10 |
-
export const CollectionLoading: React.FC<Props> = ({
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
return (
|
| 12 |
-
<div className=
|
| 13 |
<motion.div
|
| 14 |
initial={{ y: 100, opacity: 0 }}
|
| 15 |
animate={{ y: 0, opacity: 1 }}
|
| 16 |
transition={{ duration: 0.35, delay: 0.1 }}
|
| 17 |
-
className=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
>
|
| 19 |
-
|
| 20 |
-
<
|
| 21 |
-
|
| 22 |
-
<
|
| 23 |
-
|
| 24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
</motion.div>
|
| 26 |
</div>
|
| 27 |
);
|
|
|
|
|
|
|
| 1 |
import { motion } from "framer-motion";
|
| 2 |
+
import { FaSadCry } from "react-icons/fa";
|
| 3 |
+
import classNames from "classnames";
|
| 4 |
|
| 5 |
interface Props {
|
| 6 |
prompt: string;
|
| 7 |
+
error?: string;
|
| 8 |
+
className?: string;
|
| 9 |
}
|
| 10 |
|
| 11 |
+
export const CollectionLoading: React.FC<Props> = ({
|
| 12 |
+
prompt,
|
| 13 |
+
error,
|
| 14 |
+
className,
|
| 15 |
+
}) => {
|
| 16 |
return (
|
| 17 |
+
<div className={`h-[377px] w-full relative ${className}`}>
|
| 18 |
<motion.div
|
| 19 |
initial={{ y: 100, opacity: 0 }}
|
| 20 |
animate={{ y: 0, opacity: 1 }}
|
| 21 |
transition={{ duration: 0.35, delay: 0.1 }}
|
| 22 |
+
className={classNames(
|
| 23 |
+
"rounded-3xl h-[377px] cursor-pointer group relative group flex flex-col justify-between p-8 z-[1]",
|
| 24 |
+
{
|
| 25 |
+
"bg-primary/70": !error,
|
| 26 |
+
"bg-red-500/80 ring-8 ring-red-400/20": error,
|
| 27 |
+
}
|
| 28 |
+
)}
|
| 29 |
>
|
| 30 |
+
{error ? (
|
| 31 |
+
<FaSadCry className="text-white/60 text-5xl" />
|
| 32 |
+
) : (
|
| 33 |
+
<div className="loading-dots translate-y-[5px]">
|
| 34 |
+
<span />
|
| 35 |
+
<span />
|
| 36 |
+
<span />
|
| 37 |
+
</div>
|
| 38 |
+
)}
|
| 39 |
+
<p className="text-white/70 font-semibold text-xl">{error ?? prompt}</p>
|
| 40 |
</motion.div>
|
| 41 |
</div>
|
| 42 |
);
|
components/main/hooks/useInputGeneration.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import { useState } from "react"
|
| 2 |
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
|
| 3 |
import { useLocalStorage } from 'react-use';
|
| 4 |
|
|
@@ -26,10 +26,13 @@ export const useInputGeneration = () => {
|
|
| 26 |
const { mutate: submit, isLoading: loading } = useMutation(
|
| 27 |
["generation"],
|
| 28 |
async () => {
|
|
|
|
|
|
|
| 29 |
if (!hasMadeFirstGeneration) setFirstGenerationDone()
|
| 30 |
client.setQueryData(["collections"], (old) => {
|
| 31 |
return [{
|
| 32 |
-
id
|
|
|
|
| 33 |
blob: {
|
| 34 |
type: "image/png",
|
| 35 |
data: new ArrayBuffer(0),
|
|
@@ -49,23 +52,26 @@ export const useInputGeneration = () => {
|
|
| 49 |
})
|
| 50 |
const data = await response.json()
|
| 51 |
|
| 52 |
-
if (!response.ok) {
|
| 53 |
-
throw new Error(data.message)
|
| 54 |
-
}
|
| 55 |
-
|
| 56 |
client.setQueryData(["collections"], (old) => {
|
| 57 |
const newArray = [...old as Collection[]]
|
| 58 |
-
const index = newArray.findIndex((item: Collection) => item.id ===
|
|
|
|
|
|
|
| 59 |
|
| 60 |
-
newArray[index] = data
|
|
|
|
|
|
|
|
|
|
| 61 |
|
| 62 |
return newArray
|
| 63 |
})
|
| 64 |
|
|
|
|
|
|
|
| 65 |
setGenerationsId(myGenerationsId?.length ? [...myGenerationsId, data?.blob?.id] : [data?.blob?.id])
|
| 66 |
setOpen(data?.blob?.id)
|
| 67 |
return data ?? {}
|
| 68 |
-
}
|
| 69 |
)
|
| 70 |
|
| 71 |
const { data: hasMadeFirstGeneration } = useQuery(["firstGenerationDone"], () => {
|
|
|
|
| 1 |
+
import { useId, useState } from "react"
|
| 2 |
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"
|
| 3 |
import { useLocalStorage } from 'react-use';
|
| 4 |
|
|
|
|
| 26 |
const { mutate: submit, isLoading: loading } = useMutation(
|
| 27 |
["generation"],
|
| 28 |
async () => {
|
| 29 |
+
// generate string random ID
|
| 30 |
+
const id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15)
|
| 31 |
if (!hasMadeFirstGeneration) setFirstGenerationDone()
|
| 32 |
client.setQueryData(["collections"], (old) => {
|
| 33 |
return [{
|
| 34 |
+
id,
|
| 35 |
+
loading: true,
|
| 36 |
blob: {
|
| 37 |
type: "image/png",
|
| 38 |
data: new ArrayBuffer(0),
|
|
|
|
| 52 |
})
|
| 53 |
const data = await response.json()
|
| 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
client.setQueryData(["collections"], (old) => {
|
| 56 |
const newArray = [...old as Collection[]]
|
| 57 |
+
const index = newArray.findIndex((item: Collection) => item.id === id)
|
| 58 |
+
|
| 59 |
+
console.log(data, index, newArray[index])
|
| 60 |
|
| 61 |
+
newArray[index] = !data.ok ? {
|
| 62 |
+
...newArray[index],
|
| 63 |
+
error: data.message
|
| 64 |
+
} : data?.blob as Collection
|
| 65 |
|
| 66 |
return newArray
|
| 67 |
})
|
| 68 |
|
| 69 |
+
if (!data.ok) return null
|
| 70 |
+
|
| 71 |
setGenerationsId(myGenerationsId?.length ? [...myGenerationsId, data?.blob?.id] : [data?.blob?.id])
|
| 72 |
setOpen(data?.blob?.id)
|
| 73 |
return data ?? {}
|
| 74 |
+
}
|
| 75 |
)
|
| 76 |
|
| 77 |
const { data: hasMadeFirstGeneration } = useQuery(["firstGenerationDone"], () => {
|
components/modal/useCollection.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { useQuery, useQueryClient } from "@tanstack/react-query"
|
|
| 3 |
|
| 4 |
import { Collection } from "@/utils/type"
|
| 5 |
|
| 6 |
-
export const useCollection = (id?:
|
| 7 |
const { data: open } = useQuery(["modal"], () => {
|
| 8 |
return null
|
| 9 |
}, {
|
|
@@ -12,7 +12,7 @@ export const useCollection = (id?: number) => {
|
|
| 12 |
refetchOnReconnect: false,
|
| 13 |
initialData: null
|
| 14 |
})
|
| 15 |
-
const setOpen = (id:
|
| 16 |
|
| 17 |
const client = useQueryClient()
|
| 18 |
|
|
|
|
| 3 |
|
| 4 |
import { Collection } from "@/utils/type"
|
| 5 |
|
| 6 |
+
export const useCollection = (id?: string) => {
|
| 7 |
const { data: open } = useQuery(["modal"], () => {
|
| 8 |
return null
|
| 9 |
}, {
|
|
|
|
| 12 |
refetchOnReconnect: false,
|
| 13 |
initialData: null
|
| 14 |
})
|
| 15 |
+
const setOpen = (id: string | null) => client.setQueryData(["modal"], () => id)
|
| 16 |
|
| 17 |
const client = useQueryClient()
|
| 18 |
|
utils/type.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
| 1 |
export interface Collection {
|
| 2 |
-
id:
|
| 3 |
blob: {
|
| 4 |
type: string;
|
| 5 |
data: ArrayBuffer
|
| 6 |
};
|
| 7 |
prompt: string;
|
| 8 |
createdAt: string;
|
|
|
|
|
|
|
| 9 |
}
|
|
|
|
| 1 |
export interface Collection {
|
| 2 |
+
id: string;
|
| 3 |
blob: {
|
| 4 |
type: string;
|
| 5 |
data: ArrayBuffer
|
| 6 |
};
|
| 7 |
prompt: string;
|
| 8 |
createdAt: string;
|
| 9 |
+
error?: string;
|
| 10 |
+
loading?: boolean;
|
| 11 |
}
|