@@ -219,6 +238,14 @@ export default function Library() {
))}
)}
+
+
setAlertConfig(prev => ({ ...prev, isOpen: false }))}
+ />
);
}
diff --git a/frontend/src/pages/Trending.tsx b/frontend/src/pages/Trending.tsx
index df79dfb..f5dc5d6 100644
--- a/frontend/src/pages/Trending.tsx
+++ b/frontend/src/pages/Trending.tsx
@@ -6,6 +6,7 @@ import Header from '../components/Header';
import { Loader, Plus, Flame, Check, Sparkles, TrendingUp } from 'lucide-react';
import { authService } from '../services/authService';
import SuccessModal from '../components/SuccessModal';
+import AlertModal, { AlertType } from '../components/AlertModal';
export default function Trending() {
const queryClient = useQueryClient();
@@ -17,6 +18,19 @@ export default function Trending() {
const [showSuccessModal, setShowSuccessModal] = useState(false);
const [successPodcast, setSuccessPodcast] = useState
(null);
+ // Alert state
+ const [alertConfig, setAlertConfig] = useState<{
+ isOpen: boolean;
+ title: string;
+ message: string;
+ type: AlertType;
+ }>({
+ isOpen: false,
+ title: '',
+ message: '',
+ type: 'error'
+ });
+
const GENRES = [
{ id: '', label: 'Tout' },
{ id: '1318', label: 'Technologie' },
@@ -98,7 +112,16 @@ export default function Trending() {
}),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['podcasts', 'subscriptions'] });
+ queryClient.invalidateQueries({ queryKey: ['episodes', 'latest'] });
},
+ onError: (error: any) => {
+ setAlertConfig({
+ isOpen: true,
+ title: "Échec de l'abonnement",
+ message: error.response?.data?.message || "Une erreur est survenue. Le flux de ce podcast est peut-être temporairement inaccessible.",
+ type: 'error'
+ });
+ }
});
const handleSubscribe = async (podcast: DiscoveryPodcast) => {
@@ -109,7 +132,12 @@ export default function Trending() {
setShowSuccessModal(true);
queryClient.invalidateQueries({ queryKey: ['episodes', 'latest'] });
} catch (error: any) {
- console.error(error);
+ setAlertConfig({
+ isOpen: true,
+ title: "Action impossible",
+ message: "Une erreur critique est survenue lors de la tentative d'abonnement.",
+ type: 'error'
+ });
} finally {
setSubscribingId(null);
}
@@ -257,6 +285,14 @@ export default function Trending() {
podcastAuthor={successPodcast?.author || ""}
podcastImage={successPodcast?.imageUrl || ""}
/>
+
+ setAlertConfig(prev => ({ ...prev, isOpen: false }))}
+ />
);
}
diff --git a/frontend/src/styles/globals.css b/frontend/src/styles/globals.css
index 03f5f91..9451020 100644
--- a/frontend/src/styles/globals.css
+++ b/frontend/src/styles/globals.css
@@ -14,7 +14,7 @@
--accent-glow: rgba(99, 102, 241, 0.35);
--border-color: rgba(255, 255, 255, 0.07);
--glass-blur: blur(24px) saturate(180%);
- --shadow-premium: 0 8px 40px rgba(0, 0, 0, 0.4);
+ --shadow-premium: 0 25px 60px rgba(0, 0, 0, 0.6), 0 0 1px rgba(255, 255, 255, 0.1);
--input-bg: rgba(255, 255, 255, 0.03);
--radius-card: 1.5rem; /* 24px */
--radius-panel: 2rem; /* 32px */
@@ -31,7 +31,7 @@
--accent-glow: rgba(197, 160, 40, 0.2);
--border-color: rgba(197, 160, 40, 0.15);
--glass-blur: blur(20px) saturate(120%);
- --shadow-premium: 0 12px 48px rgba(0, 0, 0, 0.08);
+ --shadow-premium: 0 20px 50px rgba(197, 160, 40, 0.15), 0 10px 30px rgba(0, 0, 0, 0.06);
--radius-card: 1.5rem;
--radius-panel: 2rem;
--input-bg: #ffffff;