'use client'; import { useState, useEffect, useCallback } from 'react'; import { Box, TextField, Select, MenuItem, FormControl, InputLabel, Card, CardContent, Alert, Chip, IconButton, Tooltip, Dialog, DialogTitle, DialogContent, DialogActions, Button, Typography } from '@mui/material'; import { DataGrid, GridColDef, GridActionsCellItem, GridRowParams, GridPaginationModel } from '@mui/x-data-grid'; import { Visibility, CheckCircle, Cancel, Delete, Person, PersonOff } from '@mui/icons-material'; interface PrayerRequest { id: string; title: string; description: string; category: string; author: string; isAnonymous: boolean; prayerCount: number; isActive: boolean; createdAt: string; updatedAt: string; user: { id: string; email: string; name: string | null; } | null; } interface PrayerRequestDetailModalProps { prayerRequestId: string | null; open: boolean; onClose: () => void; onPrayerRequestUpdate: (prayerRequestId: string, action: string) => void; } function PrayerRequestDetailModal({ prayerRequestId, open, onClose, onPrayerRequestUpdate }: PrayerRequestDetailModalProps) { const [prayerRequest, setPrayerRequest] = useState(null); const [loading, setLoading] = useState(false); useEffect(() => { if (prayerRequestId && open) { const fetchPrayerRequest = async () => { setLoading(true); try { const response = await fetch(`/api/admin/content/prayer-requests/${prayerRequestId}`, { credentials: 'include' }); if (response.ok) { const data = await response.json(); setPrayerRequest(data.prayerRequest); } } catch (error) { console.error('Error fetching prayer request:', error); } finally { setLoading(false); } }; fetchPrayerRequest(); } }, [prayerRequestId, open]); const handleAction = async (action: string) => { if (!prayerRequestId) return; try { const response = await fetch(`/api/admin/content/prayer-requests/${prayerRequestId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ action }) }); if (response.ok) { onPrayerRequestUpdate(prayerRequestId, action); onClose(); } } catch (error) { console.error('Error updating prayer request:', error); } }; return ( Prayer Request Details {loading ? ( Loading... ) : prayerRequest ? ( {prayerRequest.title} {prayerRequest.description} Request Information Author: {prayerRequest.author} {prayerRequest.user && ( User: {prayerRequest.user.name || prayerRequest.user.email} )} Prayer Count: {prayerRequest.prayerCount} Created: {new Date(prayerRequest.createdAt).toLocaleString()} Updated: {new Date(prayerRequest.updatedAt).toLocaleString()} {prayerRequest.isActive ? ( ) : ( )} ) : ( Prayer request not found )} ); } export function PrayerRequestDataGrid() { const [prayerRequests, setPrayerRequests] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [paginationModel, setPaginationModel] = useState({ page: 0, pageSize: 10, }); const [rowCount, setRowCount] = useState(0); const [search, setSearch] = useState(''); const [categoryFilter, setCategoryFilter] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); const [selectedPrayerRequestId, setSelectedPrayerRequestId] = useState(null); const [modalOpen, setModalOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [prayerRequestToDelete, setPrayerRequestToDelete] = useState(null); const fetchPrayerRequests = useCallback(async () => { setLoading(true); try { const params = new URLSearchParams({ page: paginationModel.page.toString(), pageSize: paginationModel.pageSize.toString(), search, category: categoryFilter, status: statusFilter }); const response = await fetch(`/api/admin/content/prayer-requests?${params}`, { credentials: 'include' }); if (response.ok) { const data = await response.json(); setPrayerRequests(data.prayerRequests); setRowCount(data.pagination.total); } else { setError('Failed to load prayer requests'); } } catch (error) { setError('Network error loading prayer requests'); } finally { setLoading(false); } }, [paginationModel, search, categoryFilter, statusFilter]); useEffect(() => { fetchPrayerRequests(); }, [fetchPrayerRequests]); const handlePrayerRequestUpdate = useCallback((prayerRequestId: string, action: string) => { // Refresh the data after prayer request update fetchPrayerRequests(); }, [fetchPrayerRequests]); const handleViewPrayerRequest = (params: GridRowParams) => { setSelectedPrayerRequestId(params.id as string); setModalOpen(true); }; const handleDeletePrayerRequest = (params: GridRowParams) => { setPrayerRequestToDelete(params.row as PrayerRequest); setDeleteDialogOpen(true); }; const confirmDeletePrayerRequest = async () => { if (!prayerRequestToDelete) return; try { const response = await fetch(`/api/admin/content/prayer-requests/${prayerRequestToDelete.id}`, { method: 'DELETE', credentials: 'include' }); if (response.ok) { fetchPrayerRequests(); setDeleteDialogOpen(false); setPrayerRequestToDelete(null); } } catch (error) { console.error('Error deleting prayer request:', error); } }; const getStatusChip = (isActive: boolean) => { return ( ); }; const getCategoryChip = (category: string) => { const colors: Record = { personal: 'primary', family: 'secondary', health: 'error', work: 'warning', ministry: 'info', world: 'success' }; return ( ); }; const columns: GridColDef[] = [ { field: 'title', headerName: 'Title', flex: 1, minWidth: 200, renderCell: (params) => ( {params.value} by {params.row.author} ) }, { field: 'category', headerName: 'Category', width: 120, renderCell: (params) => getCategoryChip(params.value) }, { field: 'prayerCount', headerName: 'Prayers', width: 80, align: 'center', headerAlign: 'center' }, { field: 'isActive', headerName: 'Status', width: 100, renderCell: (params) => getStatusChip(params.value) }, { field: 'createdAt', headerName: 'Created', width: 120, renderCell: (params) => new Date(params.value).toLocaleDateString() }, { field: 'user', headerName: 'User', width: 120, renderCell: (params) => ( {params.row.isAnonymous ? ( ) : ( )} {params.row.isAnonymous ? 'Anonymous' : (params.value?.name || params.value?.email || 'N/A')} ) }, { field: 'actions', type: 'actions', headerName: 'Actions', width: 120, getActions: (params) => { const actions = [ } label="View" onClick={() => handleViewPrayerRequest(params)} /> ]; actions.push( } label="Delete" onClick={() => handleDeletePrayerRequest(params)} /> ); return actions; } } ]; return ( {/* Filters */} setSearch(e.target.value)} size="small" sx={{ minWidth: 250 }} /> Category Status {error && ( {error} )} {/* Data Grid */} {/* Prayer Request Detail Modal */} setModalOpen(false)} onPrayerRequestUpdate={handlePrayerRequestUpdate} /> {/* Delete Confirmation Dialog */} setDeleteDialogOpen(false)} maxWidth="sm" fullWidth > Delete Prayer Request Are you sure you want to delete the prayer request "{prayerRequestToDelete?.title}"? This action cannot be undone. All prayer data for this request will be permanently deleted. ); }