import React, { useState, useEffect } from 'react'; import './BulkActionChangeOwnerModal.scss'; import { translateString } from '../utils/helpers/'; interface User { name: string; username: string; } interface BulkActionChangeOwnerModalProps { isOpen: boolean; selectedMediaIds: string[]; onCancel: () => void; onSuccess: (message: string) => void; onError: (message: string) => void; csrfToken: string; } export const BulkActionChangeOwnerModal: React.FC = ({ isOpen, selectedMediaIds, onCancel, onSuccess, onError, csrfToken, }) => { const [searchTerm, setSearchTerm] = useState(''); const [searchResults, setSearchResults] = useState([]); const [selectedUser, setSelectedUser] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [searchTimeout, setSearchTimeout] = useState(null); useEffect(() => { if (!isOpen) { // Reset state when modal closes setSearchTerm(''); setSearchResults([]); setSelectedUser(null); } }, [isOpen]); const searchUsers = async (name: string) => { if (!name.trim()) { setSearchResults([]); return; } try { const response = await fetch(`/api/v1/users?name=${encodeURIComponent(name)}`); if (!response.ok) { throw new Error(translateString('Failed to search users')); } const data = await response.json(); setSearchResults(data.results || data); } catch (error) { console.error('Error searching users:', error); } }; const handleSearchChange = (value: string) => { setSearchTerm(value); // Clear previous timeout if (searchTimeout) { clearTimeout(searchTimeout); } // Set new timeout for debounced search const timeout = setTimeout(() => { searchUsers(value); }, 300); setSearchTimeout(timeout); }; const handleUserSelect = (user: User) => { setSelectedUser(user); setSearchTerm(user.name + ' - ' + user.username); setSearchResults([]); }; const handleSubmit = async () => { if (!selectedUser) { onError(translateString('Please select a user')); return; } setIsProcessing(true); try { const response = await fetch('/api/v1/media/user/bulk_actions', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRFToken': csrfToken, }, body: JSON.stringify({ action: 'change_owner', media_ids: selectedMediaIds, owner: selectedUser.username, }), }); if (!response.ok) { throw new Error(translateString('Failed to change owner')); } const data = await response.json(); onSuccess(data.detail || translateString('Successfully changed owner')); onCancel(); } catch (error) { console.error('Error changing owner:', error); onError(translateString('Failed to change owner. Please try again.')); } finally { setIsProcessing(false); } }; if (!isOpen) return null; return (

{translateString('Select Owner')}

handleSearchChange(e.target.value)} />
{searchResults.length > 0 && (
{searchResults.slice(0, 10).map((user) => (
handleUserSelect(user)} > {user.name} - {user.username}
))}
)}
{selectedUser && (
{translateString('Selected')}: {selectedUser.name} - {selectedUser.username}
)}
); };