앨범 관리
앨범, 트랙, 사진을 관리합니다
| 앨범 | 타입 | 발매일 | 트랙 | 관리 |
{album.title} |
{album.album_type} |
|
|
|
|---|
import { useState, useEffect } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { motion, AnimatePresence } from 'framer-motion'; import { Plus, Search, Edit2, Trash2, Image, Music, Home, ChevronRight, LogOut, Calendar, AlertTriangle, X } from 'lucide-react'; import Toast from '../../../components/Toast'; import Tooltip from '../../../components/Tooltip'; import useToast from '../../../hooks/useToast'; import * as authApi from '../../../api/admin/auth'; import { getAlbums } from '../../../api/public/albums'; import * as albumsApi from '../../../api/admin/albums'; function AdminAlbums() { const navigate = useNavigate(); const [albums, setAlbums] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(''); const [user, setUser] = useState(null); const { toast, setToast } = useToast(); const [deleteDialog, setDeleteDialog] = useState({ show: false, album: null }); const [deleting, setDeleting] = useState(false); useEffect(() => { // 로그인 확인 if (!authApi.hasToken()) { navigate('/admin'); return; } setUser(authApi.getCurrentUser()); fetchAlbums(); }, [navigate]); const fetchAlbums = async () => { try { const data = await getAlbums(); setAlbums(data); } catch (error) { console.error('앨범 로드 오류:', error); } finally { setLoading(false); } }; const handleLogout = () => { authApi.logout(); navigate('/admin'); }; const handleDelete = async () => { if (!deleteDialog.album) return; setDeleting(true); try { await albumsApi.deleteAlbum(deleteDialog.album.id); setToast({ message: `"${deleteDialog.album.title}" 앨범이 삭제되었습니다.`, type: 'success' }); setDeleteDialog({ show: false, album: null }); fetchAlbums(); } catch (error) { console.error('삭제 오류:', error); setToast({ message: '앨범 삭제 중 오류가 발생했습니다.', type: 'error' }); } finally { setDeleting(false); } }; // 날짜 포맷팅 const formatDate = (dateStr) => { if (!dateStr) return ''; const date = new Date(dateStr); return `${date.getFullYear()}.${String(date.getMonth() + 1).padStart(2, '0')}.${String(date.getDate()).padStart(2, '0')}`; }; // 검색 필터링 const filteredAlbums = albums.filter(album => album.title.toLowerCase().includes(searchQuery.toLowerCase()) ); return (
"{deleteDialog.album?.title}" 앨범을 삭제하시겠습니까?
이 작업은 되돌릴 수 없으며, 모든 트랙과 커버 이미지가 함께 삭제됩니다.
앨범, 트랙, 사진을 관리합니다
| 앨범 | 타입 | 발매일 | 트랙 | 관리 |
{album.title} |
{album.album_type} |
|
|
|
|---|