diff --git a/src/contexts/MediaContext.jsx b/src/contexts/MediaContext.jsx index 52bf299..89c7dc3 100644 --- a/src/contexts/MediaContext.jsx +++ b/src/contexts/MediaContext.jsx @@ -1,117 +1,90 @@ -import { createContext, useContext, useState, useCallback } from "react"; -import { - getTrendingMedia, - getMediaById, - searchMedia, -} from "../services/mediaService"; +import React, { createContext, useContext, useState } from 'react'; +import { searchMedia, getMediaDetails, validateMediaData, formatMediaData } from '../services/mediaService'; +import { createMedia } from '../services/supabase'; const MediaContext = createContext(); -export function useMedia() { +export const useMedia = () => { const context = useContext(MediaContext); if (!context) { - throw new Error("useMedia must be used within a MediaProvider"); + throw new Error('useMedia must be used within a MediaProvider'); } return context; -} +}; -export function MediaProvider({ children }) { - const [trendingMovies, setTrendingMovies] = useState([]); - const [trendingTvShows, setTrendingTvShows] = useState([]); - const [trendingGames, setTrendingGames] = useState([]); - const [currentMedia, setCurrentMedia] = useState(null); +export const MediaProvider = ({ children }) => { + const [searchResults, setSearchResults] = useState([]); + const [selectedMedia, setSelectedMedia] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); - const [searchResults, setSearchResults] = useState([]); - - const fetchTrendingMedia = useCallback(async () => { - setLoading(true); - setError(null); + const handleSearch = async (query, type = 'movie') => { try { - const [movies, tvShows, games] = await Promise.all([ - getTrendingMedia("movie"), - getTrendingMedia("tv"), - getTrendingMedia("game"), - ]); - - setTrendingMovies(movies || []); - setTrendingTvShows(tvShows || []); - setTrendingGames(games || []); - } catch (err) { - setError(err.message || "Failed to fetch trending media"); - console.error("Fetch trending error:", err); - // Сброс состояний на случай частичного успеха - setTrendingMovies([]); - setTrendingTvShows([]); - setTrendingGames([]); + setLoading(true); + setError(null); + const results = await searchMedia(query, type); + setSearchResults(results); + } catch (error) { + console.error('Search error:', error); + setError('Ошибка при поиске медиа'); } finally { setLoading(false); } - }, []); - - const fetchMediaDetails = useCallback(async (id) => { - if (!id) { - setError("Invalid media ID"); - return; - } - - setLoading(true); - setError(null); - setCurrentMedia(null); + }; + const handleSelectMedia = async (tmdbId, type) => { try { - const data = await getMediaById(id); - if (!data) { - throw new Error("Media not found"); + setLoading(true); + setError(null); + const details = await getMediaDetails(tmdbId, type); + setSelectedMedia(details); + } catch (error) { + console.error('Error fetching media details:', error); + setError('Ошибка при получении деталей медиа'); + } finally { + setLoading(false); + } + }; + + const handleCreateMedia = async (mediaData) => { + try { + setLoading(true); + setError(null); + + // Валидация данных + const errors = validateMediaData(mediaData); + if (errors.length > 0) { + throw new Error(errors.join('\n')); } - setCurrentMedia(data); - } catch (err) { - setError(err.message || "Failed to fetch media details"); - console.error("Fetch details error:", err); + + // Форматирование данных + const formattedData = formatMediaData(mediaData); + + // Создание медиа + const newMedia = await createMedia(formattedData); + return newMedia; + } catch (error) { + console.error('Error creating media:', error); + setError(error.message || 'Ошибка при создании медиа'); + throw error; } finally { setLoading(false); } - }, []); - - const handleSearch = useCallback(async (query) => { - if (!query || !query.trim()) { - setSearchResults([]); - return; - } - - setLoading(true); - setError(null); - - try { - const results = await searchMedia(query); - setSearchResults(Array.isArray(results) ? results : []); - } catch (err) { - setError(err.message || "Search failed"); - console.error("Search error:", err); - setSearchResults([]); - } finally { - setLoading(false); - } - }, []); + }; const value = { - trendingMovies, - trendingTvShows, - trendingGames, - currentMedia, + searchResults, + selectedMedia, loading, error, - searchResults, - fetchTrendingMedia, - fetchMediaDetails, handleSearch, - clearError: () => setError(null), - clearCurrentMedia: () => setCurrentMedia(null), - clearSearchResults: () => setSearchResults([]), + handleSelectMedia, + handleCreateMedia }; return ( - {children} + + {children} + ); -} +};