'use client' import { useState, useEffect, useMemo, useCallback } from 'react' import { useSDK } from '@/lib/sdk' import { StepHeader, STEP_EXPLANATIONS } from '@/components/sdk/StepHeader' import { DSRRequest, DSRType, DSRStatus, DSRStatistics, getDaysRemaining, isOverdue, } from '@/lib/sdk/dsr/types' import { fetchSDKDSRList } from '@/lib/sdk/dsr/api' import type { Tab, TabId } from './_types' import { TabNavigation } from './_components/TabNavigation' import { StatCard } from './_components/StatCard' import { RequestCard } from './_components/RequestCard' import { FilterBar } from './_components/FilterBar' import { DSRCreateModal } from './_components/DSRCreateModal' import { DSRDetailPanel } from './_components/DSRDetailPanel' import { DSRHeaderActions } from './_components/DSRHeaderActions' import { LoadingSpinner, SettingsTab, OverdueAlert, DeadlineInfoBox, EmptyState, } from './_components/DSRBanners' // ============================================================================= // MAIN PAGE // ============================================================================= export default function DSRPage() { const { state } = useSDK() const [activeTab, setActiveTab] = useState('overview') const [requests, setRequests] = useState([]) const [statistics, setStatistics] = useState(null) const [isLoading, setIsLoading] = useState(true) const [showCreateModal, setShowCreateModal] = useState(false) const [selectedRequest, setSelectedRequest] = useState(null) // Filters const [selectedType, setSelectedType] = useState('all') const [selectedStatus, setSelectedStatus] = useState('all') const [selectedPriority, setSelectedPriority] = useState('all') // Load data from SDK backend const loadData = useCallback(async () => { setIsLoading(true) try { const { requests: dsrRequests, statistics: dsrStats } = await fetchSDKDSRList() setRequests(dsrRequests) setStatistics(dsrStats) } catch (error) { console.error('Failed to load DSR data:', error) } finally { setIsLoading(false) } }, []) useEffect(() => { loadData() }, [loadData]) // Calculate tab counts const tabCounts = useMemo(() => { return { intake: requests.filter(r => r.status === 'intake' || r.status === 'identity_verification').length, processing: requests.filter(r => r.status === 'processing').length, completed: requests.filter(r => r.status === 'completed' || r.status === 'rejected' || r.status === 'cancelled').length, overdue: requests.filter(r => isOverdue(r)).length } }, [requests]) // Filter requests based on active tab and filters const filteredRequests = useMemo(() => { let filtered = [...requests] // Tab-based filtering if (activeTab === 'intake') { filtered = filtered.filter(r => r.status === 'intake' || r.status === 'identity_verification') } else if (activeTab === 'processing') { filtered = filtered.filter(r => r.status === 'processing') } else if (activeTab === 'completed') { filtered = filtered.filter(r => r.status === 'completed' || r.status === 'rejected' || r.status === 'cancelled') } // Type filter if (selectedType !== 'all') { filtered = filtered.filter(r => r.type === selectedType) } // Status filter if (selectedStatus !== 'all') { filtered = filtered.filter(r => r.status === selectedStatus) } // Priority filter if (selectedPriority !== 'all') { filtered = filtered.filter(r => r.priority === selectedPriority) } // Sort by urgency return filtered.sort((a, b) => { const getUrgency = (r: DSRRequest) => { if (r.status === 'completed' || r.status === 'rejected' || r.status === 'cancelled') return 100 const days = getDaysRemaining(r.deadline.currentDeadline) if (days < 0) return -100 + days // Overdue items first return days } return getUrgency(a) - getUrgency(b) }) }, [requests, activeTab, selectedType, selectedStatus, selectedPriority]) const tabs: Tab[] = [ { id: 'overview', label: 'Uebersicht' }, { id: 'intake', label: 'Eingang', count: tabCounts.intake, countColor: 'bg-blue-100 text-blue-600' }, { id: 'processing', label: 'In Bearbeitung', count: tabCounts.processing, countColor: 'bg-yellow-100 text-yellow-600' }, { id: 'completed', label: 'Abgeschlossen', count: tabCounts.completed, countColor: 'bg-green-100 text-green-600' }, { id: 'settings', label: 'Einstellungen' } ] const stepInfo = STEP_EXPLANATIONS['dsr'] const clearFilters = () => { setSelectedType('all') setSelectedStatus('all') setSelectedPriority('all') } return (
{/* Step Header */} setShowCreateModal(true)} /> {/* Tab Navigation */} {/* Loading State */} {isLoading ? ( ) : activeTab === 'settings' ? ( ) : ( <> {/* Statistics (Overview Tab) */} {activeTab === 'overview' && statistics && (
0 ? 'red' : 'green'} />
)} {/* Overdue Alert */} {tabCounts.overdue > 0 && ( { setActiveTab('overview') setSelectedStatus('all') }} /> )} {/* Info Box (Overview Tab) */} {activeTab === 'overview' && } {/* Filters */} {/* Requests List */}
{filteredRequests.map(request => ( setSelectedRequest(request)} /> ))}
{/* Empty State */} {filteredRequests.length === 0 && ( setShowCreateModal(true)} /> )} )} {/* Modals */} {showCreateModal && ( setShowCreateModal(false)} onSuccess={() => { setShowCreateModal(false); loadData() }} /> )} {selectedRequest && ( setSelectedRequest(null)} onUpdated={() => { setSelectedRequest(null); loadData() }} /> )}
) }