From f92fbb940f7bf720ffc2dba9b07be9a7c7fe18f0 Mon Sep 17 00:00:00 2001
From: Zaki <zakiamanullah215@gmail.com>
Date: Sun, 5 Nov 2023 17:56:18 +0700
Subject: [PATCH] page: podcaster list

---
 src/App.tsx                      |   4 +
 src/components/PodcasterCard.tsx |  80 +++++++++++++++
 src/pages/PodcasterList.tsx      | 161 +++++++++++++++++++++++++++++++
 3 files changed, 245 insertions(+)
 create mode 100644 src/components/PodcasterCard.tsx
 create mode 100644 src/pages/PodcasterList.tsx

diff --git a/src/App.tsx b/src/App.tsx
index 0c39321..7250b11 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -5,6 +5,7 @@ import Navbar from "./components/Navbar";
 import { ChakraProvider, CSSReset } from "@chakra-ui/react";
 import Podcaster from "./pages/Podcaster";
 import ProducedPodcast from './pages/ProducedPodcast';
+import PodcasterList from './pages/PodcasterList';
 
 import theme from './theme';
 
@@ -24,6 +25,9 @@ function App() {
                 <Route exact path="/edit-podcast">
                   <ProducedPodcast />
                 </Route>
+                <Route exact path="/podcaster">
+                  <PodcasterList />
+                </Route>
                 <Route exact path="/mycomments"></Route>
                 <Route exact path="/profile"></Route>
                 <Route exact path="/logout"></Route>
diff --git a/src/components/PodcasterCard.tsx b/src/components/PodcasterCard.tsx
new file mode 100644
index 0000000..beff298
--- /dev/null
+++ b/src/components/PodcasterCard.tsx
@@ -0,0 +1,80 @@
+import {
+    Text,
+    Image,
+    Card,
+    CardBody,
+    Heading,
+    Stack
+} from "@chakra-ui/react";
+
+interface PodcasterCardProp {
+    title: string;
+    image: string;
+    description: string;
+}
+
+const PodcasterCard: React.FC<PodcasterCardProp> = ({ title, image, description }) => {
+    return (
+        <Card
+            maxW={"sm"}
+            borderRadius={"md"}
+            color={"white"}
+            my={3}
+            mx={4}
+            bg={"#181818"}
+            _hover={{
+                bg: "#2a2a2a",
+                cursor: "pointer",
+            }}
+        >
+            <CardBody
+                p={4}
+                maxW={"md"}
+                display={"flex"}
+                flexDirection={"column"}
+                alignItems={"start"}
+                justifyContent={"flex-start"}
+            >
+                <Image
+                    src={image}
+                    alt="thumbnail"
+                    width={"140x"}
+                    height={"140px"}
+                    borderRadius={"md"}
+                    mb={4}
+                />
+                <Stack 
+                    spacing='2'
+                    maxW={"140px"}
+                    textAlign={"start"}
+                >
+                    <Heading 
+                        fontSize='18px'
+                        style={{
+                            display: "-webkit-box",
+                            WebkitLineClamp: 1,
+                            WebkitBoxOrient: "vertical",
+                            overflow: "hidden",
+                            textOverflow: "ellipsis",
+                        }}
+                    >{title}</Heading>
+                    <Text
+                        fontSize='14px'
+                        style={{
+                            display: "-webkit-box",
+                            WebkitLineClamp: 2,
+                            WebkitBoxOrient: "vertical",
+                            overflow: "hidden",
+                            textOverflow: "ellipsis",
+                        }}
+                        color={"#b0b0b0"}
+                    >
+                        {description}
+                    </Text>
+                </Stack>
+            </CardBody>
+        </Card>
+    );
+}
+
+export default PodcasterCard;
\ No newline at end of file
diff --git a/src/pages/PodcasterList.tsx b/src/pages/PodcasterList.tsx
new file mode 100644
index 0000000..d429510
--- /dev/null
+++ b/src/pages/PodcasterList.tsx
@@ -0,0 +1,161 @@
+import { Flex } from "@chakra-ui/react";
+import PodcasterCard from "../components/PodcasterCard";
+import React from "react";
+
+const dummyPodcasters = [
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Bad Friends",
+        image: "https://megaphone.imgix.net/podcasts/7ff4ef6e-e6b7-11ec-a598-dbd652a3d5be/image/709d771dd0b04ce8.jpeg?ixlib=rails-4.3.1&max-w=3000&max-h=3000&fit=crop&auto=format,compress",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "The Joe Rogan Experience",
+        image: "./src/assets/JREiTunesImage2.jpg",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    },
+    {
+        title: "Tiny Meat Gang",
+        image: "https://i.scdn.co/image/ab6765630000ba8af9875003f82148c55d4e3239",
+        description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec euismod, nisl vitae aliquam ultricies, nunc nisl ultricies nunc, vitae aliquam nisl nisl vitae.",
+    }
+]
+
+const PodcasterList = () => {
+    return (
+        <Flex
+            flexDirection={"column"}
+            alignItems={"center"}
+            justifyContent={"center"}
+        >
+            <Flex
+                px={"10"}
+                py={"20px"}
+                background={"black"}
+                minH={"100vh"}
+                flexDirection={"row"}
+                flexFlow={"row wrap"}
+                justifyContent={"flex-start"}
+                maxW={""}
+            >
+                {
+                    dummyPodcasters.map((podcaster) => (
+                        <React.Fragment key={podcaster.title}>
+                            <PodcasterCard
+                                title={podcaster.title}
+                                image={podcaster.image}
+                                description={podcaster.description}
+                            />
+                        </React.Fragment>
+                    ))
+                }
+            </Flex>
+        </Flex>
+    );
+};
+
+export default PodcasterList;
\ No newline at end of file
-- 
GitLab