enzostvs's picture
enzostvs HF Staff
navigate between images + manage my generations
5033071
import { useMemo, useState } from "react"
import { useQuery, useQueryClient } from "@tanstack/react-query"
import { Collection, Image } from "@/utils/type"
import { useUser } from "@/utils/useUser"
import { useUpdateEffect } from "react-use"
export const useCollection = (initialId ?: string) => {
const { user, token } = useUser()
const [id, setId] = useState(initialId)
const [loading, setLoading] = useState(false)
const { data: open } = useQuery(["modal"], () => {
return null
}, {
refetchOnWindowFocus: false,
refetchOnMount: false,
refetchOnReconnect: false,
initialData: null
})
const setOpen = (id: string | null) => client.setQueryData(["modal"], () => id)
const client = useQueryClient()
const collection = useMemo(() => {
const collections = client.getQueryData<Collection>(["collections"])
if (!collections?.images) {
setOpen(null)
return null
}
return collections?.images?.find((collection) => collection.id === id)
}, [id, loading])
useUpdateEffect(() => setId(initialId), [initialId])
const updateVisibility = async () => {
setLoading(true)
const response = await fetch(`/api/collections/${collection?.id}/visibility`, {
method: "PUT",
headers: {
'Authorization': user?.sub ? token : "",
}
})
const data = await response.json()
if (data.ok) {
client.setQueryData(["collections"], (old: any) => {
return {
...old,
images: old.images.map((collection: Image) => {
if (collection.id === data.image.id) {
return data.image
}
return collection
})
}
})
}
setLoading(false)
}
const remove = async () => {
setLoading(true)
const response = await fetch(`/api/collections/${collection?.id}`, {
method: "DELETE",
headers: {
'Authorization': user?.sub ? token : "",
}
})
const data = await response.json()
if (data.ok) {
client.setQueryData(["collections"], (old: any) => {
return {
...old,
images: old.images.filter((col: Image) => col.id !== collection?.id)
}
})
setOpen(null)
}
setLoading(false)
}
const next = () => {
const collections = client.getQueryData<Collection>(["collections"])
if (!collections?.images) {
return null
}
const index = collections?.images?.findIndex((collection) => collection.id === id)
if (index === -1) {
return null
}
const next = collections?.images[index + 1]
if (!next) {
return null
}
setId(next.id)
}
const previous = () => {
const collections = client.getQueryData<Collection>(["collections"])
if (!collections?.images) {
return null
}
const index = collections?.images?.findIndex((collection) => collection.id === id)
if (index === -1) {
return null
}
const previous = collections?.images[index - 1]
if (!previous) {
return null
}
setId(previous.id)
}
return {
collection,
open,
setOpen,
updateVisibility,
remove,
next,
previous
}
}