145 lines
6.9 KiB
TypeScript
Raw Normal View History

2024-06-02 03:48:21 -04:00
"use client";
import { createClient } from "@/utils/supabase/client";
import React, { useState, useEffect } from 'react';
import Search from "@/components/neroshitron/search";
import Gallery from "@/components/neroshitron/gallery";
import Masonry from "react-masonry-css";
import SearchInput from "@/components/neroshitron/search_input";
function PageComponent() {
const [selectedGallery, setSelectedGallery] = useState<string | null>(null);
const [filePreviews, setFilePreviews] = useState<string[]>([]);
2024-06-02 23:14:30 -04:00
const [name, setName] = useState<string>('');
const [nsfw, setNsfw] = useState<boolean>(false);
const [tags, setTags] = useState<string[]>([]);
const [tier, setTier] = useState<string>('Free');
const [files, setFiles] = useState<FileList>();
2024-06-02 03:48:21 -04:00
const supabase = createClient();
const user = supabase.auth.getUser();
const getData = async () => {
}
useEffect(() => {
getData();
}, [selectedGallery]);
const closeGallery = () => {
setSelectedGallery(null);
}
2024-06-02 23:14:30 -04:00
const createGallery = async () => {
const formData = new FormData();
formData.append('name', name);
if (files) {
Array.from(files).forEach((file: File) => {
formData.append('files', file);
});
}
formData.append('tags', JSON.stringify(tags));
formData.append('nsfw', nsfw.toString());
formData.append('tier', tier);
const response = await fetch('/api/galleries/admin', {
method: 'POST',
body: formData,
});
if (response.ok) {
const data = await response.json();
} else {
console.log(response)
}
}
2024-06-02 03:48:21 -04:00
const handleFileChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const files = event.target.files;
if (files) {
const previews: string[] = [];
for (let i = 0; i < files.length; i++) {
const file = files[i];
const reader = new FileReader();
reader.onload = (e) => {
if (e.target && e.target.result) {
previews.push(e.target.result.toString());
if (previews.length === files.length) {
2024-06-02 23:14:30 -04:00
setFiles(files);
2024-06-02 03:48:21 -04:00
setFilePreviews(previews);
}
}
};
reader.readAsDataURL(file);
}
}
};
return (
<div className="w-full text-white flex justify-center items-center animate-in">
2024-06-02 07:54:45 -04:00
<div className="w-1/2 rounded-md bg-primary opacity-90 backdrop-blur-lg p-12 mt-32 shadow-lg">
2024-06-02 03:48:21 -04:00
<div className="w-full flex">
<input
type="text"
2024-06-02 23:14:30 -04:00
value={name}
onChange={(e) => setName(e.target.value)}
2024-06-02 07:49:41 -04:00
className="mb-8 mr-2 rounded-md bg-secondary p-2 w-1/2 text-white shadow-lg"
2024-06-02 03:48:21 -04:00
placeholder="Gallery Name"
/>
2024-06-02 04:25:36 -04:00
<div className="w-1/4">
2024-06-02 23:14:30 -04:00
<button onClick={() => window.location.href = "/gallery/admin"} className="w-full bg-error hover:bg-error-light text-white rounded-md p-2 shadow-lg">
2024-06-02 04:25:36 -04:00
Back
2024-06-02 03:48:21 -04:00
</button>
</div>
2024-06-02 04:25:36 -04:00
<div className="w-1/4">
2024-06-02 23:14:30 -04:00
<button onClick={()=>{createGallery()}} className="w-full bg-success hover:bg-success-light text-white rounded-md p-2 ml-2 shadow-lg ">
2024-06-02 04:25:36 -04:00
Create Gallery
</button>
2024-06-02 03:48:21 -04:00
</div>
2024-06-02 04:25:36 -04:00
</div>
<div className="w-full flex">
2024-06-02 03:48:21 -04:00
<div className="w-1/2 mr-2">
<SearchInput
2024-06-02 03:51:53 -04:00
placeholderTags={[
{ value: "tags", label: "❗️ click here to add tags" },
]}
nsfwButtonEnabled={true}
2024-06-02 23:14:30 -04:00
searchChanged={(search) => { }}
nsfwChanged={(nsfw) => { }}
tagsChanged={(tags) => { setTags(tags) }}
2024-06-02 03:48:21 -04:00
/>
</div>
<div className="w-1/2">
2024-06-02 23:14:30 -04:00
<select value={nsfw ? "NSFW" : "SFW"} className="mb-2 shadow-lg rounded-md bg-secondary p-2 w-full text-white" onChange={e=>{
setNsfw(e.target.value === "NSFW");
}}>
<option value="NSFW" selected={nsfw}>NSFW</option>
<option value="SFW" selected={nsfw}>SFW</option>
</select>
<select onChange={e=>{
setTier(e.target.value);
}} className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
<option value="Free" selected={tier === "Free"}>Free</option>
<option value="Tier 1" selected={tier === "Tier 1"}>Tier 1</option>
<option value="Tier 2" selected={tier === "Tier 2"}>Tier 2</option>
<option value="Tier 3" selected={tier === "Tier 3"}>Tier 3</option>
</select>
<select className="mb-2 shadow-lg mr-2 rounded-md bg-secondary p-2 w-full text-white">
<option value="" disabled selected>Select New Thumbnail</option>
</select>
2024-06-02 03:48:21 -04:00
<input
className="relative m-0 block w-full min-w-0 flex-auto cursor-pointer rounded border border-solid border-secondary-lighter bg-transparent bg-clip-padding px-3 py-[0.32rem] text-base font-normal text-surface transition duration-300 ease-in-out file:-mx-3 file:-my-[0.32rem] file:me-3 file:cursor-pointer file:overflow-hidden file:rounded-none file:border-0 file:border-e file:border-solid file:border-inherit file:bg-transparent file:px-3 file:py-[0.32rem] file:text-surface focus:border-primary focus:text-gray-700 focus:shadow-inset focus:outline-none dark:border-white/70 dark:text-white file:dark:text-white"
type="file"
id="formFileMultiple"
multiple
onChange={handleFileChange}
/>
<Masonry breakpointCols={3} className="my-masonry-grid pl-6 col-span-2">
{filePreviews.map((preview, index) => (
<img key={index} src={preview} alt={`Preview ${index}`} />
))}
</Masonry>
</div>
</div>
</div>
</div>
);
}
export default PageComponent;