| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- import { useState, useEffect } from 'react';
- import { supabase } from '@/integrations/supabase/client';
- import { Feed } from '@/types/feed';
- import { useAuth } from './useAuth';
- import { toast } from 'sonner';
- export function useFeeds() {
- const [feeds, setFeeds] = useState<Feed[]>([]);
- const [loading, setLoading] = useState(true);
- const { user } = useAuth();
- const fetchFeeds = async () => {
- try {
- setLoading(true);
-
- // Fetch all feeds
- const { data: feedsData, error: feedsError } = await supabase
- .from('feeds')
- .select('*')
- .order('name');
- if (feedsError) {
- toast.error('Erreur lors du chargement des flux');
- console.error('Error fetching feeds:', feedsError);
- return;
- }
- // If user is authenticated, fetch their subscriptions
- let userFeedsData = null;
- if (user) {
- const { data, error } = await supabase
- .from('user_feeds')
- .select('feed_id, is_followed')
- .eq('user_id', user.id);
- if (error) {
- console.error('Error fetching user feeds:', error);
- } else {
- userFeedsData = data;
- }
- }
- // Combine feeds with user subscription status
- const combinedFeeds = feedsData.map(feed => ({
- id: feed.id,
- name: feed.name,
- url: feed.url,
- type: feed.type as Feed['type'],
- description: feed.description,
- category: feed.category,
- isFollowed: userFeedsData?.find(uf => uf.feed_id === feed.id)?.is_followed || false,
- lastUpdated: feed.last_updated || feed.created_at,
- articleCount: feed.article_count || 0,
- status: feed.status as Feed['status']
- }));
- setFeeds(combinedFeeds);
- } catch (error) {
- console.error('Error in fetchFeeds:', error);
- toast.error('Erreur lors du chargement des flux');
- } finally {
- setLoading(false);
- }
- };
- const toggleFollow = async (feedId: string) => {
- if (!user) {
- toast.error('Vous devez être connecté pour suivre un flux');
- return;
- }
- try {
- const feed = feeds.find(f => f.id === feedId);
- if (!feed) return;
- // Check if subscription exists
- const { data: existingSubscription } = await supabase
- .from('user_feeds')
- .select('*')
- .eq('user_id', user.id)
- .eq('feed_id', feedId)
- .single();
- if (existingSubscription) {
- // Update existing subscription
- const { error } = await supabase
- .from('user_feeds')
- .update({ is_followed: !feed.isFollowed })
- .eq('user_id', user.id)
- .eq('feed_id', feedId);
- if (error) {
- toast.error('Erreur lors de la mise à jour');
- return;
- }
- } else {
- // Create new subscription
- const { error } = await supabase
- .from('user_feeds')
- .insert({
- user_id: user.id,
- feed_id: feedId,
- is_followed: true
- });
- if (error) {
- toast.error('Erreur lors de l\'ajout');
- return;
- }
- }
- // Update local state
- setFeeds(prev => prev.map(f =>
- f.id === feedId
- ? { ...f, isFollowed: !f.isFollowed }
- : f
- ));
- toast.success(
- feed.isFollowed
- ? `Vous ne suivez plus "${feed.name}"`
- : `Vous suivez maintenant "${feed.name}"`
- );
- } catch (error) {
- console.error('Error toggling follow:', error);
- toast.error('Erreur lors de la mise à jour');
- }
- };
- useEffect(() => {
- fetchFeeds();
- }, [user]);
- return {
- feeds,
- loading,
- toggleFollow,
- refetch: fetchFeeds
- };
- }
|