diff --git a/src/pages/ListingPage.jsx b/src/pages/ListingPage.jsx index 52699b9..b65eb59 100644 --- a/src/pages/ListingPage.jsx +++ b/src/pages/ListingPage.jsx @@ -4,7 +4,7 @@ import { SectionHeading } from '../components/SectionHeading'; import { videos } from '../data/catalog'; import { useAppStore } from '../app/store'; import { appApi } from '../services/appApi'; -import { normalizeDrama, normalizePage } from '../services/normalizers'; +import { normalizeDrama, normalizePage, uniqueDramas } from '../services/normalizers'; import { useApi } from '../hooks/useApi'; -export function ListingPage({ type }) { const { locale } = useAppStore(); const title = type === 'shorts' ? locale.shortTitle : type === 'subscriptions' ? locale.channels : type === 'history' ? locale.history : locale.library; const api = useApi(() => appApi.dramas().then((payload) => normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code))), [locale.code]); const items = api.data?.length ? api.data : videos; return <>
{api.loading ? locale.loading : api.error ? locale.apiFallback : ''}
{items.map((video) => )}
; } +export function ListingPage({ type }) { const { locale } = useAppStore(); const title = type === 'shorts' ? locale.shortTitle : type === 'subscriptions' ? locale.channels : type === 'history' ? locale.history : locale.library; const api = useApi(() => appApi.dramas().then((payload) => uniqueDramas(normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code)))), [locale.code]); const items = api.data?.length ? api.data : videos; return <>
{api.loading ? locale.loading : api.error ? locale.apiFallback : ''}
{items.map((video) => )}
; } diff --git a/src/pages/SearchPage.jsx b/src/pages/SearchPage.jsx index 16cbcb9..f36a4f4 100644 --- a/src/pages/SearchPage.jsx +++ b/src/pages/SearchPage.jsx @@ -5,7 +5,7 @@ import { SectionHeading } from '../components/SectionHeading'; import { useAppStore } from '../app/store'; import { searchCatalog } from '../services/catalogService'; import { appApi } from '../services/appApi'; -import { normalizeDrama, normalizePage } from '../services/normalizers'; +import { normalizeDrama, normalizePage, uniqueDramas } from '../services/normalizers'; import { useApi } from '../hooks/useApi'; -export function SearchPage() { const { locale } = useAppStore(); const [params] = useSearchParams(); const query = params.get('q') || ''; const api = useApi(() => appApi.dramas().then((payload) => normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code))), [locale.code]); const source = api.data?.length ? api.data : searchCatalog('', '', 0); const normalizedQuery = query.toLowerCase(); const results = source.filter((video) => `${video.title} ${video.channel} ${video.genre}`.toLowerCase().includes(normalizedQuery)); return <>
{api.loading ? locale.loading : api.error ? locale.apiFallback : ''}
{results.map((video) => )}
; } +export function SearchPage() { const { locale } = useAppStore(); const [params] = useSearchParams(); const query = params.get('q') || ''; const api = useApi(() => appApi.dramas().then((payload) => uniqueDramas(normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code)))), [locale.code]); const source = api.data?.length ? api.data : searchCatalog('', '', 0); const normalizedQuery = query.toLowerCase(); const results = source.filter((video) => `${video.title} ${video.channel} ${video.genre}`.toLowerCase().includes(normalizedQuery)); return <>
{api.loading ? locale.loading : api.error ? locale.apiFallback : ''}
{results.map((video) => )}
; } diff --git a/src/pages/ShortsFeedPage.jsx b/src/pages/ShortsFeedPage.jsx index 722e251..58ff5c3 100644 --- a/src/pages/ShortsFeedPage.jsx +++ b/src/pages/ShortsFeedPage.jsx @@ -4,9 +4,9 @@ import { Link } from 'react-router-dom'; import { Play } from 'lucide-react'; import { videos } from '../data/catalog'; import { appApi } from '../services/appApi'; -import { normalizePage, normalizeDrama } from '../services/normalizers'; +import { normalizePage, normalizeDrama, uniqueDramas } from '../services/normalizers'; import { useApi } from '../hooks/useApi'; import { useAppStore } from '../app/store'; function FeedItem({ video }) { const ref = useRef(null); useEffect(() => { const element = ref.current; const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) element.play().catch(() => {}); else element.pause(); }, { threshold: 0.7 }); observer.observe(element); return () => observer.disconnect(); }, []); const src = video.preview?.playUrl || video.videoUrl || ''; return
; } -export function ShortsFeedPage() { const { locale } = useAppStore(); const api = useApi(() => appApi.dramas().then((payload) => normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code))), [locale.code]); const items = api.data || []; return
YMB SHORTS

{locale.shortTitle}

{locale.swipeHint || 'Swipe up to discover the next story'}

{api.loading &&
Loading real shorts…
}{api.error &&
{api.error}
}{!api.loading && !items.length &&
{locale.empty}
}{items.map((video) => )}
; } +export function ShortsFeedPage() { const { locale } = useAppStore(); const api = useApi(() => appApi.dramas().then((payload) => uniqueDramas(normalizePage(payload).list.map((item) => normalizeDrama(item, locale.code)))), [locale.code]); const items = api.data || []; return
YMB SHORTS

{locale.shortTitle}

{locale.swipeHint || 'Swipe up to discover the next story'}

{api.loading &&
Loading real shorts…
}{api.error &&
{api.error}
}{!api.loading && !items.length &&
{locale.empty}
}{items.map((video) => )}
; }