'use client'; import useGlobalFeed from '@/features/feeds/lib/queries/useGlobalFeed'; import useFollowingFeed from '@/features/feeds/lib/queries/useFollowingFeed'; import FeedItem from '@/features/feeds/components/feedItem/FeedItem'; import { Stack, Text, Center, Container, Box, Loader, Collapse, } from '@mantine/core'; import MyFeedContainerSkeleton from './Skeleton.MyFeedContainer'; import MyFeedContainerError from './Error.MyFeedContainer'; import InfiniteScroll from '@/components/contentDisplay/infiniteScroll/InfiniteScroll'; import RefetchButton from '@/components/navigation/refetchButton/RefetchButton'; import { UrlType, ActivitySource, ActivityType } from '@semble/types'; import { useSearchParams, useRouter, usePathname } from 'next/navigation'; import { CardSaveSource } from '@/features/analytics/types'; import { useState, useEffect } from 'react'; export default function MyFeedContainer() { const pathname = usePathname(); const searchParams = useSearchParams(); const selectedUrlType = searchParams.get('type') as UrlType; const selectedSource = searchParams.get('source') as ActivitySource; const selectedFeed = (searchParams.get('feed') as 'global' | 'following') || 'global'; // Parse activityTypes from URL params (lowercase) and convert to enum values const activityTypesParam = searchParams.getAll('activityTypes'); const selectedActivityTypes = activityTypesParam.length > 0 ? activityTypesParam .map((param) => Object.values(ActivityType).find( (t) => t.toLowerCase() === param.toLowerCase(), ), ) .filter((t): t is ActivityType => t !== undefined) : undefined; const activityTypesFilter = selectedActivityTypes; const globalFeed = useGlobalFeed({ urlType: selectedUrlType, source: selectedSource, activityTypes: activityTypesFilter, }); const followingFeed = useFollowingFeed({ urlType: selectedUrlType, source: selectedSource, activityTypes: activityTypesFilter, enabled: selectedFeed === 'following', }); // Use the appropriate feed based on selection const activeFeed = selectedFeed === 'following' ? followingFeed : globalFeed; const { data, error, isPending, fetchNextPage, hasNextPage, isFetchingNextPage, isRefetching, refetch, } = activeFeed; // Ensure animation is visible even for fast refetches const [showRefetchLoader, setShowRefetchLoader] = useState(false); const MIN_DISPLAY_TIME = 400; // milliseconds useEffect(() => { if (isRefetching) { setShowRefetchLoader(true); } else if (showRefetchLoader) { // Keep showing the loader for minimum time to ensure animation completes const timer = setTimeout(() => { setShowRefetchLoader(false); }, MIN_DISPLAY_TIME); return () => clearTimeout(timer); } }, [isRefetching, showRefetchLoader]); const allActivities = data?.pages.flatMap((page) => page.activities ?? []) ?? []; if (isPending) { return ; } if (error) { return ; } return ( Fetching the latest activities... {allActivities.length === 0 ? (
No activity to show yet
) : ( {allActivities.map((item) => ( ))} )} refetch()} />
); }