Spaces:
Sleeping
Sleeping
| --- | |
| import HeroBanner from './HeroBanner.jsx'; | |
| import { getNewestMovies } from '../lib/api.js'; | |
| import { txasupabase } from '../lib/txasupabase.js'; | |
| // 1. Lấy tất cả phim cục bộ để tìm phim được ghim lên slider | |
| const localMoviesObj = await txasupabase.getLocalMovies(); | |
| const deletedSlugs = await txasupabase.getDeletedMovies(); | |
| const allLocalMovies = Object.values(localMoviesObj) | |
| .filter(m => !deletedSlugs.includes(m.movie.slug)); | |
| // Lọc các phim được chọn ghim lên slider | |
| const pinnedMovies = allLocalMovies | |
| .filter(m => m.movie.is_slider === true || m.movie.is_slider === 'true') | |
| .map(m => ({ | |
| _id: m.movie.id || m.movie.slug, | |
| name: m.movie.name, | |
| slug: m.movie.slug, | |
| origin_name: m.movie.origin_name, | |
| thumb_url: m.movie.thumb_url, | |
| poster_url: m.movie.poster_url, | |
| year: m.movie.year, | |
| quality: m.movie.quality || 'FHD', | |
| lang: m.movie.lang || 'Vietsub', | |
| episode_current: m.movie.episode_current || 'Tập 1', | |
| type: m.movie.type || 'single', | |
| isLocal: true | |
| })); | |
| // Sắp xếp phim được ghim theo thời gian cập nhật mới nhất | |
| pinnedMovies.sort((a, b) => { | |
| const timeA = new Date(localMoviesObj[a.slug]?.movie.modified?.time || 0).getTime(); | |
| const timeB = new Date(localMoviesObj[b.slug]?.movie.modified?.time || 0).getTime(); | |
| return timeB - timeA; | |
| }); | |
| // Cần tối đa 10 phim cho slider | |
| let heroMovies = [...pinnedMovies]; | |
| if (heroMovies.length === 0) { | |
| // Lấy danh sách phim mới nhất để bù đắp các vị trí trống | |
| const newest = await getNewestMovies(1); | |
| const newestMovies = newest?.items || []; | |
| let extraMovies = [...newestMovies]; | |
| if (extraMovies.length < 4) { | |
| try { | |
| const res = await fetch('https://phimapi.com/danh-sach/phim-moi-cap-nhat?page=1'); | |
| if (res.ok) { | |
| const data = await res.json(); | |
| const items = data.items || []; | |
| const mapped = items.map(item => ({ | |
| _id: item._id, | |
| name: item.name, | |
| slug: item.slug, | |
| origin_name: item.origin_name, | |
| thumb_url: item.thumb_url, | |
| poster_url: item.poster_url, | |
| year: item.year, | |
| quality: item.quality || 'FHD', | |
| lang: item.lang || 'Vietsub', | |
| episode_current: item.episode_current || 'Tập 1', | |
| type: item.type || 'single', | |
| isLocal: false | |
| })); | |
| extraMovies = [...extraMovies, ...mapped.filter(m => !extraMovies.some(x => x.slug === m.slug))]; | |
| } | |
| } catch (e) { | |
| console.error('Hero fallback error:', e); | |
| } | |
| } | |
| // Thêm phim mới vào slider và loại trừ các phim đã được ghim/đã thêm để tránh trùng lặp | |
| for (const movie of extraMovies) { | |
| if (heroMovies.length >= 10) break; | |
| if (!heroMovies.some(m => m.slug === movie.slug)) { | |
| heroMovies.push(movie); | |
| } | |
| } | |
| } | |
| // Giới hạn đúng tối đa 10 phim | |
| heroMovies = heroMovies.slice(0, 10); | |
| --- | |
| <HeroBanner movies={heroMovies} client:load /> | |