diff --git a/src/components/PreviewCard.tsx b/src/components/PreviewCard.tsx index b0603e3..b890785 100644 --- a/src/components/PreviewCard.tsx +++ b/src/components/PreviewCard.tsx @@ -28,6 +28,7 @@ interface Props { topChips?: string[]; bottomChips?: string[]; keepInfoVisible?: boolean; + stackEffect?: boolean; metadata?: { currencies?: AppStaticProps["currencies"]; release_date?: DatePickerFragment | null; @@ -52,6 +53,7 @@ export default function PreviewCard(props: Immutable): JSX.Element { title, subtitle, description, + stackEffect = false, topChips, bottomChips, keepInfoVisible, @@ -112,8 +114,26 @@ export default function PreviewCard(props: Immutable): JSX.Element { className="drop-shadow-shade-xl cursor-pointer grid items-end fine:[--cover-opacity:0] hover:[--cover-opacity:1] hover:scale-[1.02] [--bg-opacity:0] hover:[--bg-opacity:0.5] [--play-opacity:0] - hover:[--play-opacity:100] transition-transform" + hover:[--play-opacity:100] transition-transform + [--stacked-top:0] hover:[--stacked-top:1]" > + {thumbnail && stackEffect && ( + <> + + + + )} + {thumbnail ? (
): JSX.Element {
)}
- {pre_title &&

{pre_title}

} + {pre_title && ( +

{pre_title}

+ )} {title && ( -

{title}

+

+ {title} +

)} {subtitle &&

{subtitle}

}
diff --git a/src/graphql/operations/getContents.graphql b/src/graphql/operations/getContents.graphql index 3801b8c..4815202 100644 --- a/src/graphql/operations/getContents.graphql +++ b/src/graphql/operations/getContents.graphql @@ -4,7 +4,7 @@ query getContents($language_code: String) { id attributes { slug - titles(filters: { language: { code: { eq: $language_code } } }) { + titles { pre_title title subtitle @@ -55,6 +55,16 @@ query getContents($language_code: String) { } } } + next_recommended { + data { + id + } + } + previous_recommended { + data { + id + } + } text_set { id } diff --git a/src/pages/contents/index.tsx b/src/pages/contents/index.tsx index 7693689..ce1cb13 100644 --- a/src/pages/contents/index.tsx +++ b/src/pages/contents/index.tsx @@ -28,13 +28,23 @@ export default function Contents(props: Immutable): JSX.Element { const [groupingMethod, setGroupingMethod] = useState(-1); const [keepInfoVisible, setKeepInfoVisible] = useState(false); + const [combineRelatedContent, setCombineRelatedContent] = useState(true); + + const [filteredItems, setFilteredItems] = useState( + filterContents(combineRelatedContent, contents) + ); + const [groups, setGroups] = useState( - getGroups(langui, groupingMethod, contents) + getGroups(langui, groupingMethod, filteredItems) ); useEffect(() => { - setGroups(getGroups(langui, groupingMethod, contents)); - }, [langui, groupingMethod, contents]); + setFilteredItems(filterContents(combineRelatedContent, contents)); + }, [combineRelatedContent, contents]); + + useEffect(() => { + setGroups(getGroups(langui, groupingMethod, filteredItems)); + }, [langui, groupingMethod, filteredItems]); const subPanel = ( @@ -55,6 +65,14 @@ export default function Contents(props: Immutable): JSX.Element { /> +
+

{"Combine related contents"}:

+ +
+

{"Always show info"}:

@@ -100,6 +118,11 @@ export default function Contents(props: Immutable): JSX.Element { subtitle={item.attributes.titles?.[0]?.subtitle} thumbnail={item.attributes.thumbnail?.data?.attributes} thumbnailAspectRatio="3/2" + stackEffect={ + item.attributes.next_recommended?.data?.id !== null && + item.attributes.next_recommended?.data?.id !== undefined && + combineRelatedContent + } topChips={ item.attributes.type?.data?.attributes ? [ @@ -231,3 +254,15 @@ function getGroups( } } } + +function filterContents( + combineRelatedContent: boolean, + contents: Immutable +): Immutable { + if (combineRelatedContent) { + return [...contents].filter( + (content) => !content.attributes?.previous_recommended?.data?.id + ); + } + return contents; +}