"use client"; import { useEffect, useState } from 'react'; import { Eye, EyeOff, RefreshCw } from 'lucide-react'; import { IconSpinner } from '@/app/components/ui/icons'; import { toast } from 'react-toastify'; import Swal from 'sweetalert2'; export default function AdminManageCollections() { const [collectionsData, setCollectionsData] = useState([]); const [loading, setLoading] = useState(true); const [isRefreshed, setIsRefreshed] = useState(true); // Track whether the data has been refreshed // Fetch collection requests from the server const fetchCollections = async () => { try { setLoading(true); const response = await fetch('/api/admin/collections', { method: 'GET', headers: { 'Content-Type': 'application/json', }, } ); if (!response.ok) { console.error('Error fetching collections:', response.statusText) toast.error('Error fetching collections:', { position: "top-right", closeOnClick: true, }); setLoading(false); return false; } const data = await response.json(); // Sort the collections by created date in descending order (oldest first) const sortedData = data.collections.sort((a: any, b: any) => new Date(a.created_at).getTime() - new Date(b.created_at).getTime()); setCollectionsData(sortedData); console.log('Collections:', sortedData); } catch (error) { console.error('Error fetching collections:', error); toast.error('Error fetching collections:', { position: "top-right", closeOnClick: true, }); setLoading(false); return false; } setLoading(false); return true; }; useEffect(() => { // Fetch collections from the server fetchCollections(); }, []); // Handle make private a collection const handleMakePrivate = async (collectionId: string) => { // Show confirmation dialog Swal.fire({ title: 'Request Confirmation', text: "Are you sure you want to make this collection Private?", icon: 'question', showCancelButton: true, confirmButtonText: 'Yes', cancelButtonText: 'No', confirmButtonColor: '#4caf50', cancelButtonColor: '#b91c1c', }).then((result) => { if (result.isConfirmed) { // if user confirms, send request to server fetch(`/api/admin/collections/update`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ collection_id: collectionId, is_public: false, // Set collection to Private }), }).then(async (response) => { if (!response.ok) { console.error('Error setting collection Private:', response.statusText); // Show error dialog Swal.fire({ title: 'Error!', text: 'Error setting collection Private. Please try again later. (Check Console for more details)', icon: 'error', confirmButtonColor: '#4caf50', }); return; } const data = await response.json(); console.log('Collection Set to Private Success:', data); // Show success dialog Swal.fire({ title: 'Success!', text: 'Collection has been set to Private successfully.', icon: 'success', confirmButtonColor: '#4caf50', }); // Refresh the collections data fetchCollections(); }).catch((error) => { console.error('Error setting collection Private:', error); // Show error dialog Swal.fire({ title: 'Error!', text: 'Error setting collection Private. Please try again later. (Check Console for more details)', icon: 'error', confirmButtonColor: '#4caf50', }); }); } }); } // Handle make public a collection const handleMakePublic = async (collectionId: string) => { // Show confirmation dialog Swal.fire({ title: 'Request Confirmation', text: "Are you sure you want to make this collection Public?", icon: 'question', showCancelButton: true, confirmButtonText: 'Yes', cancelButtonText: 'No', confirmButtonColor: '#4caf50', cancelButtonColor: '#b91c1c', }).then((result) => { if (result.isConfirmed) { // if user confirms, send request to server fetch(`/api/admin/collections/update`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ collection_id: collectionId, is_public: true, // Set collection to Public }), }).then(async (response) => { if (!response.ok) { console.error('Error setting collection Public:', response.statusText); // Show error dialog Swal.fire({ title: 'Error!', text: 'Error setting collection Public. Please try again later. (Check Console for more details)', icon: 'error', confirmButtonColor: '#4caf50', }); return; } const data = await response.json(); console.log('Collection Set to Public Success:', data); // Show success dialog Swal.fire({ title: 'Success!', text: 'Collection has been set to Public successfully.', icon: 'success', confirmButtonColor: '#4caf50', }); // Refresh the collections data fetchCollections(); }).catch((error) => { console.error('Error setting collection Public:', error); // Show error dialog Swal.fire({ title: 'Error!', text: 'Error setting collection Public. Please try again later. (Check Console for more details)', icon: 'error', confirmButtonColor: '#4caf50', }); }); } }); } const handleRefresh = async () => { setIsRefreshed(false); const timer = setInterval(() => { // Timer to simulate a spinner while refreshing data setIsRefreshed(true); }, 1000); // Adjust the delay time as needed (e.g., 5000 milliseconds = 5 seconds) // Display a toast notification if (await fetchCollections()) { toast('Data refreshed successfully!', { type: 'success', position: 'top-right', autoClose: 3000, closeOnClick: true, pauseOnHover: true, }); } else { toast('Error refreshing data. Please try again later.', { type: 'error', position: 'top-right', autoClose: 3000, closeOnClick: true, pauseOnHover: true, }); } return () => clearInterval(timer); // Cleanup the timer on complete } return (

Manage Collections

{/* Refresh Data button */}
{loading ? ( ) : collectionsData.length === 0 ? (
No Collections Found.
) : (
{collectionsData.map((collection, index) => ( {/* Render table rows */} ))}
Display Name Description Current Visibility Created Owner Email Actions
{collection.display_name} {collection.description} {collection.is_public ? Public : Private} {new Date(collection.created_at).toLocaleDateString('en-GB', { year: 'numeric', month: 'short', day: 'numeric', hour: 'numeric', minute: 'numeric', second: 'numeric', hour12: true })} {collection.users.name} {collection.users.email}
{/* Set Public or Private Status */} {collection.is_public ? ( ) : ( )}
)}
); }