/** * Component: Report Issue Modal * Documentation: documentation/frontend/components.md * * Sub-modal for reporting problems with available audiobooks. * Rendered via portal at z-[60] to layer above AudiobookDetailsModal. */ 'use client'; import React, { useState } from 'react'; import { createPortal } from 'react-dom'; import { useReportIssue } from '@/lib/hooks/useReportedIssues'; interface ReportIssueModalProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; asin: string; bookTitle: string; bookAuthor: string; coverArtUrl?: string; } export function ReportIssueModal({ isOpen, onClose, onSuccess, asin, bookTitle, bookAuthor, coverArtUrl, }: ReportIssueModalProps) { const { reportIssue, isLoading } = useReportIssue(); const [reason, setReason] = useState(''); const [error, setError] = useState(null); const maxChars = 250; const canSubmit = reason.trim().length > 0 && reason.length <= maxChars && !isLoading; const handleSubmit = async () => { if (!canSubmit) return; setError(null); try { await reportIssue(asin, reason.trim(), { title: bookTitle, author: bookAuthor, coverArtUrl, }); setReason(''); onSuccess(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to report issue'); } }; if (!isOpen) return null; const modalContent = (
!isLoading && onClose()} >
e.stopPropagation()} > {/* Header */}

Report Issue

{bookTitle}

{/* Reason Textarea */}