Fix entries list container

This commit is contained in:
Zoe Roux 2025-07-15 00:00:52 +02:00
parent 5ed43c85de
commit ff4155de5e
3 changed files with 29 additions and 26 deletions

View File

@ -1,5 +1,6 @@
import { LegendList } from "@legendapp/list"; import { LegendList } from "@legendapp/list";
import { type ComponentType, type ReactElement, useRef } from "react"; import { type ComponentType, type ReactElement, useRef } from "react";
import type { ViewStyle } from "react-native";
import { type Breakpoint, HR, useBreakpointMap } from "~/primitives"; import { type Breakpoint, HR, useBreakpointMap } from "~/primitives";
import { useSetError } from "~/providers/error-provider"; import { useSetError } from "~/providers/error-provider";
import { ErrorView } from "~/ui/errors"; import { ErrorView } from "~/ui/errors";
@ -23,6 +24,7 @@ export const InfiniteFetch = <Data,>({
divider, divider,
Header, Header,
fetchMore = true, fetchMore = true,
contentContainerStyle,
...props ...props
}: { }: {
query: QueryIdentifier<Data>; query: QueryIdentifier<Data>;
@ -36,6 +38,7 @@ export const InfiniteFetch = <Data,>({
divider?: true | ComponentType; divider?: true | ComponentType;
Header?: ComponentType<{ children: JSX.Element }> | ReactElement; Header?: ComponentType<{ children: JSX.Element }> | ReactElement;
fetchMore?: boolean; fetchMore?: boolean;
contentContainerStyle?: ViewStyle;
}): JSX.Element | null => { }): JSX.Element | null => {
const { numColumns, size, gap } = useBreakpointMap(layout); const { numColumns, size, gap } = useBreakpointMap(layout);
const [setOffline, clearOffline] = useSetError("offline"); const [setOffline, clearOffline] = useSetError("offline");
@ -87,7 +90,11 @@ export const InfiniteFetch = <Data,>({
divider === true ? HR : (divider as any) || undefined divider === true ? HR : (divider as any) || undefined
} }
ListEmptyComponent={Empty} ListEmptyComponent={Empty}
contentContainerStyle={{ gap, marginHorizontal: gap }} contentContainerStyle={{
...contentContainerStyle,
gap,
marginHorizontal: gap,
}}
{...props} {...props}
/> />
); );

View File

@ -6,6 +6,7 @@ import { rem, useYoshiki } from "yoshiki/native";
import { EntryLine, entryDisplayNumber } from "~/components/entries"; import { EntryLine, entryDisplayNumber } from "~/components/entries";
import { Entry, Season } from "~/models"; import { Entry, Season } from "~/models";
import { import {
Container,
H2, H2,
HR, HR,
IconButton, IconButton,
@ -139,7 +140,11 @@ export const EntryList = ({
query={EntryList.query(slug, season)} query={EntryList.query(slug, season)}
layout={EntryLine.layout} layout={EntryLine.layout}
Empty={<EmptyView message={t("show.episode-none")} />} Empty={<EmptyView message={t("show.episode-none")} />}
divider divider={() => (
<Container>
<HR />
</Container>
)}
// getItemType={(item) => // getItemType={(item) =>
// item.kind === "episode" && item.episodeNumber === 1? "withHeader" : "normal" // item.kind === "episode" && item.episodeNumber === 1? "withHeader" : "normal"
// } // }
@ -150,7 +155,7 @@ export const EntryList = ({
? seasons?.find((x) => x.seasonNumber === item.seasonNumber) ? seasons?.find((x) => x.seasonNumber === item.seasonNumber)
: null; : null;
return ( return (
<> <Container>
{sea && ( {sea && (
<SeasonHeader <SeasonHeader
serieSlug={slug} serieSlug={slug}
@ -166,14 +171,14 @@ export const EntryList = ({
displayNumber={entryDisplayNumber(item)} displayNumber={entryDisplayNumber(item)}
watchedPercent={item.progress.percent} watchedPercent={item.progress.percent}
/> />
</> </Container>
); );
}} }}
Loader={({ index }) => ( Loader={({ index }) => (
<> <Container>
{index === 0 && <SeasonHeader.Loader />} {index === 0 && <SeasonHeader.Loader />}
<EntryLine.Loader /> <EntryLine.Loader />
</> </Container>
)} )}
{...props} {...props}
/> />

View File

@ -1,6 +1,7 @@
import { useState } from "react"; import { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { Platform, View } from "react-native"; import { View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import Svg, { Path, type SvgProps } from "react-native-svg"; import Svg, { Path, type SvgProps } from "react-native-svg";
import { percent, useYoshiki } from "yoshiki/native"; import { percent, useYoshiki } from "yoshiki/native";
import { EntryLine, entryDisplayNumber } from "~/components/entries"; import { EntryLine, entryDisplayNumber } from "~/components/entries";
@ -97,25 +98,12 @@ NextUp.Loader = () => {
); );
}; };
const SerieHeader = ({ children, ...props }: any) => { const SerieHeader = () => {
const { css, theme } = useYoshiki(); const { css, theme } = useYoshiki();
const [slug] = useQueryState("slug", undefined!); const [slug] = useQueryState("slug", undefined!);
return ( return (
<View <View {...css({ bg: (theme) => theme.background })}>
{...css(
[
{ bg: (theme) => theme.background },
Platform.OS === "web" && {
flexGrow: 1,
flexShrink: 1,
// @ts-ignore Web only property
overflowY: "auto" as any,
},
],
props,
)}
>
<Header kind="serie" slug={slug} /> <Header kind="serie" slug={slug} />
<Fetch <Fetch
// Use the same fetch query as header // Use the same fetch query as header
@ -133,9 +121,6 @@ const SerieHeader = ({ children, ...props }: any) => {
fill={theme.variant.background} fill={theme.variant.background}
{...css({ flexShrink: 0, flexGrow: 1, display: "flex" })} {...css({ flexShrink: 0, flexGrow: 1, display: "flex" })}
/> />
<View {...css({ bg: theme.variant.background })}>
<Container>{children}</Container>
</View>
</View> </View>
); );
}; };
@ -144,10 +129,16 @@ export const SerieDetails = () => {
const { css, theme } = useYoshiki(); const { css, theme } = useYoshiki();
const [slug] = useQueryState("slug", undefined!); const [slug] = useQueryState("slug", undefined!);
const [season] = useQueryState("season", undefined!); const [season] = useQueryState("season", undefined!);
const insets = useSafeAreaInsets();
return ( return (
<View {...css({ bg: theme.variant.background, flex: 1 })}> <View {...css({ bg: theme.variant.background, flex: 1 })}>
<EntryList slug={slug} season={season} Header={SerieHeader} /> <EntryList
slug={slug}
season={season}
Header={SerieHeader}
contentContainerStyle={{ paddingBottom: insets.bottom }}
/>
</View> </View>
); );
}; };