diff --git a/src/components/metadata/SeriesContent.tsx b/src/components/metadata/SeriesContent.tsx index ce31524a..f2c863c7 100644 --- a/src/components/metadata/SeriesContent.tsx +++ b/src/components/metadata/SeriesContent.tsx @@ -44,6 +44,8 @@ export const SeriesContent: React.FC = ({ const isTablet = width > 768; const isDarkMode = useColorScheme() === 'dark'; const [episodeProgress, setEpisodeProgress] = useState<{ [key: string]: { currentTime: number; duration: number; lastUpdated: number } }>({}); + // Delay item entering animations to avoid FlashList initial layout glitches + const [enableItemAnimations, setEnableItemAnimations] = useState(false); // Add refs for the scroll views const seasonScrollViewRef = useRef(null); @@ -160,6 +162,12 @@ export const SeriesContent: React.FC = ({ loadEpisodesProgress(); }, [episodes, metadata?.id]); + // Enable item animations shortly after mount to avoid initial overlap/glitch + useEffect(() => { + const timer = setTimeout(() => setEnableItemAnimations(true), 200); + return () => clearTimeout(timer); + }, []); + // Refresh watch progress when screen comes into focus useFocusEffect( React.useCallback(() => { @@ -655,7 +663,7 @@ export const SeriesContent: React.FC = ({ data={currentSeasonEpisodes} renderItem={({ item: episode, index }) => ( = ({ showsHorizontalScrollIndicator={false} contentContainerStyle={isTablet ? styles.episodeListContentHorizontalTablet : styles.episodeListContentHorizontal} estimatedItemSize={(isTablet ? width * 0.4 : width * 0.75) + (isTablet ? 20 : 16)} + estimatedListSize={{ width: Dimensions.get('window').width, height: isTablet ? 260 + 24 : 200 + 20 }} overrideItemLayout={(layout, _item, _index) => { const cardWidth = isTablet ? width * 0.4 : width * 0.75; const margin = isTablet ? 20 : 16; @@ -685,7 +694,7 @@ export const SeriesContent: React.FC = ({ data={currentSeasonEpisodes} renderItem={({ item: episode, index }) => ( {renderVerticalEpisodeCard(episode)} @@ -693,6 +702,7 @@ export const SeriesContent: React.FC = ({ keyExtractor={episode => episode.id.toString()} contentContainerStyle={isTablet ? styles.episodeListContentVerticalTablet : styles.episodeListContentVertical} estimatedItemSize={isTablet ? 160 + 16 : 120 + 16} + estimatedListSize={{ width: Dimensions.get('window').width, height: isTablet ? 160 + 16 : 120 + 16 }} overrideItemLayout={(layout, _item, _index) => { // height along main axis for vertical list const itemHeight = (isTablet ? 160 : 120) + 16; // card height + marginBottom