This commit is contained in:
Damien Ostler 2024-06-02 22:23:43 -04:00
parent e7d5e54139
commit 75dad17afe
9 changed files with 150 additions and 23 deletions

View File

@ -17,7 +17,6 @@ export async function GET(
request: Request,
{ params }: { params: { id: string } }
) {
const galleryId = params.id.toLowerCase().replace(/\s+/g, '_');
const supabase = createClient();
const user = await supabase.auth.getUser();
const url = new URL(request.url);
@ -29,16 +28,13 @@ export async function GET(
.select('*')
.eq('name', params.id)
.single();
let { data: files, error } = await supabase.storage.from('galleries').list(galleryId);
let { data: files, error } = await supabase.storage.from('galleries').list(params.id);
if (files == null || files?.length == 0) {
return NextResponse.error();
}
// Loop through each file, download it, convert it to base64, and add the data URL to the array
let { data: blobdata, error: fileError } = await supabase.storage.from('galleries').download(galleryId + "/" + files[0].name);
let { data: blobdata, error: fileError } = await supabase.storage.from('galleries').download(params.id + "/" + files[0].name);
if (fileError || blobdata == null) {
//console.error('Error downloading file:', error);
return NextResponse.error();

View File

@ -0,0 +1,68 @@
import { NextResponse } from "next/server";
import { createClient } from "@/utils/supabase/server";
import path from 'path';
export async function GET(
request: Request,
{ params }: { params: { id: string } }
) {
const id = params.id;
const supabase = createClient();
const { data: gallery, error } = await supabase.from('galleries').select("*").eq('name', id).single();
return NextResponse.json({ gallery });
}
export async function PUT(
request: Request,
{ params }: { params: { id: string } }
) {
const id = params.id;
const supabase = createClient();
const { files, tags, name, nsfw, tier}: { files: File[], tags: string[], name: string, nsfw:boolean, tier:string } = await request.json();
const { data: gallery, error } = await supabase.from('galleries').update({ name, tags, nsfw, tier }).eq('name', id).single();
let { data: galleries, error:galleriesError } = await supabase
.from('galleries')
.select('*');
return NextResponse.json({ success: true, galleries });
}
export async function DELETE(
request: Request,
{ params }: { params: { id: string } }
) {
const id =params.id;
const supabase = createClient();
const { data: gallery, error } = await supabase.from('galleries').delete().eq('name', id).single();
let { data: galleries, error:galleriesError } = await supabase
.from('galleries')
.select('*');
return NextResponse.json({ success: true, galleries });
}
// 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.name));
// return { ...gallery, tags };
// });
// const formData = new FormData();
// formData.append('name', name);
// formData.append('tags', JSON.stringify(tags));
// files.forEach((file: File) => {
// formData.append('files', file);
// });
// const response = await fetch('/api/galleries', {
// method: 'POST',
// body: formData,
// });
// if (response.ok) {
// const data = await response.json();
// // Handle success
// } else {
// // Handle error
// }

View File

@ -0,0 +1,26 @@
import { NextResponse } from "next/server";
import { createClient } from "@/utils/supabase/server";
import path from 'path';
export async function GET(request: Request) {
const supabase = createClient();
let { data: galleries, error } = await supabase
.from('galleries')
.select('*');
return NextResponse.json(galleries);
}
export async function POST(request: Request) {
const supabase = createClient();
const { files, tags, name, nsfw, tier }: { files: File[], tags: string[], name: string, nsfw:boolean, tier:string } = await request.json();
for (let i = 0; i < files.length; i++) {
const file = files[i];
supabase.storage.from('galleries').upload(`${name}/${file.name}`, file);
}
const { data: gallery, error } = await supabase.from('galleries').insert({ name, tags, nsfw, tier, column_number:3 }).single();
let { data: galleries, error:galleriesError } = await supabase
.from('galleries')
.select('*');
return NextResponse.json({ success: true, galleries });
}

View File

@ -15,7 +15,6 @@ export async function POST(request: Request) {
const supabase = createClient();
const data = await request.json();
const { data: tag, error } = await supabase.from('tags').insert({ name: data.tag }).single();
console.log(error)
if (error) {
return NextResponse.error();
}

View File

@ -68,7 +68,7 @@ function PageComponent() {
placeholderTags={[
{ value: "tags", label: "❗️ click here to add tags" },
]}
nsfwButtonEnabled={false}
nsfwButtonEnabled={true}
searchChanged={(search) => {}}
nsfwChanged={(nsfw) => {}}
tagsChanged={(tags) => {}}

View File

@ -68,7 +68,7 @@ function PageComponent() {
return (
<div className="w-full h-1/2 text-white lg:flex justify-center items-center animate-in">
<div className="w-full lg:w-1/3 rounded-md bg-primary opacity-90 p-12 m-1 mt-32 shadow-lg backdrop-blur">
<div className="w-full lg:w-1/3 rounded-md bg-primary opacity-90 g- p-12 m-1 mt-32 shadow-lg backdrop-blur">
<div className="w-full flex">
<input type="text" onChange={(e)=>{setNewTagName(e.target.value)}} className="hover:scale-105 focus:scale-95 mb-8 mr-2 rounded-md bg-info-bright p-2 w-1/2 text-white shadow-lg" placeholder="Tag Name" />
<button onClick={createTag} className="hover:scale-95 ml-2 shadow-lg w-1/2 h-10 text-center bg-success hover:bg-success-light text-white font-bold rounded flex items-center justify-center">
@ -100,7 +100,7 @@ function PageComponent() {
</table>
</div>
</div>
<div className="w-full lg:w-1/2 h-96 rounded-md bg-primary opacity-90 backdrop-blur-lg p-12 m-1 mt-32 shadow-lg">
<div className="w-full lg:w-1/2 h-max rounded-md bg-primary opacity-90 backdrop-blur-lg p-12 m-1 mt-32 shadow-lg">
<div className="w-full flex pb-2">
<SearchInput placeholderTags={[
{ value: "tags", label: "❗️ click here to add tags to search" }
@ -110,7 +110,7 @@ function PageComponent() {
+ Gallery
</a>
</div>
<div className="w-full h-64 overflow-y-scroll no-scrollbar">
<div className="w-full h-96 overflow-y-scroll no-scrollbar">
<table className="w-full mt-8 bg-primary-light rounded">
<tbody>
{/* Replace this with your data mapping logic */}
@ -120,7 +120,7 @@ function PageComponent() {
<td className="px-4 py-2">{item.imageCount}</td>
<td className="px-4 py-2">{item.tier}</td>
<td className="px-4 py-2">
<button className="bg-secondary hover:scale-95 shadow-lg hover:bg-secondary-light text-white font-bold py-2 px-4 rounded float-right">
<button onClick={()=>{ window.location.href=`/gallery/admin/view?id=${encodeURIComponent(item.name)}`}} className="bg-secondary hover:scale-95 shadow-lg hover:bg-secondary-light text-white font-bold py-2 px-4 rounded float-right">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" strokeWidth={1.5} stroke="currentColor" className="size-6">
<path strokeLinecap="round" strokeLinejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m5.231 13.481L15 17.25m-4.5-15H5.625c-.621 0-1.125.504-1.125 1.125v16.5c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Zm3.75 11.625a2.625 2.625 0 1 1-5.25 0 2.625 2.625 0 0 1 5.25 0Z" />
</svg>

View File

@ -11,27 +11,68 @@ function PageComponent() {
const [filePreviews, setFilePreviews] = useState<string[]>([]);
const supabase = createClient();
const user = supabase.auth.getUser();
const [gallery , setGallery] = useState<any>(null);
const [galleryName, setGalleryName] = useState<string>('');
const getData = async () => {
const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get('id');
const galleryResponse = await fetch(`/api/galleries/admin/${id}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const galleryData = await galleryResponse.json();
setGallery(galleryData.gallery);
setGalleryName(galleryData.gallery.name);
}
useEffect(() => {
getData();
}, []);
useEffect(() => {
}, [gallery]);
return (
<div className="w-full text-white flex justify-center items-center animate-in">
<div className="w-full lg:w-1/2 rounded-md opacity-90 backdrop-blur-lg bg-primary p-12 mt-32 shadow-lg">
<div className="w-full flex pb-48">
<GalleryThumbnail id={"Test Gallery"} columns={3} onSelect={function (id: string, columns: number): void {
} } title={""} subscription={""} tags={[]} showNsfw={false} nsfw={false} ></GalleryThumbnail>
<div className="w-full flex pb-72">
{gallery != null && (
<GalleryThumbnail
key={"galleryThumbnail"}
id={gallery}
columns={3}
onSelect={function (id: string, columns: number): void {}}
title={gallery.name}
subscription={gallery.tier}
tags={gallery.tags}
showNsfw={true}
nsfw={gallery.nsfw}
></GalleryThumbnail>
)}
</div>
<div className="w-full flex">
<input
type="text"
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-1/2 text-white"
placeholder="Gallery Name"
value={galleryName}
onChange={(e) => setGalleryName(e.target.value)}
/>
<div className="w-1/6">
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error hover:bg-error-light text-white rounded-md p-2">
<button
onClick={() => (window.location.href = "/gallery/admin")}
className="w-full bg-error hover:bg-error-light text-white rounded-md p-2"
>
Delete
</button>
</div>
<div className="w-1/6">
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error-dark hover:bg-error text-white rounded-md p-2 ml-2">
<button
onClick={() => (window.location.href = "/gallery/admin")}
className="w-full bg-error-dark hover:bg-error text-white rounded-md p-2 ml-2"
>
Back
</button>
</div>
@ -47,7 +88,7 @@ function PageComponent() {
placeholderTags={[
{ value: "tags", label: "❗️ click here to add tags" },
]}
nsfwButtonEnabled={false}
nsfwButtonEnabled={true}
searchChanged={(search) => {}}
nsfwChanged={(nsfw) => {}}
tagsChanged={(tags) => {}}

View File

@ -22,7 +22,6 @@ export default async function AuthButton() {
const heads = headers()
const currentPage = heads.get('x-path')
console.log(currentPage)
const getGravatarUrl = () => {
if (user == null) {
return;

View File

@ -63,7 +63,6 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
console.log("TEST")
if (event.key === 'ArrowUp') {
const currentIndex = tags.findIndex(tag => tag.name === currentTag);
const newIndex = currentIndex === 0 ? tags.length - 1 : currentIndex - 1;
@ -82,7 +81,6 @@ const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged, nsfwButtonEnable
};
}, [currentTag, tags]);
console.log(currentTag)
const tagOptions = tags.map((tag: { name: string; }) => ({ value: tag.name, label: tag.name }));
return (