mirror of
https://github.com/D4M13N-D3V/neroshitron.git
synced 2025-07-31 11:09:19 +00:00
feat: search components
This commit is contained in:
parent
22df3ab0fd
commit
e86a8fa481
@ -54,8 +54,8 @@ export async function GET(
|
||||
.select('*')
|
||||
.eq('user_id', userId)
|
||||
.single();
|
||||
console.log(subscription)
|
||||
console.log(gallery.tier)
|
||||
//console.log(subscription)
|
||||
//console.log(gallery.tier)
|
||||
switch(gallery.tier){
|
||||
case "Tier 3":
|
||||
if(subscription?.tier!="Tier 3"){
|
||||
|
@ -20,10 +20,6 @@ export default async function AuthButton() {
|
||||
return redirect("/login");
|
||||
};
|
||||
|
||||
|
||||
|
||||
// ...
|
||||
|
||||
const heads = headers()
|
||||
const currentPage = heads.get('x-path')
|
||||
|
||||
|
@ -6,7 +6,9 @@ import SearchInput from '@/components/neroshitron/search_input';
|
||||
interface SearchProps { }
|
||||
|
||||
const Search = ({ }:SearchProps) => {
|
||||
const [tags, setTags] = useState<any[]>([]);
|
||||
const [tags, setTags] = useState<string[]>([]);
|
||||
const [search, setSearch] = useState<string>('');
|
||||
const [nsfw, setNsfw] = useState<boolean>(false);
|
||||
const [selectingTags, setSelectingTags] = useState<boolean>(false);
|
||||
|
||||
const getData = async () => {
|
||||
@ -20,7 +22,7 @@ const Search = ({ }:SearchProps) => {
|
||||
<>
|
||||
<section className="fixed flex items-center w-full p-8 pt-20 opacity-90 animate-in animate-once animate-duration-500">
|
||||
<div className="container mx-auto py-8">
|
||||
<SearchInput />
|
||||
<SearchInput searchChanged={(search)=>{setSearch(search)}} nsfwChanged={(nsfw)=>{setNsfw(nsfw)}} tagsChanged={(tags)=>{setTags(tags);}} />
|
||||
</div>
|
||||
</section>
|
||||
</>
|
||||
|
@ -4,23 +4,27 @@ import { on } from 'events';
|
||||
import TagSelector from '../neroshitron/tag_selector';
|
||||
|
||||
interface SearchInputProps {
|
||||
|
||||
tagsChanged: (tags: string[]) => void;
|
||||
searchChanged: (search: string) => void;
|
||||
nsfwChanged: (nsfw: boolean) => void;
|
||||
}
|
||||
|
||||
const SearchInput = ({ }: SearchInputProps) => {
|
||||
const SearchInput = ({ tagsChanged, searchChanged, nsfwChanged}: SearchInputProps) => {
|
||||
|
||||
const [search, setSearch] = useState<string>('');
|
||||
const [nsfw, setNsfw] = useState<boolean>(false);
|
||||
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
||||
const [selectingTags, setSelectingTags] = useState<boolean>(false);
|
||||
const tagSelectorRef = React.useRef(null);
|
||||
|
||||
|
||||
|
||||
const updateTags = (newTags: string[]) => {
|
||||
setSelectedTags(newTags)
|
||||
tagsChanged(newTags);
|
||||
}
|
||||
|
||||
const onTagsClosed = (tags:string[]) => {
|
||||
if(tagSelectorRef.current !== null){
|
||||
setSelectedTags((tagSelectorRef.current as any).getSelectedTags());
|
||||
}
|
||||
setSelectingTags(false);
|
||||
setSelectedTags(tags);
|
||||
}
|
||||
|
||||
const openTags = () => {
|
||||
@ -30,6 +34,14 @@ const SearchInput = ({ }: SearchInputProps) => {
|
||||
}
|
||||
}
|
||||
|
||||
const getData = async () => {
|
||||
setSelectedTags(selectedTags)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getData();
|
||||
}, [selectedTags]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className="relative md:w-full lg:w-1/2 mx-auto flex flex-col items-center justify-center">
|
||||
@ -48,7 +60,7 @@ const SearchInput = ({ }: SearchInputProps) => {
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{(selectingTags) && <TagSelector ref={tagSelectorRef} />}
|
||||
{(selectingTags) && <TagSelector tagsChanged={(newTags:string[])=>{ updateTags(newTags) }} selectedTagsInput={selectedTags} ref={tagSelectorRef} />}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
@ -6,14 +6,14 @@ interface TagProps { onTagClicked: (tag: string ) => void, selected:boolean, tag
|
||||
const Tag = ({ onTagClicked, selected, tag, }:TagProps) => {
|
||||
|
||||
return (
|
||||
<a
|
||||
key={"select-tags"}
|
||||
<button
|
||||
key={tag+"-button"}
|
||||
type="button"
|
||||
className={`w-full m-4 rounded-md no-underline text-white py-1 font-medium text-center ${selected ? 'hover:bg-pink-800 bg-pink-900' : 'hover:bg-neroshi-blue-700 bg-neroshi-blue-800'}`}
|
||||
href="#"
|
||||
onClick={() => onTagClicked(tag)}
|
||||
>
|
||||
{tag}
|
||||
</a>
|
||||
</button>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -5,44 +5,55 @@ import Tag from './tag_pill';
|
||||
import Masonry from 'react-masonry-css';
|
||||
|
||||
interface TagSelectorProps {
|
||||
|
||||
selectedTagsInput: string[],
|
||||
tagsChanged: (tags: string[]) => void
|
||||
}
|
||||
|
||||
const TagSelector = forwardRef<TagSelectorProps, {}>((props, ref) => {
|
||||
const TagSelector = forwardRef<TagSelectorProps, { selectedTagsInput: string[], tagsChanged: (tags: string[]) => void }>((props, ref) => {
|
||||
|
||||
const [tags, setTags] = useState<any[]>([]);
|
||||
const [selectedTags, setSelectedTags] = useState<string[]>([]);
|
||||
const supabase = createClient();
|
||||
const [selectedTags, setSelectedTags] = useState<string[]>(props.selectedTagsInput);
|
||||
|
||||
|
||||
useImperativeHandle(ref, () => ({
|
||||
getSelectedTags: () => {
|
||||
return tags.map(tag => tag.name);
|
||||
},
|
||||
}));
|
||||
|
||||
const getData = async () => {
|
||||
const tagsResponse = await fetch(`/api/galleries/tags`);
|
||||
const tagsData = await tagsResponse.json();
|
||||
setTags(tagsData);
|
||||
}
|
||||
|
||||
const handleTag = (tag: string) => {
|
||||
if (selectedTags.includes(tag)) {
|
||||
setSelectedTags(selectedTags.filter(t => t !== tag));
|
||||
} else {
|
||||
setSelectedTags([...selectedTags, tag]);
|
||||
}
|
||||
setTags(selectedTags);
|
||||
};
|
||||
|
||||
const getData = async () => {
|
||||
const tagsResponse = await fetch(`/api/galleries/tags`);
|
||||
const tagsData = await tagsResponse.json();
|
||||
setTags(tagsData);
|
||||
}
|
||||
|
||||
const generateRandomString = (length: number): string => {
|
||||
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
let result = '';
|
||||
for (let i = 0; i < length; i++) {
|
||||
const randomIndex = Math.floor(Math.random() * characters.length);
|
||||
result += characters.charAt(randomIndex);
|
||||
}
|
||||
return result;
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
props.tagsChanged(selectedTags);
|
||||
getData();
|
||||
}, [selectedTags]);
|
||||
|
||||
useEffect(() => {
|
||||
getData();
|
||||
}, []);
|
||||
console.log(selectedTags)
|
||||
|
||||
return (
|
||||
<div className="flex md:w-full lg:w-1/2 animate-in mx-auto pt-4">
|
||||
<div className="grid grid-cols-6 gap-4 w-full animate-in mx-auto pt-4 bg-neroshi-blue-900 pr-8 pb-4 rounded-md">
|
||||
<div className="grid grid-cols-6 gap-4 w-full mx-auto pt-4 bg-neroshi-blue-900 pr-8 pb-4 rounded-md opacity-75 backdrop-filter backdrop-blur-md">
|
||||
{tags.map((tag: any) => (
|
||||
<Tag key={tag.id} tag={tag.name} selected={selectedTags.includes(tag.name)} onTagClicked={(tag) => handleTag(tag)} />
|
||||
<Tag key={tag.name} tag={tag.name} selected={selectedTags.includes(tag.name)} onTagClicked={(tag) => handleTag(tag)} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
Loading…
x
Reference in New Issue
Block a user