Pages now use the new ThumbnailPreview component
This commit is contained in:
parent
351c526dbe
commit
81ac3fb23a
|
@ -21,9 +21,8 @@ export default function RecorderChip(props: Props): JSX.Element {
|
|||
{recorder.avatar?.data?.attributes && (
|
||||
<Img
|
||||
className="w-20 rounded-full border-4 border-mid"
|
||||
image={recorder.avatar?.data.attributes}
|
||||
image={recorder.avatar.data.attributes}
|
||||
quality={ImageQuality.Small}
|
||||
rawImg
|
||||
/>
|
||||
)}
|
||||
<div className="grid gap-2">
|
||||
|
|
|
@ -7,7 +7,8 @@ import ContentPanel, {
|
|||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import SubPanel from "components/Panels/SubPanel";
|
||||
import VideoPreview from "components/Videos/VideoPreview";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { GetVideoChannelQuery } from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import {
|
||||
|
@ -16,6 +17,8 @@ import {
|
|||
GetStaticPropsContext,
|
||||
} from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
import { getVideoThumbnailURL } from "queries/helpers";
|
||||
import { useState } from "react";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
channel: Exclude<
|
||||
|
@ -26,6 +29,8 @@ interface Props extends AppStaticProps {
|
|||
|
||||
export default function Channel(props: Props): JSX.Element {
|
||||
const { langui, channel } = props;
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(true);
|
||||
|
||||
const subPanel = (
|
||||
<SubPanel>
|
||||
<ReturnButton
|
||||
|
@ -41,6 +46,11 @@ export default function Channel(props: Props): JSX.Element {
|
|||
title="Videos"
|
||||
description={langui.archives_description}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
</SubPanel>
|
||||
);
|
||||
|
||||
|
@ -52,7 +62,28 @@ export default function Channel(props: Props): JSX.Element {
|
|||
</div>
|
||||
<div className="grid gap-8 items-start mobile:grid-cols-2 desktop:grid-cols-[repeat(auto-fill,_minmax(15rem,1fr))] pb-12 border-b-[3px] border-dotted last-of-type:border-0">
|
||||
{channel?.videos?.data.map((video) => (
|
||||
<>{video.attributes && <VideoPreview video={video.attributes} />}</>
|
||||
<>
|
||||
{video.attributes && (
|
||||
<ThumbnailPreview
|
||||
key={video.id}
|
||||
href={`/archives/videos/v/${video.attributes.uid}`}
|
||||
title={video.attributes.title}
|
||||
thumbnail={getVideoThumbnailURL(video.attributes.uid)}
|
||||
thumbnailAspectRatio="16/9"
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
metadata={{
|
||||
release_date: video.attributes.published_date,
|
||||
views: video.attributes.views,
|
||||
author: channel.title,
|
||||
position: "Top",
|
||||
}}
|
||||
hoverlay={{
|
||||
__typename: "Video",
|
||||
duration: video.attributes.duration,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))}
|
||||
</div>
|
||||
</ContentPanel>
|
||||
|
|
|
@ -8,12 +8,13 @@ import ContentPanel, {
|
|||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import SubPanel from "components/Panels/SubPanel";
|
||||
import VideoPreview from "components/Videos/VideoPreview";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { GetVideosPreviewQuery } from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
import { prettyDate } from "queries/helpers";
|
||||
import { getVideoThumbnailURL, prettyDate } from "queries/helpers";
|
||||
import { useState } from "react";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
|
@ -44,6 +45,7 @@ export default function Videos(props: Props): JSX.Element {
|
|||
}
|
||||
|
||||
const [page, setPage] = useState(0);
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(true);
|
||||
|
||||
const subPanel = (
|
||||
<SubPanel>
|
||||
|
@ -60,6 +62,11 @@ export default function Videos(props: Props): JSX.Element {
|
|||
title="Videos"
|
||||
description={langui.archives_description}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
</SubPanel>
|
||||
);
|
||||
|
||||
|
@ -76,7 +83,24 @@ export default function Videos(props: Props): JSX.Element {
|
|||
{paginatedVideos[page].map((video) => (
|
||||
<>
|
||||
{video.attributes && (
|
||||
<VideoPreview key={video.id} video={video.attributes} />
|
||||
<ThumbnailPreview
|
||||
key={video.id}
|
||||
href={`/archives/videos/v/${video.attributes.uid}`}
|
||||
title={video.attributes.title}
|
||||
thumbnail={getVideoThumbnailURL(video.attributes.uid)}
|
||||
thumbnailAspectRatio="16/9"
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
metadata={{
|
||||
release_date: video.attributes.published_date,
|
||||
views: video.attributes.views,
|
||||
author: video.attributes.channel?.data?.attributes?.title,
|
||||
position: "Top",
|
||||
}}
|
||||
hoverlay={{
|
||||
__typename: "Video",
|
||||
duration: video.attributes.duration,
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import AppLayout from "components/AppLayout";
|
||||
import Button from "components/Button";
|
||||
import Chip from "components/Chip";
|
||||
import ThumbnailHeader from "components/Content/ThumbnailHeader";
|
||||
import ThumbnailHeader from "components/ThumbnailHeader";
|
||||
import HorizontalLine from "components/HorizontalLine";
|
||||
import LanguageSwitcher from "components/LanguageSwitcher";
|
||||
import Markdawn from "components/Markdown/Markdawn";
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
import AppLayout from "components/AppLayout";
|
||||
import Chip from "components/Chip";
|
||||
import LibraryContentPreview from "components/Library/LibraryContentPreview";
|
||||
import PanelHeader from "components/PanelComponents/PanelHeader";
|
||||
import ContentPanel, {
|
||||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import SubPanel from "components/Panels/SubPanel";
|
||||
import Select from "components/Select";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { GetContentsQuery } from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
|
@ -24,6 +25,7 @@ export default function Contents(props: Props): JSX.Element {
|
|||
const { langui, contents } = props;
|
||||
|
||||
const [groupingMethod, setGroupingMethod] = useState<number>(-1);
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(false);
|
||||
|
||||
const [groups, setGroups] = useState<GroupContentItems>(
|
||||
getGroups(langui, groupingMethod, contents)
|
||||
|
@ -51,6 +53,11 @@ export default function Contents(props: Props): JSX.Element {
|
|||
allowEmpty
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
</SubPanel>
|
||||
);
|
||||
const contentPanel = (
|
||||
|
@ -79,9 +86,33 @@ export default function Contents(props: Props): JSX.Element {
|
|||
{items.map((item) => (
|
||||
<>
|
||||
{item.attributes && (
|
||||
<LibraryContentPreview
|
||||
<ThumbnailPreview
|
||||
key={item.id}
|
||||
item={item.attributes}
|
||||
href={`/contents/${item.attributes.slug}`}
|
||||
pre_title={item.attributes.titles?.[0]?.pre_title}
|
||||
title={
|
||||
item.attributes.titles?.[0]?.title ??
|
||||
prettySlug(item.attributes.slug)
|
||||
}
|
||||
subtitle={item.attributes.titles?.[0]?.subtitle}
|
||||
thumbnail={item.attributes.thumbnail?.data?.attributes}
|
||||
thumbnailAspectRatio="3/2"
|
||||
topChips={
|
||||
item.attributes.type?.data?.attributes
|
||||
? [
|
||||
item.attributes.type.data.attributes.titles?.[0]
|
||||
? item.attributes.type.data.attributes
|
||||
.titles[0]?.title
|
||||
: prettySlug(
|
||||
item.attributes.type.data.attributes.slug
|
||||
),
|
||||
]
|
||||
: undefined
|
||||
}
|
||||
bottomChips={item.attributes.categories?.data.map(
|
||||
(category) => category.attributes?.short ?? ""
|
||||
)}
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
|
|
|
@ -3,8 +3,7 @@ import Button from "components/Button";
|
|||
import Chip from "components/Chip";
|
||||
import Img, { getAssetURL, ImageQuality } from "components/Img";
|
||||
import InsetBox from "components/InsetBox";
|
||||
import ContentTOCLine from "components/Library/ContentTOCLine";
|
||||
import LibraryItemsPreview from "components/Library/LibraryItemsPreview";
|
||||
import ContentLine from "components/Library/ContentLine";
|
||||
import LightBox from "components/LightBox";
|
||||
import NavOption from "components/PanelComponents/NavOption";
|
||||
import ReturnButton, {
|
||||
|
@ -14,6 +13,8 @@ import ContentPanel, {
|
|||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import SubPanel from "components/Panels/SubPanel";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { useAppLayout } from "contexts/AppLayoutContext";
|
||||
import {
|
||||
Enum_Componentmetadatabooks_Binding_Type,
|
||||
|
@ -68,6 +69,8 @@ export default function LibrarySlug(props: Props): JSX.Element {
|
|||
const [lightboxImages, setLightboxImages] = useState([""]);
|
||||
const [lightboxIndex, setLightboxIndex] = useState(0);
|
||||
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(false);
|
||||
|
||||
let displayOpenScans = false;
|
||||
if (item?.contents?.data)
|
||||
for (const content of item.contents.data) {
|
||||
|
@ -424,13 +427,42 @@ export default function LibrarySlug(props: Props): JSX.Element {
|
|||
<h2 className="text-2xl">
|
||||
{isVariantSet ? langui.variants : langui.subitems}
|
||||
</h2>
|
||||
|
||||
<div className="-mt-6 mb-8 flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
<div className="grid gap-8 items-end mobile:grid-cols-2 grid-cols-[repeat(auto-fill,minmax(15rem,1fr))] w-full">
|
||||
{item.subitems.data.map((subitem) => (
|
||||
<LibraryItemsPreview
|
||||
key={subitem.id}
|
||||
item={subitem.attributes}
|
||||
currencies={props.currencies}
|
||||
/>
|
||||
<>
|
||||
{subitem.attributes && (
|
||||
<ThumbnailPreview
|
||||
key={subitem.id}
|
||||
href={`/library/${subitem.attributes.slug}`}
|
||||
title={subitem.attributes.title}
|
||||
subtitle={subitem.attributes.subtitle}
|
||||
thumbnail={subitem.attributes.thumbnail?.data?.attributes}
|
||||
thumbnailAspectRatio="21/29.7"
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
topChips={
|
||||
subitem.attributes.metadata &&
|
||||
subitem.attributes.metadata.length > 0 &&
|
||||
subitem.attributes.metadata[0]
|
||||
? [prettyItemSubType(subitem.attributes.metadata[0])]
|
||||
: []
|
||||
}
|
||||
bottomChips={subitem.attributes.categories?.data.map(
|
||||
(category) => category.attributes?.short ?? ""
|
||||
)}
|
||||
metadata={{
|
||||
currencies: currencies,
|
||||
release_date: subitem.attributes.release_date,
|
||||
price: subitem.attributes.price,
|
||||
position: "Bottom",
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -446,7 +478,7 @@ export default function LibrarySlug(props: Props): JSX.Element {
|
|||
)}
|
||||
<div className="grid gap-4 w-full">
|
||||
{item.contents.data.map((content) => (
|
||||
<ContentTOCLine
|
||||
<ContentLine
|
||||
langui={langui}
|
||||
content={content}
|
||||
parentSlug={item.slug}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import AppLayout from "components/AppLayout";
|
||||
import Chip from "components/Chip";
|
||||
import LibraryItemsPreview from "components/Library/LibraryItemsPreview";
|
||||
import PanelHeader from "components/PanelComponents/PanelHeader";
|
||||
import ContentPanel, {
|
||||
ContentPanelWidthSizes,
|
||||
|
@ -8,11 +7,17 @@ import ContentPanel, {
|
|||
import SubPanel from "components/Panels/SubPanel";
|
||||
import Select from "components/Select";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { GetLibraryItemsPreviewQuery } from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
import { convertPrice, prettyDate, prettyinlineTitle } from "queries/helpers";
|
||||
import {
|
||||
convertPrice,
|
||||
prettyDate,
|
||||
prettyinlineTitle,
|
||||
prettyItemSubType,
|
||||
} from "queries/helpers";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
|
@ -32,6 +37,7 @@ export default function Library(props: Props): JSX.Element {
|
|||
const [showSecondaryItems, setShowSecondaryItems] = useState<boolean>(false);
|
||||
const [sortingMethod, setSortingMethod] = useState<number>(0);
|
||||
const [groupingMethod, setGroupingMethod] = useState<number>(-1);
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(false);
|
||||
|
||||
const [filteredItems, setFilteredItems] = useState<Props["items"]>(
|
||||
filterItems(
|
||||
|
@ -120,6 +126,11 @@ export default function Library(props: Props): JSX.Element {
|
|||
<p className="flex-shrink-0">{langui.show_secondary_items}:</p>
|
||||
<Switch state={showSecondaryItems} setState={setShowSecondaryItems} />
|
||||
</div>
|
||||
|
||||
<div className="flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
</SubPanel>
|
||||
);
|
||||
const contentPanel = (
|
||||
|
@ -146,11 +157,35 @@ export default function Library(props: Props): JSX.Element {
|
|||
className="grid gap-8 items-end mobile:grid-cols-2 desktop:grid-cols-[repeat(auto-fill,_minmax(13rem,1fr))] pb-12 border-b-[3px] border-dotted last-of-type:border-0"
|
||||
>
|
||||
{items.map((item) => (
|
||||
<LibraryItemsPreview
|
||||
key={item.id}
|
||||
item={item.attributes}
|
||||
currencies={props.currencies}
|
||||
/>
|
||||
<>
|
||||
{item.attributes && (
|
||||
<ThumbnailPreview
|
||||
key={item.id}
|
||||
href={`/library/${item.attributes.slug}`}
|
||||
title={item.attributes.title}
|
||||
subtitle={item.attributes.subtitle}
|
||||
thumbnail={item.attributes.thumbnail?.data?.attributes}
|
||||
thumbnailAspectRatio="21/29.7"
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
topChips={
|
||||
item.attributes.metadata &&
|
||||
item.attributes.metadata.length > 0 &&
|
||||
item.attributes.metadata[0]
|
||||
? [prettyItemSubType(item.attributes.metadata[0])]
|
||||
: []
|
||||
}
|
||||
bottomChips={item.attributes.categories?.data.map(
|
||||
(category) => category.attributes?.short ?? ""
|
||||
)}
|
||||
metadata={{
|
||||
currencies: currencies,
|
||||
release_date: item.attributes.release_date,
|
||||
price: item.attributes.price,
|
||||
position: "Bottom",
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))}
|
||||
</div>
|
||||
</>
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
import AppLayout from "components/AppLayout";
|
||||
import PostsPreview from "components/News/PostsPreview";
|
||||
import PanelHeader from "components/PanelComponents/PanelHeader";
|
||||
import ContentPanel, {
|
||||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import SubPanel from "components/Panels/SubPanel";
|
||||
import Switch from "components/Switch";
|
||||
import ThumbnailPreview from "components/ThumbnailPreview";
|
||||
import { GetPostsPreviewQuery } from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
import { prettyDate } from "queries/helpers";
|
||||
import { prettyDate, prettySlug } from "queries/helpers";
|
||||
import { useState } from "react";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
posts: Exclude<GetPostsPreviewQuery["posts"], null | undefined>["data"];
|
||||
|
@ -18,6 +20,8 @@ interface Props extends AppStaticProps {
|
|||
export default function News(props: Props): JSX.Element {
|
||||
const { langui, posts } = props;
|
||||
|
||||
const [keepInfoVisible, setKeepInfoVisible] = useState(true);
|
||||
|
||||
posts
|
||||
.sort((a, b) => {
|
||||
const dateA = a.attributes?.date ? prettyDate(a.attributes.date) : "9999";
|
||||
|
@ -33,6 +37,11 @@ export default function News(props: Props): JSX.Element {
|
|||
title={langui.news}
|
||||
description={langui.news_description}
|
||||
/>
|
||||
|
||||
<div className="flex flex-row gap-2 place-items-center coarse:hidden">
|
||||
<p className="flex-shrink-0">{"Always show info"}:</p>
|
||||
<Switch setState={setKeepInfoVisible} state={keepInfoVisible} />
|
||||
</div>
|
||||
</SubPanel>
|
||||
);
|
||||
|
||||
|
@ -40,7 +49,29 @@ export default function News(props: Props): JSX.Element {
|
|||
<ContentPanel width={ContentPanelWidthSizes.large}>
|
||||
<div className="grid gap-8 items-end grid-cols-1 desktop:grid-cols-[repeat(auto-fill,_minmax(20rem,1fr))]">
|
||||
{posts.map((post) => (
|
||||
<PostsPreview key={post.id} post={post.attributes} />
|
||||
<>
|
||||
{post.attributes && (
|
||||
<ThumbnailPreview
|
||||
key={post.id}
|
||||
href={`/news/${post.attributes.slug}`}
|
||||
title={
|
||||
post.attributes.translations?.[0]?.title ??
|
||||
prettySlug(post.attributes.slug)
|
||||
}
|
||||
description={post.attributes.translations?.[0]?.excerpt}
|
||||
thumbnail={post.attributes.thumbnail?.data?.attributes}
|
||||
bottomChips={post.attributes.categories?.data.map(
|
||||
(category) => category.attributes?.short ?? ""
|
||||
)}
|
||||
thumbnailAspectRatio="3/2"
|
||||
keepInfoVisible={keepInfoVisible}
|
||||
metadata={{
|
||||
release_date: post.attributes.date,
|
||||
position: "Top",
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
))}
|
||||
</div>
|
||||
</ContentPanel>
|
||||
|
|
Loading…
Reference in New Issue