mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-31 14:33:50 -04:00
Fix entries list container
This commit is contained in:
parent
5ed43c85de
commit
ff4155de5e
@ -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}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -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}
|
||||||
/>
|
/>
|
||||||
|
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user