Spaces:
Runtime error
Runtime error
import { useState } from "react" | |
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" | |
import { useLocalStorage } from 'react-use'; | |
import { Image } from "@/utils/type" | |
import list_styles from "@/assets/list_styles.json" | |
import { useCollection } from "@/components/modal/useCollection"; | |
import { useUser } from "@/utils/useUser"; | |
export const useInputGeneration = () => { | |
const { setOpen } = useCollection(); | |
const { user } = useUser(); | |
const [myGenerationsId, setGenerationsId] = useLocalStorage<any>('my-own-generations', []); | |
const { data: prompt } = useQuery(["prompt"], () => { | |
return '' | |
}, { | |
refetchOnWindowFocus: false, | |
refetchOnMount: false, | |
refetchOnReconnect: false, | |
initialData: '' | |
}) | |
const setPrompt = (str:string) => client.setQueryData(["prompt"], () => str) | |
const { data: style } = useQuery(["style"], () => { | |
return list_styles[0].name | |
}, { | |
refetchOnWindowFocus: false, | |
refetchOnMount: false, | |
refetchOnReconnect: false, | |
initialData: '' | |
}) | |
const setStyle = (str:string) => client.setQueryData(["style"], () => str) | |
const client = useQueryClient() | |
const { mutate: submit, isLoading: loading } = useMutation( | |
["generation"], | |
async () => { | |
const removeAllEmptySpace = prompt?.replace(/\s/g, '') | |
if (removeAllEmptySpace === '') return null | |
const id = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15) | |
if (!hasMadeFirstGeneration) setFirstGenerationDone() | |
client.setQueryData(["collections"], (old: any) => { | |
return { | |
pagination: old?.pagination, | |
images: [{ | |
id, | |
loading: true, | |
prompt | |
}, ...old?.images as Image[]] | |
} | |
}) | |
const response = await fetch("/api", { | |
method: "POST", | |
body: JSON.stringify({ | |
inputs: prompt, | |
style, | |
userId: user?.sub, | |
}), | |
}) | |
const data = await response.json() | |
client.setQueryData(["collections"], (old: any) => { | |
const newArray = [...old?.images as Image[]] | |
const index = newArray.findIndex((item: Image) => item.id === id) | |
newArray[index] = !data.ok ? { | |
...newArray[index], | |
error: data.message | |
} : data?.image as Image | |
return { | |
...old, | |
images:newArray, | |
} | |
}) | |
if (!data.ok) return null | |
setGenerationsId(myGenerationsId?.length ? [...myGenerationsId, data?.image?.id] : [data?.image?.id]) | |
setOpen(data?.image?.id) | |
return data ?? {} | |
} | |
) | |
const { data: hasMadeFirstGeneration } = useQuery(["firstGenerationDone"], () => { | |
return false | |
}, { | |
refetchOnWindowFocus: false, | |
refetchOnMount: false, | |
refetchOnReconnect: false, | |
initialData: false | |
}) | |
const setFirstGenerationDone = () => client.setQueryData(["firstGenerationDone"], () => true) | |
return { | |
prompt, | |
setPrompt, | |
loading, | |
submit, | |
hasMadeFirstGeneration, | |
list_styles, | |
style, | |
setStyle | |
} | |
} | |