/** * User Directory Free - Main App Component * * @package WPUF * @subpackage Free/User_Directory * @since 4.3.0 */ import React, { useState, useEffect, useCallback } from 'react'; import { __ } from '@wordpress/i18n'; import Header from './components/common/Header'; import DirectoryList from './components/DirectoryList'; import DirectoryWizard from './components/DirectoryWizard'; import DeleteConfirmModal from './components/common/DeleteConfirmModal'; // Pro Badge Component - clickable link to upgrade page const ProBadge = ({ className = '', utm = 'wpuf-user-directory' }) => { const wpuf = window.wpuf_admin_script || {}; const upgradeUrl = (wpuf.upgradeUrl || 'https://wedevs.com/wp-user-frontend-pro/pricing/') + '?utm_source=' + utm + '&utm_medium=pro-badge'; return ( Pro ); }; const App = () => { const [view, setView] = useState('list'); // 'list' or 'wizard' const [directories, setDirectories] = useState([]); const [editDirectory, setEditDirectory] = useState(null); const [loading, setLoading] = useState(true); const [currentPage, setCurrentPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [deleteModal, setDeleteModal] = useState({ open: false, dir: null }); const [deletingId, setDeletingId] = useState(null); const config = window.wpuf_ud_free || window.wpuf_ud || {}; const perPage = 10; const fetchDirectories = useCallback(async (page = 1) => { setLoading(true); try { const restUrl = config.rest_url || '/wp-json/'; const url = `${restUrl}wpuf/v1/user_directory?page=${page}&per_page=${perPage}`; const response = await fetch(url, { headers: { 'X-WP-Nonce': config.rest_nonce || '', }, }); const data = await response.json(); if (data && data.success && Array.isArray(data.result)) { setDirectories(data.result); if (data.pagination && data.pagination.total_pages) { setTotalPages(data.pagination.total_pages); } else { setTotalPages(1); } } else { setDirectories([]); setTotalPages(1); } } catch (error) { console.error('Error fetching directories:', error); setDirectories([]); setTotalPages(1); } setLoading(false); }, [config.rest_url, config.rest_nonce]); // Fetch directories on mount and when page changes useEffect(() => { fetchDirectories(currentPage); }, [currentPage, fetchDirectories]); const handlePageChange = (page) => { if (page < 1 || page > totalPages) return; setCurrentPage(page); }; const handleCreate = () => { setEditDirectory(null); setView('wizard'); }; const handleEdit = (directory) => { setEditDirectory(directory); setView('wizard'); }; const handleClose = () => { setView('list'); setEditDirectory(null); fetchDirectories(currentPage); }; const handleRequestDelete = (dir) => { setDeleteModal({ open: true, dir }); }; const handleDelete = async () => { if (!deleteModal.dir) return; setDeletingId(deleteModal.dir.ID); try { const restUrl = config.rest_url || '/wp-json/'; const response = await fetch(`${restUrl}wpuf/v1/user_directory/${deleteModal.dir.ID}`, { method: 'DELETE', headers: { 'X-WP-Nonce': config.rest_nonce || '', }, }); if (!response.ok) { alert('Server error: ' + response.status); setDeletingId(null); setDeleteModal({ open: false, dir: null }); return; } const result = await response.json(); if (result && result.success) { fetchDirectories(currentPage); } else { alert(result && result.message ? result.message : 'Failed to delete'); } } catch (e) { alert('Failed to delete'); } setDeletingId(null); setDeleteModal({ open: false, dir: null }); }; if (view === 'wizard') { return ( ); } const hasReachedLimit = directories.length >= (config.free_directory_limit || 1); return ( <>

{__('User Directories', 'wp-user-frontend')}

{loading ? (
) : directories.length === 0 ? ( ) : ( )}
setDeleteModal({ open: false, dir: null })} onConfirm={handleDelete} /> ); }; // Empty State Component - matches Pro design exactly const EmptyState = ({ onCreate, config }) => { const wpuf = window.wpuf_ud_free || window.wpuf_ud || {}; const assetUrl = wpuf.asset_url || ''; return (
User Avatar User Avatar User Avatar

{__('No directories added yet', 'wp-user-frontend')}

{__('Create directories to organize users and manage access.', 'wp-user-frontend')}

{__('Docs', 'wp-user-frontend')}
); }; export default App;