/** * Component: Add Goodreads Shelf Modal * Documentation: documentation/frontend/components.md */ 'use client'; import React, { useState } from 'react'; import { Modal } from './Modal'; import { Input } from './Input'; import { Button } from './Button'; import { useAddGoodreadsShelf } from '@/lib/hooks/useGoodreadsShelves'; interface AddGoodreadsShelfModalProps { isOpen: boolean; onClose: () => void; } const GOODREADS_RSS_PATTERN = /goodreads\.com\/review\/list_rss\//; export function AddGoodreadsShelfModal({ isOpen, onClose }: AddGoodreadsShelfModalProps) { const [rssUrl, setRssUrl] = useState(''); const [validationError, setValidationError] = useState(''); const [success, setSuccess] = useState(false); const [successMessage, setSuccessMessage] = useState(''); const { addShelf, isLoading, error } = useAddGoodreadsShelf(); const validateUrl = (url: string): boolean => { if (!url.trim()) { setValidationError('RSS URL is required'); return false; } if (!GOODREADS_RSS_PATTERN.test(url)) { setValidationError('Must be a Goodreads shelf RSS URL (goodreads.com/review/list_rss/...)'); return false; } setValidationError(''); return true; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateUrl(rssUrl)) return; try { const shelf = await addShelf(rssUrl); setSuccess(true); setSuccessMessage(`Added shelf "${shelf.name}" successfully!`); setRssUrl(''); setTimeout(() => { setSuccess(false); onClose(); }, 2000); } catch { // Error is handled by the hook } }; const handleClose = () => { setRssUrl(''); setValidationError(''); setSuccess(false); setSuccessMessage(''); onClose(); }; return (
{/* Visual header */}

Paste your Goodreads shelf RSS URL. Books will be automatically requested as audiobooks during each sync.

{/* Success alert */} {success && (

{successMessage}

)} {/* Error alert */} {error && (

{error}

)} {/* Form */}
{ setRssUrl(e.target.value); if (validationError) setValidationError(''); }} placeholder="https://www.goodreads.com/review/list_rss/..." error={validationError} disabled={isLoading || success} />

Find it on Goodreads: My Books → select a shelf → RSS link at the bottom of the page.

); }