From e0634abc9825edc5bf2a8a5851c110f807050e7c Mon Sep 17 00:00:00 2001 From: Gabe Kangas Date: Mon, 11 Jul 2022 18:29:58 -0700 Subject: [PATCH] Add Followers list and single follower component. Closes #1861 --- web/components/Follower.tsx | 19 ---------- web/components/FollowersCollection.tsx | 24 ------------ web/components/ui/Content/Content.tsx | 2 +- web/components/ui/Followers/Follower.tsx | 30 +++++++++++++++ .../ui/Followers/Followers.module.scss | 37 ++++++++++++++++++ .../ui/Followers/FollowersCollection.tsx | 38 +++++++++++++++++++ web/stories/Follower.stories.tsx | 2 +- web/stories/Followercollection.stories.tsx | 5 ++- 8 files changed, 111 insertions(+), 46 deletions(-) delete mode 100644 web/components/Follower.tsx delete mode 100644 web/components/FollowersCollection.tsx create mode 100644 web/components/ui/Followers/Follower.tsx create mode 100644 web/components/ui/Followers/Followers.module.scss create mode 100644 web/components/ui/Followers/FollowersCollection.tsx diff --git a/web/components/Follower.tsx b/web/components/Follower.tsx deleted file mode 100644 index ff9ec1b38..000000000 --- a/web/components/Follower.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Avatar, Comment } from 'antd'; -import React from 'react'; -import { Follower } from '../interfaces/follower'; - -interface Props { - follower: Follower; -} - -export default function SingleFollower(props: Props) { - const { follower } = props; - - return ( - } - content={follower.name} - /> - ); -} diff --git a/web/components/FollowersCollection.tsx b/web/components/FollowersCollection.tsx deleted file mode 100644 index f0751b5e8..000000000 --- a/web/components/FollowersCollection.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { Pagination } from 'antd'; -import { Follower } from '../interfaces/follower'; -import SingleFollower from './Follower'; - -interface Props { - total: number; - followers: Follower[]; -} - -export default function FollowerCollection(props: Props) { - const ITEMS_PER_PAGE = 24; - - const { followers, total } = props; - const pages = Math.ceil(total / ITEMS_PER_PAGE); - - return ( -
- {followers.map(follower => ( - - ))} - -
- ); -} diff --git a/web/components/ui/Content/Content.tsx b/web/components/ui/Content/Content.tsx index f55fc71e0..1f6dd359d 100644 --- a/web/components/ui/Content/Content.tsx +++ b/web/components/ui/Content/Content.tsx @@ -18,7 +18,7 @@ import { import { ClientConfig } from '../../../interfaces/client-config.model'; import CustomPageContent from '../CustomPageContent/CustomPageContent'; import OwncastPlayer from '../../video/OwncastPlayer'; -import FollowerCollection from '../../FollowersCollection'; +import FollowerCollection from '../Followers/FollowersCollection'; import s from './Content.module.scss'; import Sidebar from '../Sidebar'; import Footer from '../Footer'; diff --git a/web/components/ui/Followers/Follower.tsx b/web/components/ui/Followers/Follower.tsx new file mode 100644 index 000000000..362593975 --- /dev/null +++ b/web/components/ui/Followers/Follower.tsx @@ -0,0 +1,30 @@ +import { Avatar, Col, Row } from 'antd'; +import React from 'react'; +import { Follower } from '../../../interfaces/follower'; +import s from './Followers.module.scss'; + +interface Props { + follower: Follower; +} + +export default function SingleFollower(props: Props) { + const { follower } = props; + + return ( +
+ + + + + Logo + + + + {follower.name} + {follower.username} + + + +
+ ); +} diff --git a/web/components/ui/Followers/Followers.module.scss b/web/components/ui/Followers/Followers.module.scss new file mode 100644 index 000000000..08e6f32ac --- /dev/null +++ b/web/components/ui/Followers/Followers.module.scss @@ -0,0 +1,37 @@ +.follower { + border-color: rgba(0, 0, 0, 0.3); + border-width: 1px; + border-style: solid; + padding: 10px 10px; + border-radius: 15px; + height: 75px; + width: 250px; + font-size: 0.8rem; + overflow: hidden; + + &:hover { + border-color: var(--theme-text-link); + } + + .avatar { + height: 50px; + width: 50px; + border-color: rgba(0, 0, 0, 0.3); + border-width: 1px; + border-style: solid; + } + + .account { + color: var(--theme-text-secondary); + text-overflow: ellipsis; + } + + .placeholder { + width: 100%; + height: 100%; + } +} + +.followers { + width: 100%; +} diff --git a/web/components/ui/Followers/FollowersCollection.tsx b/web/components/ui/Followers/FollowersCollection.tsx new file mode 100644 index 000000000..6882caacd --- /dev/null +++ b/web/components/ui/Followers/FollowersCollection.tsx @@ -0,0 +1,38 @@ +import { Col, Pagination, Row } from 'antd'; +import { Follower } from '../../../interfaces/follower'; +import SingleFollower from './Follower'; +import s from './Followers.module.scss'; + +interface Props { + total: number; + followers: Follower[]; +} + +export default function FollowerCollection(props: Props) { + const ITEMS_PER_PAGE = 24; + + const { followers, total } = props; + const pages = Math.ceil(total / ITEMS_PER_PAGE); + + const noFollowers = ( +
A message explaining how to follow goes here since there are no followers.
+ ); + + if (followers.length === 0) { + return noFollowers; + } + + return ( +
+ + {followers.map(follower => ( + + + + ))} + + + +
+ ); +} diff --git a/web/stories/Follower.stories.tsx b/web/stories/Follower.stories.tsx index 92466b401..236b2129d 100644 --- a/web/stories/Follower.stories.tsx +++ b/web/stories/Follower.stories.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ComponentStory, ComponentMeta } from '@storybook/react'; -import SingleFollower from '../components/Follower'; +import SingleFollower from '../components/ui/Followers/Follower'; import SingleFollowerMock from './assets/mocks/single-follower.png'; export default { diff --git a/web/stories/Followercollection.stories.tsx b/web/stories/Followercollection.stories.tsx index dcbe48298..c07184f84 100644 --- a/web/stories/Followercollection.stories.tsx +++ b/web/stories/Followercollection.stories.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { ComponentStory, ComponentMeta } from '@storybook/react'; -import FollowerCollection from '../components/FollowersCollection'; +import FollowerCollection from '../components/ui/Followers/FollowersCollection'; export default { title: 'owncast/Components/Followers/Followers collection', @@ -12,6 +12,9 @@ const Template: ComponentStory = args => ( ); +export const NoFollowers = Template.bind({}); +NoFollowers.args = { followers: [] }; + export const Example = Template.bind({}); Example.args = { followers: [