diff --git a/src/components/Episode/Episode.Blocks.tsx b/src/components/Episode/Episode.Blocks.tsx index 81ba2ec..8aee44f 100644 --- a/src/components/Episode/Episode.Blocks.tsx +++ b/src/components/Episode/Episode.Blocks.tsx @@ -1,20 +1,36 @@ +import { useState } from 'react' import { LPE } from '../../types/lpe.types' import { RenderEpisodeBlock } from './Episode.Block' +import styled from '@emotion/styled' +import { Button } from '@acid-info/lsd-react' type Props = { data: LPE.Podcast.Document } const EpisodeBlocks = ({ data }: Props) => { + const [showMore, setShowMore] = useState(false) const blocks = data?.transcription - return blocks?.length ? ( + return blocks?.length && showMore ? ( <> {blocks.map((block, idx) => ( ))} + setShowMore(false)}>Show Less + + ) : blocks?.length && !showMore ? ( + <> + {blocks.slice(0, 3).map((block, idx) => ( + + ))} + setShowMore(true)}>Show More ) : null } +const ShowButton = styled(Button)` + margin-top: 24px; +` + export default EpisodeBlocks diff --git a/src/components/Episode/Episode.Body.tsx b/src/components/Episode/Episode.Body.tsx index 51b8911..7312840 100644 --- a/src/components/Episode/Episode.Body.tsx +++ b/src/components/Episode/Episode.Body.tsx @@ -9,9 +9,13 @@ interface Props { } export default function EpisodeBody({ data }: Props) { + const youtube = data?.channels.find( + (channel) => channel?.name === LPE.Podcast.ChannelNames.Youtube, + ) + return ( - + diff --git a/src/components/Episode/Episode.Divider.tsx b/src/components/Episode/Episode.Divider.tsx new file mode 100644 index 0000000..29e8126 --- /dev/null +++ b/src/components/Episode/Episode.Divider.tsx @@ -0,0 +1,20 @@ +import styled from '@emotion/styled' + +type Props = { + top?: number + bottom?: number +} + +const EpisodeDivider = ({ top = 32, bottom = 32 }: Props) => { + return +} + +const Divder = styled.hr<{ top: number; bottom: number }>` + margin-top: ${({ top }) => top}px; + margin-bottom: ${({ bottom }) => bottom}px; + height: 1px; + width: 100%; + color: rgb(var(--lsd-border-primary)); +` + +export default EpisodeDivider diff --git a/src/components/Episode/Episode.Transcript.tsx b/src/components/Episode/Episode.Transcript.tsx index 6f6f5f8..c4e4e98 100644 --- a/src/components/Episode/Episode.Transcript.tsx +++ b/src/components/Episode/Episode.Transcript.tsx @@ -1,11 +1,14 @@ +import styled from '@emotion/styled' import { LPE } from '../../types/lpe.types' import EpisodeBlocks from './Episode.Blocks' import { Typography } from '@acid-info/lsd-react' +import EpisodeDivider from './Episode.Divider' const EpisodeTranscript = ({ data }: { data: LPE.Podcast.Document }) => { return ( <> - + + Transcript diff --git a/src/components/Episode/Footer/Episode.Footer.tsx b/src/components/Episode/Footer/Episode.Footer.tsx index c6c978a..dd03c0f 100644 --- a/src/components/Episode/Footer/Episode.Footer.tsx +++ b/src/components/Episode/Footer/Episode.Footer.tsx @@ -1,17 +1,50 @@ import styled from '@emotion/styled' import { LPE } from '../../../types/lpe.types' import EpisodeCredits from './Episode.Credits' +import EpisodeMoreEpisodes from './Episode.MoreEpisodes' + +const TEMP_MORE_EPISODES = [ + { + id: 1, + thumbnail: + 'https://images.cdn.unbody.io/00f8908f-9dff-456e-9640-13defd9ae433/image/a04e5542-d027-44d5-b914-bd4cadf17d25_image1.png', + publishedAt: '2023-07-11T20:30:00.000Z', + title: 'Title 1', + }, + { + id: 2, + thumbnail: + 'https://images.cdn.unbody.io/00f8908f-9dff-456e-9640-13defd9ae433/image/a04e5542-d027-44d5-b914-bd4cadf17d25_image1.png', + publishedAt: '2023-07-12T20:30:00.000Z', + title: 'Title 2', + }, + { + id: 3, + thumbnail: + 'https://images.cdn.unbody.io/00f8908f-9dff-456e-9640-13defd9ae433/image/a04e5542-d027-44d5-b914-bd4cadf17d25_image1.png', + publishedAt: '2023-07-13T20:30:00.000Z', + title: 'Title 3', + }, + { + id: 4, + thumbnail: + 'https://images.cdn.unbody.io/00f8908f-9dff-456e-9640-13defd9ae433/image/a04e5542-d027-44d5-b914-bd4cadf17d25_image1.png', + publishedAt: '2023-07-14T20:30:00.000Z', + title: 'Title 4', + }, +] const EpisodeFooter = ({ data }: { data: LPE.Podcast.Document }) => { return ( + ) } const EpisodeFooterContainer = styled.div` - margin-top: 16px; + margin-top: 56px; & > div:not(:first-child) > div > button, & > div:not(:first-child) > div { diff --git a/src/components/Episode/Footer/Episode.MoreEpisodes.tsx b/src/components/Episode/Footer/Episode.MoreEpisodes.tsx index b80ed07..f5c1c52 100644 --- a/src/components/Episode/Footer/Episode.MoreEpisodes.tsx +++ b/src/components/Episode/Footer/Episode.MoreEpisodes.tsx @@ -1,5 +1,39 @@ -const EpisodeMoreEpisode = () => { - return null +import { Typography } from '@acid-info/lsd-react' +import styled from '@emotion/styled' +import MoreEpisodesCard from './Episode.MoreEpisodesCard' + +const EpisodeMoreEpisodes = ({ episodes }: any) => { + return ( + + More Episodes + + {episodes && + episodes.map((episode: any, idx: number) => ( + + ))} + + + ) } -export default EpisodeMoreEpisode +const Container = styled.div` + margin-top: 72px; + border-top: 1px solid rgb(var(--lsd-border-primary)); + padding-block: 16px; + display: flex; + flex-direction: column; +` + +const EpisodeCards = styled.div` + display: flex; + flex-direction: row; + gap: 16px; + flex-wrap: wrap; +` + +export default EpisodeMoreEpisodes diff --git a/src/components/Episode/Footer/Episode.MoreEpisodesCard.tsx b/src/components/Episode/Footer/Episode.MoreEpisodesCard.tsx new file mode 100644 index 0000000..d162cbb --- /dev/null +++ b/src/components/Episode/Footer/Episode.MoreEpisodesCard.tsx @@ -0,0 +1,60 @@ +import { Typography } from '@acid-info/lsd-react' +import styled from '@emotion/styled' +import Image from 'next/image' + +type Props = { + thumbnail: string + title: string + publishedAt: string +} + +const MoreEpisodesCard = ({ thumbnail, title, publishedAt }: Props) => { + const date = new Date(publishedAt) + return ( + + + {thumbnail} + + + + + PODCAST + + + + {date && + date.toLocaleString('en-GB', { + day: 'numeric', + month: 'long', // TODO: Should be uppercase + year: 'numeric', + })} + + + + {title} + + ) +} + +const Container = styled.div` + margin-block: 24px; + display: flex; + flex-direction: column; + gap: 16px; + width: 48%; +` + +const ImageContainer = styled.div` + width: 100%; + height: 190px; + position: relative; +` + +const Row = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; +` + +export default MoreEpisodesCard diff --git a/src/components/Episode/Header/Episode.Header.tsx b/src/components/Episode/Header/Episode.Header.tsx index 63a0346..fe90ce9 100644 --- a/src/components/Episode/Header/Episode.Header.tsx +++ b/src/components/Episode/Header/Episode.Header.tsx @@ -1,9 +1,10 @@ -import { Authors } from '@/components/Authors' import { Tags } from '@/components/Tags' import { Typography } from '@acid-info/lsd-react' import styled from '@emotion/styled' import { LPE } from '../../../types/lpe.types' import ReactPlayer from 'react-player' +import { default as Stats } from '@/components/Article/Article.Stats' +import { LogosCircleIcon } from '@/components/Icons/LogosCircleIcon' export type EpisodeHeaderProps = LPE.Podcast.Document & { url: string } @@ -11,28 +12,26 @@ const EpisodeHeader = ({ title, description, publishedAt, - authors, tags, url, }: EpisodeHeaderProps) => { - const date = publishedAt ? new Date(publishedAt) : null + const date = new Date(publishedAt) return ( - - - {date && - date.toLocaleString('en-GB', { - day: 'numeric', - month: 'long', // TODO: Should be uppercase - year: 'numeric', - })} - + + + + {title} + + + Network State Podcast + {description && ( @@ -40,39 +39,13 @@ const EpisodeHeader = ({ )} {tags && } - - - ) } const EpisodeHeaderContainer = styled.header` - .mobileSummary { - display: none; - } - - .desktopSummary { - display: block; - } - - @media (max-width: 768px) { - .mobileSummary { - display: block; - p { - font-size: var(--lsd-body3-fontSize); - line-height: var(--lsd-body3-lineHeight); - margin-bottom: 24px; - } - hr { - display: none; - } - } - - .desktopSummary { - display: none; - } - } + display: flex; + flex-direction: column; ` const CustomTypography = styled(Typography)` @@ -96,19 +69,15 @@ const EpisodeSubtitle = styled(CustomTypography)` } ` -const AuthorsContainer = styled.div` - //margin-block: 24px; - margin-top: 24px; +const PodcastName = styled.div` + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 20px; +` + +const PlayerContainer = styled.div` margin-bottom: 32px; - - @media (max-width: 768px) { - margin-top: 16px; - margin-bottom: 24px; - - a[href^='mailto:'] { - display: none; - } - } ` export default EpisodeHeader diff --git a/src/containers/EpisodeContainer.tsx b/src/containers/EpisodeContainer.tsx index 800e1d1..48dfb72 100644 --- a/src/containers/EpisodeContainer.tsx +++ b/src/containers/EpisodeContainer.tsx @@ -12,10 +12,11 @@ const EpisodeContainer = (props: Props) => { return ( - + + ) }