You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
5.0 KiB
135 lines
5.0 KiB
import Navbar from '../components/Navbar.jsx';
|
|
import HeroImage from '../assets/img/hero.png';
|
|
import Recommendations from "../components/Recommendations.jsx";
|
|
import {useState, useEffect} from "react";
|
|
import { useAuth } from '../contexts/AuthContext';
|
|
import TopCreators from "../components/TopCreators.jsx";
|
|
import TrendingVideos from "../components/TrendingVideos.jsx";
|
|
import { getRecommendations, getTrendingVideos, getTopCreators } from '../services/recommendation.service.js';
|
|
import { useNavigate } from 'react-router-dom';
|
|
import SeeLater from "../components/SeeLater.jsx";
|
|
import {getSeeLater} from "../services/playlist.service.js";
|
|
|
|
export default function Home() {
|
|
const { isAuthenticated, user } = useAuth();
|
|
const [recommendations, setRecommendations] = useState([]);
|
|
const [loading, setLoading] = useState(true);
|
|
const [topCreators, setTopCreators] = useState([]);
|
|
const [trendingVideos, setTrendingVideos] = useState([]);
|
|
const [seeLaterVideos, setSeeLaterVideos] = useState([]);
|
|
const [alerts, setAlerts] = useState([]);
|
|
|
|
const navigate = useNavigate();
|
|
|
|
useEffect(() => {
|
|
const fetchData = async () => {
|
|
if (isAuthenticated) {
|
|
const token = localStorage.getItem('token');
|
|
try {
|
|
setRecommendations(await getRecommendations(token, addAlert));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
} else {
|
|
try {
|
|
setRecommendations(await getRecommendations(null, addAlert));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}
|
|
|
|
try {
|
|
setTrendingVideos(await getTrendingVideos(addAlert));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
|
|
if (isAuthenticated) {
|
|
try {
|
|
const token = localStorage.getItem('token');
|
|
setSeeLaterVideos(await getSeeLater(token, addAlert));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
} else {
|
|
try {
|
|
setTopCreators(await getTopCreators(addAlert));
|
|
} finally {
|
|
setLoading(false);
|
|
}
|
|
}
|
|
|
|
};
|
|
fetchData();
|
|
}, []);
|
|
|
|
const addAlert = (type, message) => {
|
|
const newAlert = { type, message, id: Date.now() };
|
|
setAlerts([...alerts, newAlert]);
|
|
};
|
|
|
|
const onCloseAlert = (alertToRemove) => {
|
|
setAlerts(alerts.filter(alert => alert !== alertToRemove));
|
|
};
|
|
|
|
return (
|
|
<div className=" lg:min-w-screen lg:min-h-screen bg-linear-to-br from-left-gradient to-right-gradient">
|
|
<Navbar isSearchPage={false} />
|
|
|
|
<main className=" px-5 lg:px-36">
|
|
|
|
{/* Hero section */}
|
|
<div className="flex flex-col items-center w-full pt-[128px] lg:pt-[304px]">
|
|
<img src={HeroImage} alt="" className=" w-1700/1920 lg:w-1046/1920" />
|
|
|
|
{isAuthenticated ? (
|
|
<h1 className="font-montserrat text-4xl lg:text-8xl font-black w-1200/1920 text-center text-white -translate-y-1/2">
|
|
Bienvenue {user?.username} !
|
|
</h1>
|
|
) : (
|
|
<>
|
|
<h1 className="font-montserrat text-4xl lg:text-8xl font-black w-1200/1920 text-center text-white -translate-y-1/2">
|
|
Regarder des vidéos comme jamais auparavant
|
|
</h1>
|
|
|
|
|
|
<div className="flex justify-center gap-10 -translate-y-[100px] mt-10">
|
|
<button className="bg-white text-black font-montserrat p-3 rounded-sm text-xl lg:text-2xl font-bold">
|
|
<a href="/login">
|
|
<p>Se connecter</p>
|
|
</a>
|
|
</button>
|
|
<button className="bg-primary p-3 rounded-sm text-white font-montserrat text-xl lg:text-2xl font-bold cursor-pointer">
|
|
<a href="/register">
|
|
<p>Créer un compte</p>
|
|
</a>
|
|
</button>
|
|
</div>
|
|
|
|
|
|
</>
|
|
)}
|
|
</div>
|
|
|
|
{/* Recommendations section */}
|
|
<Recommendations videos={recommendations} />
|
|
|
|
{/* Top Creators section */}
|
|
|
|
{
|
|
isAuthenticated ? (
|
|
<SeeLater videos={seeLaterVideos} />
|
|
) : (
|
|
<TopCreators creators={topCreators} navigate={navigate} />
|
|
)
|
|
}
|
|
|
|
|
|
|
|
{/* Trending Videos section */}
|
|
<TrendingVideos videos={trendingVideos} />
|
|
</main>
|
|
|
|
</div>
|
|
);
|
|
}
|