diff --git a/hooks/useLinks.tsx b/hooks/useLinks.tsx index bec2d49c..6d0e935d 100644 --- a/hooks/useLinks.tsx +++ b/hooks/useLinks.tsx @@ -18,7 +18,7 @@ export default function useLinks( searchByTextContent, }: LinkRequestQuery = { sort: 0 } ) { - const { links, setLinks, resetLinks, selectedLinks, setSelectedLinks } = + const { links, setLinks, resetLinks, selectedLinks, setSelectedLinks, setAllLinksOfCollection } = useLinkStore(); const router = useRouter(); @@ -26,6 +26,34 @@ export default function useLinks( const { reachedBottom, setReachedBottom } = useDetectPageBottom(); + const getPath = (params?: LinkRequestQuery) => { + const buildQueryString = (params: LinkRequestQuery) => { + return Object.keys(params) + .filter((key) => params[key as keyof LinkRequestQuery] !== undefined) + .map( + (key) => + `${encodeURIComponent(key)}=${encodeURIComponent( + params[key as keyof LinkRequestQuery] as string + )}` + ) + .join("&"); + }; + let queryString = ''; + if (params) { + queryString = buildQueryString(params); + } + + let basePath; + + if (router.pathname === "/dashboard") basePath = "/api/v1/dashboard"; + else if (router.pathname.startsWith("/public/collections/[id]")) { + queryString = queryString + "&collectionId=" + router.query.id; + basePath = "/api/v1/public/collections/links"; + } else basePath = "/api/v1/links"; + + return `${basePath}?${queryString}`; + } + const getLinks = async (isInitialCall: boolean, cursor?: number) => { const params = { sort, @@ -40,32 +68,10 @@ export default function useLinks( searchByTags, searchByTextContent, }; - - const buildQueryString = (params: LinkRequestQuery) => { - return Object.keys(params) - .filter((key) => params[key as keyof LinkRequestQuery] !== undefined) - .map( - (key) => - `${encodeURIComponent(key)}=${encodeURIComponent( - params[key as keyof LinkRequestQuery] as string - )}` - ) - .join("&"); - }; - - let queryString = buildQueryString(params); - - let basePath; - - if (router.pathname === "/dashboard") basePath = "/api/v1/dashboard"; - else if (router.pathname.startsWith("/public/collections/[id]")) { - queryString = queryString + "&collectionId=" + router.query.id; - basePath = "/api/v1/public/collections/links"; - } else basePath = "/api/v1/links"; - + setIsLoading(true); - const response = await fetch(`${basePath}?${queryString}`); + const response = await fetch(getPath(params)); const data = await response.json(); @@ -74,6 +80,14 @@ export default function useLinks( if (response.ok) setLinks(data.response, isInitialCall); }; + const getAllLinks = async () => { + const response = await fetch(getPath()); + + const data = await response.json(); + + if (response.ok) setAllLinksOfCollection(data.response); + }; + useEffect(() => { // Save the selected links before resetting the links // and then restore the selected links after resetting the links @@ -81,6 +95,7 @@ export default function useLinks( resetLinks(); setSelectedLinks(previouslySelected); + getAllLinks(); getLinks(true); }, [ router, diff --git a/pages/public/collections/[id].tsx b/pages/public/collections/[id].tsx index a75f47f1..18c69dca 100644 --- a/pages/public/collections/[id].tsx +++ b/pages/public/collections/[id].tsx @@ -26,6 +26,7 @@ import ViewDropdown from "@/components/ViewDropdown"; import CardView from "@/components/LinkViews/Layouts/CardView"; import ListView from "@/components/LinkViews/Layouts/ListView"; import useTagStore from "@/store/tags"; +import { Disclosure, Transition } from "@headlessui/react"; // import GridView from "@/components/LinkViews/Layouts/GridView"; const cardVariants: Variants = { @@ -43,9 +44,11 @@ const cardVariants: Variants = { }; export default function PublicCollections() { - const { links } = useLinkStore(); - const tagsInCollection = links.map(l => l.tags).flat(); - + const { links, allLinksOfCollection } = useLinkStore(); + const tagsInCollection = allLinksOfCollection.map(l => l.tags).flat().filter((value, index, self) => + index === self.findIndex((t) => ( + t.name === value.name + ))); const { settings } = useLocalSettingsStore(); const router = useRouter(); @@ -101,7 +104,6 @@ export default function PublicCollections() { const [collection, setCollection] = useState(); - useEffect(() => { if (router.query.id) { getPublicCollectionData(Number(router.query.id), setCollection); @@ -132,6 +134,14 @@ export default function PublicCollections() { [ViewMode.List]: ListView, }; + const [tagDisclosure, setTagDisclosure] = useState(() => { + const storedValue = localStorage.getItem("tagDisclosureForPublicCollection" + collection?.id); + return storedValue ? storedValue === "true" : true; + }); + useEffect(() => { + localStorage.setItem("tagDisclosureForPublicCollection" + collection?.id, tagDisclosure ? "true" : "false"); + }, [tagDisclosure]); + // @ts-ignore const LinkComponent = linkView[viewMode]; @@ -243,10 +253,31 @@ export default function PublicCollections() { {collection.tagsArePublic && tagsInCollection[0] && ( -
-

Browse by topic

-
-