diff --git a/app/api/galleries/route.ts b/app/api/galleries/route.ts index e42348e..44aebcd 100644 --- a/app/api/galleries/route.ts +++ b/app/api/galleries/route.ts @@ -2,11 +2,39 @@ import { NextResponse } from "next/server"; import { createClient } from "@/utils/supabase/server"; -export async function GET(request: Request) { +export async function POST(request: Request) { const supabase = createClient(); + const url = new URL(request.url); + const search = url.searchParams.get("search"); + const data = await request.json(); + const tags = data.tags; + if(tags.length === 0){ + let { data: galleries, error } = await supabase + .from('galleries') + .select('*') + .ilike('name', `%${search}%`) + .ilike('description', `%${search}%`); + + return NextResponse.json(galleries); + } + else{ + // Rest of the code... let { data: galleries, error } = await supabase - .from('galleries') - .select('*') - return NextResponse.json(galleries) + .from('galleries') + .select('*') + .contains('tags', tags) + .ilike('name', `%${search}%`) + .ilike('description', `%${search}%`) + .order('created_at', { ascending: false }); + + return NextResponse.json(galleries); + return NextResponse.json(galleries); + } } - \ No newline at end of file + +// const tagsResponse = await fetch(`/api/galleries/tags?search=${search}`); +// const tagsData = await tagsResponse.json(); +// const galleriesWithTagData = galleriesData.map((gallery: any) => { +// const tags = tagsData.filter((tag: any) => gallery.tags.includes(tag.id)); +// return { ...gallery, tags }; +// }); \ No newline at end of file diff --git a/app/api/galleries/tags/route.ts b/app/api/galleries/tags/route.ts new file mode 100644 index 0000000..bec42cf --- /dev/null +++ b/app/api/galleries/tags/route.ts @@ -0,0 +1,12 @@ +import { NextResponse } from "next/server"; +import { createClient } from "@/utils/supabase/server"; + + +export async function GET(request: Request) { + const supabase = createClient(); + let { data: tags, error } = await supabase + .from('tags') + .select('*') + return NextResponse.json(tags) +} + \ No newline at end of file diff --git a/app/gallery/page.tsx b/app/gallery/page.tsx index 465b056..6d372dc 100644 --- a/app/gallery/page.tsx +++ b/app/gallery/page.tsx @@ -18,7 +18,10 @@ function PageComponent() { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [selectedGallery, setSelectedGallery] = useState(null); + const [tags, setTags] = useState([]); + const [search, setSearch] = useState(''); const [galleryColumns, setColumns] = useState(0); + const [selectedTags, setSelectedTags] = useState([]); const generateRandomString = function (length:number) { let result = ''; let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; @@ -43,58 +46,122 @@ function PageComponent() { } const getData = async () => { - const galleriesResponse = await fetch('/api/galleries'); - const galleriesData = await galleriesResponse.json(); let { data: { user } } = await supabase.auth.getUser(); + const galleriesResponse = await fetch(`/api/galleries?search=`+search, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ tags:selectedTags }) + }); + console.log(galleriesResponse) + const galleriesData = await galleriesResponse.json(); + const tagsResponse = await fetch(`/api/galleries/tags`); + const tagsData = await tagsResponse.json(); setGalleries(galleriesData); + setTags(tagsData); setUser(user); setLoading(false); } useEffect(() => { getData(); - }, []); - return ( ( user ? ( -
+ }, [selectedTags,search]); + + const handleTagClick = (tag: number) => { + if (selectedTags.includes(tag)) { + setSelectedTags(selectedTags.filter((selectedTag) => selectedTag !== tag)); + } else { + setSelectedTags([...selectedTags, tag]); + } + console.log(selectedTags) + }; + + return ( + user ? ( +
- <> - -
- Background -
-
-
- {galleries.map((gallery, index) => ( - - - ))} -
-
-
+ <> +
+
+
+ setSearch(e.target.value)} + /> + +
+
+
+ +
+ Background +
+ +
+
+ {galleries && galleries.map((gallery, index) => ( + + ))} +
+
-
- {(isOpen ? ( + {isOpen ? ( <> - - - - - ): null)} -
- - ) : ( -

loading

- ))); + + + ) : null} +
+ ) : ( +

loading

+ ) + ); } export default PageComponent; \ No newline at end of file diff --git a/components/ui/gallery.tsx b/components/ui/gallery.tsx index e77e571..c807542 100644 --- a/components/ui/gallery.tsx +++ b/components/ui/gallery.tsx @@ -2,6 +2,7 @@ import { use, useState } from 'react'; import { useEffect } from 'react'; import { render } from 'react-dom'; import Masonry from 'react-masonry-css'; +import PanZoom from 'react-easy-panzoom'; interface GalleryProps { id: string; @@ -173,23 +174,24 @@ const Gallery = ({ id, columns, closeMenu }: GalleryProps) => { Back -
- <> {renderButtons()} - {selectedImage ? ( + {selectedImage ? ( + close()} /> + ) : ( +
{ /> ))} + <> + +
)} - -
); } diff --git a/package-lock.json b/package-lock.json index 1c17f8d..812795b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "prop-types": "^15.8.1", "react": "18.2.0", "react-dom": "18.2.0", + "react-easy-panzoom": "^0.4.4", "react-masonry-css": "^1.0.16", "react-responsive-masonry": "^2.2.0", "simplex-noise": "^4.0.1", @@ -2154,6 +2155,17 @@ "react": "^18.2.0" } }, + "node_modules/react-easy-panzoom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/react-easy-panzoom/-/react-easy-panzoom-0.4.4.tgz", + "integrity": "sha512-1zgT6boDVPcrR3Egcz8KEVpM3fs50o22iIWPRlAqvev0/4nw5RnUNFsvmOJ/b5M2nd8MDGknLmyfBdhjoLB6+g==", + "dependencies": { + "warning": "4.0.3" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -2775,6 +2787,14 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index 089e22b..712aa57 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "prop-types": "^15.8.1", "react": "18.2.0", "react-dom": "18.2.0", + "react-easy-panzoom": "^0.4.4", "react-masonry-css": "^1.0.16", "react-responsive-masonry": "^2.2.0", "simplex-noise": "^4.0.1",