const { useState, useEffect, useRef } = React;
/* ---------------- HOME ---------------- */
const TYPE_FILTERS = [
{id:'anime', label:'أنمي'}, {id:'tv', label:'مسلسلات'}, {id:'movie', label:'أفلام'}
];
function HomeScreen({ctx}){
const [filter,setFilter] = useState('anime');
const pool = MAT.all.filter(a=>a.type===filter);
const continueList = ctx.continueList();
const latest = [...pool].sort((a,b)=>b.year-a.year).slice(0,10);
return (
);
}
/* ---------------- CATEGORIES ---------------- */
function CategoriesScreen({ctx}){
return (
{MAT.cats.map(c=>(
ctx.go('genre',{cat:c})}
style={{borderRadius:16,padding:'22px 16px',background:`linear-gradient(135deg, ${c.hue}33, var(--surface2))`,border:'1px solid var(--border)',fontWeight:700,fontSize:15}}>
{c.name}
))}
);
}
function GenreScreen({ctx, params}){
const c = params.cat;
const items = MAT.all.filter(a=>a.genres.includes(c.g));
return (
{items.map(a=>(
ctx.go('details',{item:a})}>
{TYPE_LABEL[a.type]}
{a.title}
))}
{!items.length &&
}
);
}
/* ---------------- LIBRARY (favorites + history) ---------------- */
function LibraryScreen({ctx}){
const [tab,setTab] = useState('fav');
const favItems = ctx.favorites.map(id=>ctx.byId(id)).filter(Boolean);
const histItems = ctx.history;
return (
{tab==='fav' && (favItems.length ? favItems.map(a=>(
ctx.go('details',{item:a})}>
{a.title}
{a.year} · {TYPE_LABEL[a.type]}
{e.stopPropagation();ctx.toggleFav(a.id);}}>
)) :
♡
لا توجد عناصر في المفضلة
)}
{tab==='hist' && (histItems.length ? histItems.map((h,i)=>{
const a = ctx.byId(h.animeId); if(!a) return null;
return (
ctx.resume({anime:a,season:h.season,ep:h.ep,quality:h.quality})}>
{a.title}
{a.type==='movie'?'فيلم':`م${h.season} ح${h.ep}`}
);
}) :
)}
);
}
/* ---------------- SEARCH ---------------- */
function SearchScreen({ctx}){
const [q,setQ] = useState('');
const results = q.trim() ? MAT.all.filter(a=>a.title.toLowerCase().includes(q.toLowerCase())) : [];
return (
setQ(e.target.value)} />
{q &&
setQ('')}>
}
{!q &&
}
{q && !results.length &&
}
{results.length>0 &&
{results.map(a=>(
ctx.go('details',{item:a})}>
{TYPE_LABEL[a.type]}
{a.title}
))}
}
);
}
/* ---------------- DETAILS ---------------- */
function DetailsScreen({ctx, params}){
const a = params.item;
const [openSeason,setOpenSeason] = useState(0);
const isFav = ctx.isFav(a.id);
const inProgress = ctx.history.find(h=>h.animeId===a.id && h.progress>0.01 && h.progress<0.98);
return (
{a.title}
{a.rating}
{a.year}·
{a.type==='movie'?`${a.runtime} دقيقة`:`${a.seasons} مواسم`}
·{a.quality}
{a.genres.map(g=> {g})}
{a.desc}
{!(a.type==='movie') &&
{a.seasonsList.map((s,i)=>{
const isOpen = openSeason===i;
return (
setOpenSeason(isOpen?-1:i)}>
الموسم {s.s}
{s.episodes.length} حلقة
{isOpen &&
{s.episodes.map(ep=>(
ctx.go('player',{item:a, season:s.s, episode:ep.n, quality:a.quality})}>
{ep.watched? : ep.n}
{ep.title}
{ep.dur} دقيقة
{ep.progress>0 &&
}
))}
}
);
})}
}
);
}
/* ---------------- PLAYER ---------------- */
function PlayerScreen({ctx, params}){
const a = params.item;
const seasonNum = params.season, epNum = params.episode;
const [quality,setQuality] = useState(params.quality || a.quality);
const [progress,setProgress] = useState(()=> ctx.savedPos(a.id, seasonNum, epNum));
const [playing,setPlaying] = useState(true);
const [showQ,setShowQ] = useState(false);
const [fullscreen,setFullscreen] = useState(false);
const season = a.seasonsList.find(s=>s.s===seasonNum) || a.seasonsList[0];
const ep = season.episodes.find(e=>e.n===epNum) || season.episodes[0];
const durSec = (ep.dur||20)*60;
useEffect(()=>{
if(!playing) return;
const id = setInterval(()=>{
setProgress(p=>{
const np = Math.min(1, p + (3/durSec));
ctx.recordPlay(a, seasonNum, epNum, quality, np);
if(np>=1){ clearInterval(id); }
return np;
});
},1000);
return ()=>clearInterval(id);
},[playing, seasonNum, epNum, quality]);
const curSec = Math.floor(progress*durSec);
const fmt = s=>`${Math.floor(s/60)}:${String(Math.floor(s%60)).padStart(2,'0')}`;
const nextEp = season.episodes.find(e=>e.n===epNum+1);
const prevEp = season.episodes.find(e=>e.n===epNum-1);
return (
{a.title}
{a.type==='movie'? a.title : `الموسم ${seasonNum} · الحلقة ${epNum}`}
setFullscreen(f=>!f)}>
setShowQ(true)}>
{!(a.type==='movie') && }
{!(a.type==='movie') && }
{fmt(curSec)}
{fmt(durSec)}
{!fullscreen &&
{a.type==='movie' ?
{a.desc}
:
الموسم {seasonNum}
{season.episodes.map(e=>(
ctx.go('player',{item:a, season:seasonNum, episode:e.n, quality})}>
{e.n}
{e.title}
{e.dur} دقيقة
{e.n===epNum &&
}
))}
}
}
{showQ &&
setShowQ(false)}>
{MAT.qualities.map(q=>(
{setQuality(q);setShowQ(false);}}>
{q}{q===quality && }
))}
}
);
}
/* ---------------- SETTINGS ---------------- */
function SettingsScreen({ctx}){
const s = ctx.settings;
return (
التشغيل
تشغيل تلقائي للحلقة التالية
ينتقل تلقائيًا عند الانتهاء
ctx.setSetting('autoPlay',!s.autoPlay)}>
استكمال المشاهدة
يبدأ من آخر نقطة توقف
ctx.setSetting('resume',!s.resume)}>
الجودة الافتراضية
{['تلقائي','1080p','720p','480p'].map(q=>(
ctx.setSetting('defaultQuality',q)}>{q}
))}
البيانات
{ctx.clearHistory(); ctx.toast('تم مسح السجل');}}>
مسح سجل المشاهدة
{ctx.clearFavorites(); ctx.toast('تم مسح المفضلة');}}>
مسح قائمة المفضلة
);
}
Object.assign(window, { HomeScreen, CategoriesScreen, GenreScreen, LibraryScreen, SearchScreen, DetailsScreen, PlayerScreen, SettingsScreen });