import { Button } from '@/components/ui/button'; import { GridSkeleton } from '@/components/ui/grid-skeleton'; import { Input } from '@/components/ui/input'; import { MediaItem } from '@/components/ui/media-item'; import { Sheet, SheetContent, SheetHeader, SheetTitle } from '@/components/ui/sheet'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { cn } from '@/lib/utils'; import useMediaStore from '@/stores/MediaStore'; import { Edit3, Search, X } from 'lucide-react'; import { useEffect, useState } from 'react'; export default function EditSidebar({ isOpen, onClose }) { const { memes, backgrounds, isFetchingMemes, isFetchingBackgrounds, selectedMeme, selectedBackground, fetchMemes, fetchBackgrounds, searchMemes, searchBackgrounds, selectMeme, selectBackground, clearSelectedMeme, clearSelectedBackground, } = useMediaStore(); // Track the current active tab const [activeTab, setActiveTab] = useState('memes'); // Track search queries const [searchQueries, setSearchQueries] = useState({ memes: '', backgrounds: '', }); // Track if data has been loaded for each tab (to prevent infinite loading on empty results) const [dataLoaded, setDataLoaded] = useState({ memes: false, backgrounds: false, }); // Fetch data when sidebar opens for the current active tab useEffect(() => { if (isOpen) { if (activeTab === 'memes' && !dataLoaded.memes && !isFetchingMemes) { const query = searchQueries.memes; if (query) { searchMemes(query).finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } else { fetchMemes().finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } } else if (activeTab === 'backgrounds' && !dataLoaded.backgrounds && !isFetchingBackgrounds) { const query = searchQueries.backgrounds; if (query) { searchBackgrounds(query).finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } else { fetchBackgrounds().finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } } } }, [isOpen, activeTab, dataLoaded.memes, dataLoaded.backgrounds, isFetchingMemes, isFetchingBackgrounds]); const handleTabChange = (value) => { setActiveTab(value); if (value === 'memes' && !dataLoaded.memes && !isFetchingMemes) { const query = searchQueries.memes; if (query) { searchMemes(query).finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } else { fetchMemes().finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } } else if (value === 'backgrounds' && !dataLoaded.backgrounds && !isFetchingBackgrounds) { const query = searchQueries.backgrounds; if (query) { searchBackgrounds(query).finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } else { fetchBackgrounds().finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } } }; // Handle search input changes const handleSearchChange = (value) => { setSearchQueries((prev) => ({ ...prev, [activeTab]: value, })); }; // Handle search submission const handleSearch = () => { const query = searchQueries[activeTab]; if (activeTab === 'memes') { searchMemes(query).finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } else if (activeTab === 'backgrounds') { searchBackgrounds(query).finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } }; // Handle clearing search const handleClearSearch = () => { setSearchQueries((prev) => ({ ...prev, [activeTab]: '', })); // Reset data loaded state and fetch fresh data without search if (activeTab === 'memes') { fetchMemes().finally(() => { setDataLoaded((prev) => ({ ...prev, memes: true })); }); } else if (activeTab === 'backgrounds') { fetchBackgrounds().finally(() => { setDataLoaded((prev) => ({ ...prev, backgrounds: true })); }); } }; // Handle Enter key in search input const handleSearchKeyDown = (e) => { if (e.key === 'Enter') { handleSearch(); } }; const handleMemeSelect = (meme) => { selectMeme(meme); }; const handleBackgroundSelect = (background) => { selectBackground(background); }; return ( !open && onClose()}> Edit Media {/* Currently Selected Items */}
{/* Selected Meme */}
setActiveTab('memes')}> {selectedMeme ? (
Selected Meme
) : (
No meme
)}

Meme Overlay

{/* Selected Background */}
setActiveTab('backgrounds')}> {selectedBackground ? (
Selected Background
) : (
No background
)}

Background

Meme Background {/* Search Bar */}
handleSearchChange(e.target.value)} onKeyDown={handleSearchKeyDown} className="pr-10 pl-10" /> {searchQueries[activeTab] && ( )}
{isFetchingBackgrounds && } {!isFetchingBackgrounds && backgrounds.length === 0 && (

No backgrounds found.

{searchQueries.backgrounds && ( )} {import.meta.env.VITE_DISCORD_LINK && ( )}
)} {!isFetchingBackgrounds && backgrounds.length > 0 && ( <>
{backgrounds.map((item, index) => ( handleBackgroundSelect(item)} isSelected={selectedBackground?.ids === item.ids} className="transition-all hover:ring-2 hover:ring-blue-500" /> ))}
)}
{isFetchingMemes && } {!isFetchingMemes && memes.length === 0 && (

No memes found.

{searchQueries.memes && ( )} {import.meta.env.VITE_DISCORD_LINK && ( )}
)} {!isFetchingMemes && memes.length > 0 && ( <>
{memes.map((item, index) => ( handleMemeSelect(item)} isSelected={selectedMeme?.ids === item.ids} className="transition-all hover:ring-2 hover:ring-blue-500" /> ))}
)}
); }