diff --git a/apps/web/src/pages/UserBookDetailPage.tsx b/apps/web/src/pages/UserBookDetailPage.tsx index 97799768..d5ea0473 100644 --- a/apps/web/src/pages/UserBookDetailPage.tsx +++ b/apps/web/src/pages/UserBookDetailPage.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useMemo, useRef } from 'react' import { useParams, Link, useNavigate } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import { useLanguage } from '../context/LanguageContext' -import { getUserBook, deleteUserBook, markUserBookComplete, unmarkUserBookComplete, getUserBookCoverUrl, type UserBookDetail } from '../api/userBooks' +import { getUserBook, deleteUserBook, retryUserBook, markUserBookComplete, unmarkUserBookComplete, getUserBookCoverUrl, type UserBookDetail } from '../api/userBooks' import { SeoHead } from '../components/SeoHead' import { Footer } from '../components/Footer' import { stringToColor } from '../utils/colors' @@ -27,6 +27,7 @@ export function UserBookDetailPage() { const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [deleting, setDeleting] = useState(false) + const [reprocessing, setReprocessing] = useState(false) // Inline two-stage confirm — mirrors VocabularyPage's delete pattern. // First click flips the icon button into a red "Confirm?" pill; a second // click within 3 s actually deletes. Avoids the browser-native confirm() @@ -297,6 +298,36 @@ export function UserBookDetailPage() { /> )} + {isReady && ( + + )} + {isReady && (