Spaces:
Runtime error
Runtime error
| 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 | |
| } | |
| } |