From c929c2617257962de058bb2cf060eaae28d7f0ab Mon Sep 17 00:00:00 2001
From: Maria Rushkova <66270386+mrushkova@users.noreply.github.com>
Date: Mon, 18 Oct 2021 16:35:32 +0200
Subject: [PATCH] Refactor components (#81)
---
.../{Channels.tsx => Channels/Channel.tsx} | 85 ++-----
.../src/components/Channels/Channels.tsx | 60 +++++
.../{ => Channels}/EmptyChannel.tsx | 6 +-
packages/react-chat/src/components/Chat.tsx | 4 +-
.../src/components/Chat/ChatBody.tsx | 4 +-
.../react-chat/src/components/Members.tsx | 212 ------------------
.../src/components/Members/Member.tsx | 100 +++++++++
.../src/components/Members/Members.tsx | 38 ++++
.../src/components/Members/MembersList.tsx | 97 ++++++++
.../components/NarrowMode/NarrowChannels.tsx | 2 +-
.../components/NarrowMode/NarrowMembers.tsx | 2 +-
packages/react-chat/src/styles/styles.ts | 1 -
12 files changed, 319 insertions(+), 292 deletions(-)
rename packages/react-chat/src/components/{Channels.tsx => Channels/Channel.tsx} (70%)
create mode 100644 packages/react-chat/src/components/Channels/Channels.tsx
rename packages/react-chat/src/components/{ => Channels}/EmptyChannel.tsx (93%)
delete mode 100644 packages/react-chat/src/components/Members.tsx
create mode 100644 packages/react-chat/src/components/Members/Member.tsx
create mode 100644 packages/react-chat/src/components/Members/Members.tsx
create mode 100644 packages/react-chat/src/components/Members/MembersList.tsx
delete mode 100644 packages/react-chat/src/styles/styles.ts
diff --git a/packages/react-chat/src/components/Channels.tsx b/packages/react-chat/src/components/Channels/Channel.tsx
similarity index 70%
rename from packages/react-chat/src/components/Channels.tsx
rename to packages/react-chat/src/components/Channels/Channel.tsx
index f24d5ea..f063c05 100644
--- a/packages/react-chat/src/components/Channels.tsx
+++ b/packages/react-chat/src/components/Channels/Channel.tsx
@@ -1,55 +1,10 @@
-import React, { useEffect, useMemo } from "react";
+import React, { useMemo } from "react";
import styled from "styled-components";
-import { useNarrow } from "../contexts/narrowProvider";
-import { ChannelData, channels } from "../helpers/channelsMock";
-
-import { MutedIcon } from "./Icons/MutedIcon";
-import { textMediumStyles } from "./Text";
-
-interface ChannelsProps {
- notifications: { [id: string]: number };
- clearNotifications: (id: string) => void;
- onCommunityClick: (val: ChannelData) => void;
- activeChannelId: number;
-}
-
-export function Channels({
- notifications,
- onCommunityClick,
- clearNotifications,
- activeChannelId,
-}: ChannelsProps) {
- useEffect(() => {
- const channel = channels.find((channel) => channel.id === activeChannelId);
- if (channel) {
- if (notifications[channel.name] > 0) {
- clearNotifications(channel.name);
- }
- }
- }, [notifications, activeChannelId]);
-
- return (
-
- {channels.map((channel) => (
- 0 && !channel.isMuted
- ? notifications[channel.name]
- : undefined
- }
- onClick={() => {
- onCommunityClick(channel);
- }}
- />
- ))}
-
- );
-}
+import { useNarrow } from "../../contexts/narrowProvider";
+import { ChannelData } from "../../helpers/channelsMock";
+import { MutedIcon } from "../Icons/MutedIcon";
+import { textMediumStyles } from "../Text";
interface ChannelProps {
channel: ChannelData;
@@ -118,26 +73,6 @@ export function Channel({
);
}
-const ChannelDescription = styled.p`
- font-size: 12px;
- line-height: 16px;
- letter-spacing: 0.1px;
- color: ${({ theme }) => theme.secondary};
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
-`;
-
-export const ChannelList = styled.div`
- display: flex;
- flex-direction: column;
- overflow-y: scroll;
-
- &::-webkit-scrollbar {
- width: 0;
- }
-`;
-
const ChannelWrapper = styled.div`
display: flex;
justify-content: space-between;
@@ -216,6 +151,16 @@ export const ChannelName = styled.p`
}
`;
+const ChannelDescription = styled.p`
+ font-size: 12px;
+ line-height: 16px;
+ letter-spacing: 0.1px;
+ color: ${({ theme }) => theme.secondary};
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+`;
+
const NotificationBagde = styled.div`
width: 24px;
height: 24px;
diff --git a/packages/react-chat/src/components/Channels/Channels.tsx b/packages/react-chat/src/components/Channels/Channels.tsx
new file mode 100644
index 0000000..ac91ea8
--- /dev/null
+++ b/packages/react-chat/src/components/Channels/Channels.tsx
@@ -0,0 +1,60 @@
+import React, { useEffect } from "react";
+import styled from "styled-components";
+
+import { ChannelData, channels } from "../../helpers/channelsMock";
+
+import { Channel } from "./Channel";
+
+interface ChannelsProps {
+ notifications: { [id: string]: number };
+ clearNotifications: (id: string) => void;
+ onCommunityClick: (val: ChannelData) => void;
+ activeChannelId: number;
+}
+
+export function Channels({
+ notifications,
+ onCommunityClick,
+ clearNotifications,
+ activeChannelId,
+}: ChannelsProps) {
+ useEffect(() => {
+ const channel = channels.find((channel) => channel.id === activeChannelId);
+ if (channel) {
+ if (notifications[channel.name] > 0) {
+ clearNotifications(channel.name);
+ }
+ }
+ }, [notifications, activeChannelId]);
+
+ return (
+
+ {channels.map((channel) => (
+ 0 && !channel.isMuted
+ ? notifications[channel.name]
+ : undefined
+ }
+ onClick={() => {
+ onCommunityClick(channel);
+ }}
+ />
+ ))}
+
+ );
+}
+
+export const ChannelList = styled.div`
+ display: flex;
+ flex-direction: column;
+ overflow-y: scroll;
+
+ &::-webkit-scrollbar {
+ width: 0;
+ }
+`;
diff --git a/packages/react-chat/src/components/EmptyChannel.tsx b/packages/react-chat/src/components/Channels/EmptyChannel.tsx
similarity index 93%
rename from packages/react-chat/src/components/EmptyChannel.tsx
rename to packages/react-chat/src/components/Channels/EmptyChannel.tsx
index 30faba5..f6e1627 100644
--- a/packages/react-chat/src/components/EmptyChannel.tsx
+++ b/packages/react-chat/src/components/Channels/EmptyChannel.tsx
@@ -1,10 +1,10 @@
import React from "react";
import styled from "styled-components";
-import { ChannelData } from "../helpers/channelsMock";
+import { ChannelData } from "../../helpers/channelsMock";
+import { textMediumStyles } from "../Text";
-import { ChannelInfo, ChannelLogo, ChannelName } from "./Channels";
-import { textMediumStyles } from "./Text";
+import { ChannelInfo, ChannelLogo, ChannelName } from "./Channel";
type EmptyChannelProps = {
channel: ChannelData;
diff --git a/packages/react-chat/src/components/Chat.tsx b/packages/react-chat/src/components/Chat.tsx
index ca23ce3..9886b7a 100644
--- a/packages/react-chat/src/components/Chat.tsx
+++ b/packages/react-chat/src/components/Chat.tsx
@@ -8,10 +8,10 @@ import { useMessenger } from "../hooks/useMessenger";
import { Metadata } from "../models/Metadata";
import { Theme } from "../styles/themes";
-import { Channels } from "./Channels";
+import { Channels } from "./Channels/Channels";
import { ChatBody } from "./Chat/ChatBody";
import { Community } from "./Community";
-import { Members } from "./Members";
+import { Members } from "./Members/Members";
import { CommunityModal } from "./Modals/CommunityModal";
interface ChatProps {
diff --git a/packages/react-chat/src/components/Chat/ChatBody.tsx b/packages/react-chat/src/components/Chat/ChatBody.tsx
index a642985..1656d50 100644
--- a/packages/react-chat/src/components/Chat/ChatBody.tsx
+++ b/packages/react-chat/src/components/Chat/ChatBody.tsx
@@ -7,9 +7,9 @@ import { CommunityData } from "../../helpers/communityMock";
import { ChatMessage } from "../../models/ChatMessage";
import { Metadata } from "../../models/Metadata";
import { Theme } from "../../styles/themes";
-import { Channel } from "../Channels";
+import { Channel } from "../Channels/Channel";
+import { EmptyChannel } from "../Channels/EmptyChannel";
import { Community } from "../Community";
-import { EmptyChannel } from "../EmptyChannel";
import { MembersIcon } from "../Icons/MembersIcon";
import { NarrowChannels } from "../NarrowMode/NarrowChannels";
import { NarrowMembers } from "../NarrowMode/NarrowMembers";
diff --git a/packages/react-chat/src/components/Members.tsx b/packages/react-chat/src/components/Members.tsx
deleted file mode 100644
index c0cdcdb..0000000
--- a/packages/react-chat/src/components/Members.tsx
+++ /dev/null
@@ -1,212 +0,0 @@
-import React, { useCallback } from "react";
-import styled from "styled-components";
-
-import { useNarrow } from "../contexts/narrowProvider";
-import { CommunityData } from "../helpers/communityMock";
-
-import { Icon } from "./Chat/ChatMessages";
-import { UserIcon } from "./Icons/UserIcon";
-
-interface MembersProps {
- community: CommunityData;
- setShowChannels: (val: boolean) => void;
-}
-
-export function Members({ community, setShowChannels }: MembersProps) {
- return (
-
- Members
-
-
- );
-}
-
-interface MembersListProps {
- community: CommunityData;
- setShowChannels: (val: boolean) => void;
- setShowMembers?: (val: boolean) => void;
-}
-
-export function MembersList({
- community,
- setShowChannels,
- setShowMembers,
-}: MembersListProps) {
- return (
-
-
- You
-
-
-
-
- Guest564732
-
-
-
- Online
- {community.membersList
- .filter((member) => member.isOnline)
- .map((member) => (
-
- ))}
-
-
- Offline
- {community.membersList
- .filter((member) => !member.isOnline)
- .map((member) => (
-
- ))}
-
-
- );
-}
-
-interface MemberProps {
- member: any;
- isOnline: boolean;
- setShowChannels: (val: boolean) => void;
- setShowMembers?: (val: boolean) => void;
-}
-
-export function Member({
- member,
- isOnline,
- setShowChannels,
- setShowMembers,
-}: MemberProps) {
- const narrow = useNarrow();
-
- const switchMemberList = useCallback(() => {
- setShowChannels(false);
- if (setShowMembers) setShowMembers(false);
- }, [setShowMembers]);
-
- return (
-
- narrow && setShowMembers ? switchMemberList() : setShowChannels(true)
- }
- >
-
- {!member.avatar && }
-
- {member.name}
-
- );
-}
-
-const MembersWrapper = styled.div`
- width: 18%;
- height: 100%;
- min-width: 164px;
- display: flex;
- flex-direction: column;
- background-color: ${({ theme }) => theme.sectionBackgroundColor};
- padding: 16px;
-`;
-
-const MemberHeading = styled.h2`
- font-weight: 500;
- font-size: 15px;
- line-height: 22px;
- color: ${({ theme }) => theme.primary};
- margin-bottom: 16px;
-`;
-
-const MemberCategoryName = styled.h3`
- font-weight: normal;
- font-size: 13px;
- line-height: 18px;
- color: ${({ theme }) => theme.secondary};
- margin-bottom: 8px;
-`;
-
-const MemberName = styled.p`
- font-weight: 500;
- font-size: 15px;
- line-height: 22px;
- color: ${({ theme }) => theme.primary};
- opacity: 0.7;
- margin-left: 8px;
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
-`;
-
-const MembersListWrap = styled.div`
- display: flex;
- flex-direction: column;
- overflow-y: scroll;
-
- &::-webkit-scrollbar {
- width: 0;
- }
-`;
-
-const MemberCategory = styled.div`
- display: flex;
- flex-direction: column;
- margin-bottom: 16px;
-`;
-
-const MemberData = styled.div`
- display: flex;
- align-items: center;
- margin-bottom: 16px;
-`;
-
-const MemberIcon = styled(Icon)`
- width: 24px;
- height: 24px;
- position: relative;
- background-size: contain;
- background-position: center;
- flex-shrink: 0;
-
- &.offline {
- &::after {
- content: "";
- position: absolute;
- right: -1px;
- bottom: -2px;
- width: 7px;
- height: 7px;
- border-radius: 50%;
- background-color: ${({ theme }) => theme.secondary};
- border: 2px solid ${({ theme }) => theme.bodyBackgroundColor};
- }
- }
-
- &.online {
- &::after {
- content: "";
- position: absolute;
- right: -1px;
- bottom: -2px;
- width: 7px;
- height: 7px;
- border-radius: 50%;
- background-color: #4ebc60;
- border: 2px solid ${({ theme }) => theme.bodyBackgroundColor};
- }
- }
-`;
diff --git a/packages/react-chat/src/components/Members/Member.tsx b/packages/react-chat/src/components/Members/Member.tsx
new file mode 100644
index 0000000..7d11e75
--- /dev/null
+++ b/packages/react-chat/src/components/Members/Member.tsx
@@ -0,0 +1,100 @@
+import React, { useCallback } from "react";
+import styled from "styled-components";
+
+import { useNarrow } from "../../contexts/narrowProvider";
+import { Icon } from "../Chat/ChatMessages";
+import { UserIcon } from "../Icons/UserIcon";
+
+interface MemberProps {
+ member: any;
+ isOnline: boolean;
+ setShowChannels: (val: boolean) => void;
+ setShowMembers?: (val: boolean) => void;
+}
+
+export function Member({
+ member,
+ isOnline,
+ setShowChannels,
+ setShowMembers,
+}: MemberProps) {
+ const narrow = useNarrow();
+
+ const switchMemberList = useCallback(() => {
+ setShowChannels(false);
+ if (setShowMembers) setShowMembers(false);
+ }, [setShowMembers]);
+
+ return (
+
+ narrow && setShowMembers ? switchMemberList() : setShowChannels(true)
+ }
+ >
+
+ {!member.avatar && }
+
+ {member.name}
+
+ );
+}
+
+export const MemberData = styled.div`
+ display: flex;
+ align-items: center;
+ margin-bottom: 16px;
+`;
+
+export const MemberName = styled.p`
+ font-weight: 500;
+ font-size: 15px;
+ line-height: 22px;
+ color: ${({ theme }) => theme.primary};
+ opacity: 0.7;
+ margin-left: 8px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+`;
+
+export const MemberIcon = styled(Icon)`
+ width: 24px;
+ height: 24px;
+ position: relative;
+ background-size: contain;
+ background-position: center;
+ flex-shrink: 0;
+
+ &.offline {
+ &::after {
+ content: "";
+ position: absolute;
+ right: -1px;
+ bottom: -2px;
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background-color: ${({ theme }) => theme.secondary};
+ border: 2px solid ${({ theme }) => theme.bodyBackgroundColor};
+ }
+ }
+
+ &.online {
+ &::after {
+ content: "";
+ position: absolute;
+ right: -1px;
+ bottom: -2px;
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background-color: #4ebc60;
+ border: 2px solid ${({ theme }) => theme.bodyBackgroundColor};
+ }
+ }
+`;
diff --git a/packages/react-chat/src/components/Members/Members.tsx b/packages/react-chat/src/components/Members/Members.tsx
new file mode 100644
index 0000000..4fbf5c3
--- /dev/null
+++ b/packages/react-chat/src/components/Members/Members.tsx
@@ -0,0 +1,38 @@
+import React from "react";
+import styled from "styled-components";
+
+import { CommunityData } from "../../helpers/communityMock";
+
+import { MembersList } from "./MembersList";
+
+interface MembersProps {
+ community: CommunityData;
+ setShowChannels: (val: boolean) => void;
+}
+
+export function Members({ community, setShowChannels }: MembersProps) {
+ return (
+
+ Members
+
+
+ );
+}
+
+const MembersWrapper = styled.div`
+ width: 18%;
+ height: 100%;
+ min-width: 164px;
+ display: flex;
+ flex-direction: column;
+ background-color: ${({ theme }) => theme.sectionBackgroundColor};
+ padding: 16px;
+`;
+
+const MemberHeading = styled.h2`
+ font-weight: 500;
+ font-size: 15px;
+ line-height: 22px;
+ color: ${({ theme }) => theme.primary};
+ margin-bottom: 16px;
+`;
diff --git a/packages/react-chat/src/components/Members/MembersList.tsx b/packages/react-chat/src/components/Members/MembersList.tsx
new file mode 100644
index 0000000..a3cad4b
--- /dev/null
+++ b/packages/react-chat/src/components/Members/MembersList.tsx
@@ -0,0 +1,97 @@
+import React from "react";
+import styled from "styled-components";
+
+import { CommunityData } from "../../helpers/communityMock";
+import { UserIcon } from "../Icons/UserIcon";
+
+import { Member, MemberData, MemberIcon } from "./Member";
+
+interface MembersListProps {
+ community: CommunityData;
+ setShowChannels: (val: boolean) => void;
+ setShowMembers?: (val: boolean) => void;
+}
+
+export function MembersList({
+ community,
+ setShowChannels,
+ setShowMembers,
+}: MembersListProps) {
+ return (
+
+
+ You
+
+
+
+
+ Guest564732
+
+
+
+ Online
+ {community.membersList
+ .filter((member) => member.isOnline)
+ .map((member) => (
+
+ ))}
+
+
+ Offline
+ {community.membersList
+ .filter((member) => !member.isOnline)
+ .map((member) => (
+
+ ))}
+
+
+ );
+}
+
+const MembersListWrap = styled.div`
+ display: flex;
+ flex-direction: column;
+ overflow-y: scroll;
+
+ &::-webkit-scrollbar {
+ width: 0;
+ }
+`;
+
+const MemberCategory = styled.div`
+ display: flex;
+ flex-direction: column;
+ margin-bottom: 16px;
+`;
+
+const MemberCategoryName = styled.h3`
+ font-weight: normal;
+ font-size: 13px;
+ line-height: 18px;
+ color: ${({ theme }) => theme.secondary};
+ margin-bottom: 8px;
+`;
+
+const MemberName = styled.p`
+ font-weight: 500;
+ font-size: 15px;
+ line-height: 22px;
+ color: ${({ theme }) => theme.primary};
+ opacity: 0.7;
+ margin-left: 8px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+`;
diff --git a/packages/react-chat/src/components/NarrowMode/NarrowChannels.tsx b/packages/react-chat/src/components/NarrowMode/NarrowChannels.tsx
index e0fd668..397dfc8 100644
--- a/packages/react-chat/src/components/NarrowMode/NarrowChannels.tsx
+++ b/packages/react-chat/src/components/NarrowMode/NarrowChannels.tsx
@@ -2,7 +2,7 @@ import React from "react";
import styled from "styled-components";
import { ChannelData } from "../../helpers/channelsMock";
-import { Channels } from "../Channels";
+import { Channels } from "../Channels/Channels";
import { NarrowTopbar } from "./NarrowTopbar";
diff --git a/packages/react-chat/src/components/NarrowMode/NarrowMembers.tsx b/packages/react-chat/src/components/NarrowMode/NarrowMembers.tsx
index 8141526..ba46fe6 100644
--- a/packages/react-chat/src/components/NarrowMode/NarrowMembers.tsx
+++ b/packages/react-chat/src/components/NarrowMode/NarrowMembers.tsx
@@ -2,7 +2,7 @@ import React from "react";
import styled from "styled-components";
import { CommunityData } from "../../helpers/communityMock";
-import { MembersList } from "../Members";
+import { MembersList } from "../Members/MembersList";
import { NarrowTopbar } from "./NarrowTopbar";
diff --git a/packages/react-chat/src/styles/styles.ts b/packages/react-chat/src/styles/styles.ts
deleted file mode 100644
index caf5803..0000000
--- a/packages/react-chat/src/styles/styles.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const Font = "Inter, sans-serif";