diff --git a/src/components/LiveActivitiesStrip.tsx b/src/components/LiveActivitiesStrip.tsx index c27f2f59..47f6d9f1 100644 --- a/src/components/LiveActivitiesStrip.tsx +++ b/src/components/LiveActivitiesStrip.tsx @@ -3,7 +3,7 @@ import { cn } from '@/lib/utils' import { useLiveActivitiesOptional } from '@/providers/LiveActivitiesProvider' import { useUserPreferences } from '@/providers/UserPreferencesProvider' import { ExternalLink } from 'lucide-react' -import { useEffect, useState } from 'react' +import { useEffect, useLayoutEffect, useState } from 'react' import { useTranslation } from 'react-i18next' type TPlacement = 'sidebar' | 'mobile' @@ -37,11 +37,21 @@ export default function LiveActivitiesStrip({ placement }: { placement: TPlaceme return () => window.clearInterval(id) }, [items.length, reduceMotion]) + useLayoutEffect(() => { + if (items.length === 0) return + setSlide((s) => Math.min(s, items.length - 1)) + }, [items.length]) + if (!showLiveActivitiesBanner || items.length === 0) { return null } - const current = items[slide]! + // `items` can shrink without a new array identity; `slide` may then be out of range until effects run. + const displayIndex = Math.min(slide, items.length - 1) + const current = items[displayIndex] + if (!current) { + return null + } return (
{ e.preventDefault() diff --git a/src/components/NormalFeed/index.tsx b/src/components/NormalFeed/index.tsx index 0290c832..66a80154 100644 --- a/src/components/NormalFeed/index.tsx +++ b/src/components/NormalFeed/index.tsx @@ -28,10 +28,20 @@ const NormalFeed = forwardRef