/**
* 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 (
);
};
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 (
{__('Create directories to organize users and manage access.', 'wp-user-frontend')}