Refactor channel data (#114)

This commit is contained in:
Szymon Szlachtowicz 2021-11-05 14:33:30 +01:00 committed by GitHub
parent 61c27f0721
commit ee91965c32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 85 additions and 117 deletions

View File

@ -1,31 +1,32 @@
import React, { useEffect } from "react"; import React, { useEffect, useMemo } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { useMessengerContext } from "../../contexts/messengerProvider"; import { useMessengerContext } from "../../contexts/messengerProvider";
import { ChannelData } from "../../models/ChannelData";
import { EditIcon } from "../Icons/EditIcon"; import { EditIcon } from "../Icons/EditIcon";
import { Channel } from "./Channel"; import { Channel } from "./Channel";
interface ChannelsProps { interface ChannelsProps {
onCommunityClick: (val: ChannelData) => void;
activeChannelId: string;
channels: ChannelData[];
membersList: string[]; membersList: string[];
groupList: string[][]; groupList: string[][];
setCreateChat: (val: boolean) => void; setCreateChat: (val: boolean) => void;
onCommunityClick?: () => void;
} }
export function Channels({ export function Channels({
onCommunityClick,
activeChannelId,
channels,
membersList, membersList,
groupList, groupList,
setCreateChat, setCreateChat,
onCommunityClick,
}: ChannelsProps) { }: ChannelsProps) {
const { clearNotifications, notifications } = useMessengerContext(); const {
clearNotifications,
notifications,
activeChannel,
setActiveChannel,
channels,
} = useMessengerContext();
const activeChannelId = useMemo(() => activeChannel.id, [activeChannel]);
useEffect(() => { useEffect(() => {
const channel = channels.find((channel) => channel.id === activeChannelId); const channel = channels.find((channel) => channel.id === activeChannelId);
if (channel) { if (channel) {
@ -49,7 +50,10 @@ export function Channels({
: undefined : undefined
} }
onClick={() => { onClick={() => {
onCommunityClick(channel); setActiveChannel(channel);
if (onCommunityClick) {
onCommunityClick();
}
setCreateChat(false); setCreateChat(false);
}} }}
/> />
@ -75,11 +79,14 @@ export function Channels({
isActive={group.join("") === activeChannelId} isActive={group.join("") === activeChannelId}
isMuted={false} isMuted={false}
onClick={() => { onClick={() => {
onCommunityClick({ setActiveChannel({
id: group.join(""), id: group.join(""),
name: group.join(", ").slice(0, 10), name: group.join(", ").slice(0, 10),
}); });
setCreateChat(false); setCreateChat(false);
if (onCommunityClick) {
onCommunityClick();
}
}} }}
/> />
))} ))}
@ -96,11 +103,14 @@ export function Channels({
isActive={member === activeChannelId} isActive={member === activeChannelId}
isMuted={false} isMuted={false}
onClick={() => { onClick={() => {
onCommunityClick({ setActiveChannel({
id: member, id: member,
name: member.slice(0, 10), name: member.slice(0, 10),
description: "Contact", description: "Contact",
}); });
if (onCommunityClick) {
onCommunityClick();
}
setCreateChat(false); setCreateChat(false);
}} }}
/> />

View File

@ -1,10 +1,9 @@
import React, { useEffect, useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Identity } from "status-communities/dist/cjs"; import { Identity } from "status-communities/dist/cjs";
import styled from "styled-components"; import styled from "styled-components";
import { useMessengerContext } from "../contexts/messengerProvider"; import { useMessengerContext } from "../contexts/messengerProvider";
import { useNarrow } from "../contexts/narrowProvider"; import { useNarrow } from "../contexts/narrowProvider";
import { ChannelData } from "../models/ChannelData";
import { uintToImgUrl } from "../utils/uintToImgUrl"; import { uintToImgUrl } from "../utils/uintToImgUrl";
import { Channels } from "./Channels/Channels"; import { Channels } from "./Channels/Channels";
@ -19,16 +18,9 @@ import { CommunitySkeleton } from "./Skeleton/CommunitySkeleton";
interface ChatProps { interface ChatProps {
communityKey: string; communityKey: string;
identity: Identity; identity: Identity;
setActiveChannel: (channel: ChannelData) => void;
activeChannel: ChannelData;
} }
export function Chat({ export function Chat({ communityKey, identity }: ChatProps) {
communityKey,
identity,
setActiveChannel,
activeChannel,
}: ChatProps) {
const [showMembers, setShowMembers] = useState(true); const [showMembers, setShowMembers] = useState(true);
const [showChannels, setShowChannels] = useState(true); const [showChannels, setShowChannels] = useState(true);
const [membersList, setMembersList] = useState([]); const [membersList, setMembersList] = useState([]);
@ -63,24 +55,6 @@ export function Chat({
} }
}, [community]); }, [community]);
const channels = useMemo(() => {
if (community?.chats) {
return Array.from(community.chats.values()).map((chat) => {
return {
id: chat.id,
name: chat.communityChat?.identity?.displayName ?? "",
description: chat.communityChat?.identity?.description ?? "",
};
});
} else {
return [];
}
}, [community]);
useEffect(() => {
if (channels.length > 0) setActiveChannel(channels[0]);
}, [channels]);
return ( return (
<ChatWrapper> <ChatWrapper>
{showChannels && !narrow && ( {showChannels && !narrow && (
@ -91,9 +65,6 @@ export function Chat({
<CommunitySkeleton /> <CommunitySkeleton />
)} )}
<Channels <Channels
onCommunityClick={(e) => setActiveChannel(e)}
activeChannelId={activeChannel?.id ?? ""}
channels={channels}
membersList={membersList} membersList={membersList}
groupList={groupList} groupList={groupList}
setCreateChat={setCreateChat} setCreateChat={setCreateChat}
@ -104,16 +75,12 @@ export function Chat({
{!createChat && ( {!createChat && (
<ChatBody <ChatBody
identity={identity} identity={identity}
channel={activeChannel}
setActiveChannel={setActiveChannel}
activeChannelId={activeChannel.id}
onClick={() => setShowMembers(!showMembers)} onClick={() => setShowMembers(!showMembers)}
showMembers={showMembers} showMembers={showMembers}
community={communityData} community={communityData}
showCommunity={!showChannels} showCommunity={!showChannels}
onCommunityClick={showModal} onCommunityClick={showModal}
onEditClick={showEditModal} onEditClick={showEditModal}
channels={channels}
membersList={membersList} membersList={membersList}
groupList={groupList} groupList={groupList}
setMembersList={setMembersList} setMembersList={setMembersList}
@ -134,7 +101,6 @@ export function Chat({
community={communityData} community={communityData}
setMembersList={setMembersList} setMembersList={setMembersList}
setGroupList={setGroupList} setGroupList={setGroupList}
setActiveChannel={setActiveChannel}
setCreateChat={setCreateChat} setCreateChat={setCreateChat}
/> />
)} )}
@ -152,7 +118,6 @@ export function Chat({
<EditModal <EditModal
isVisible={isEditVisible} isVisible={isEditVisible}
onClose={() => setIsEditVisible(false)} onClose={() => setIsEditVisible(false)}
channel={activeChannel}
/> />
</ChatWrapper> </ChatWrapper>
); );

View File

@ -4,7 +4,6 @@ import styled from "styled-components";
import { useMessengerContext } from "../../contexts/messengerProvider"; import { useMessengerContext } from "../../contexts/messengerProvider";
import { useNarrow } from "../../contexts/narrowProvider"; import { useNarrow } from "../../contexts/narrowProvider";
import { ChannelData } from "../../models/ChannelData";
import { CommunityData } from "../../models/CommunityData"; import { CommunityData } from "../../models/CommunityData";
import { Channel } from "../Channels/Channel"; import { Channel } from "../Channels/Channel";
import { EmptyChannel } from "../Channels/EmptyChannel"; import { EmptyChannel } from "../Channels/EmptyChannel";
@ -24,16 +23,12 @@ import { ChatMessages } from "./ChatMessages";
interface ChatBodyProps { interface ChatBodyProps {
identity: Identity; identity: Identity;
channel: ChannelData;
community: CommunityData | undefined; community: CommunityData | undefined;
onClick: () => void; onClick: () => void;
showMembers: boolean; showMembers: boolean;
showCommunity: boolean; showCommunity: boolean;
setActiveChannel: (val: ChannelData) => void;
activeChannelId: string;
onCommunityClick: () => void; onCommunityClick: () => void;
onEditClick: () => void; onEditClick: () => void;
channels: ChannelData[];
membersList: string[]; membersList: string[];
groupList: [][]; groupList: [][];
setMembersList: any; setMembersList: any;
@ -43,23 +38,19 @@ interface ChatBodyProps {
export function ChatBody({ export function ChatBody({
identity, identity,
channel,
community, community,
onClick, onClick,
showMembers, showMembers,
showCommunity, showCommunity,
setActiveChannel,
activeChannelId,
onCommunityClick, onCommunityClick,
onEditClick, onEditClick,
channels,
membersList, membersList,
groupList, groupList,
setMembersList, setMembersList,
setGroupList, setGroupList,
setCreateChat, setCreateChat,
}: ChatBodyProps) { }: ChatBodyProps) {
const { messenger, messages } = useMessengerContext(); const { messenger, messages, activeChannel } = useMessengerContext();
const narrow = useNarrow(); const narrow = useNarrow();
const [showChannelsList, setShowChannelsList] = useState(false); const [showChannelsList, setShowChannelsList] = useState(false);
const [showMembersList, setShowMembersList] = useState(false); const [showMembersList, setShowMembersList] = useState(false);
@ -92,7 +83,6 @@ export function ChatBody({
community={community} community={community}
setMembersList={setMembersList} setMembersList={setMembersList}
setGroupList={setGroupList} setGroupList={setGroupList}
setActiveChannel={setActiveChannel}
setCreateChat={setCreateChat} setCreateChat={setCreateChat}
editGroup={editGroup} editGroup={editGroup}
/> />
@ -115,7 +105,7 @@ export function ChatBody({
)} )}
<Channel <Channel
channel={channel} channel={activeChannel}
isActive={narrow ? showChannelsList : true} isActive={narrow ? showChannelsList : true}
activeView={true} activeView={true}
isMuted={false} isMuted={false}
@ -143,7 +133,7 @@ export function ChatBody({
{!community && <Loading />} {!community && <Loading />}
{showChannelMenu && ( {showChannelMenu && (
<ChannelMenu <ChannelMenu
channel={channel} channel={activeChannel}
messages={messages} messages={messages}
switchMemberList={switchMemberList} switchMemberList={switchMemberList}
setShowChannelMenu={setShowChannelMenu} setShowChannelMenu={setShowChannelMenu}
@ -161,13 +151,13 @@ export function ChatBody({
messenger && community ? ( messenger && community ? (
<ChatMessages <ChatMessages
messages={messages} messages={messages}
activeChannelId={activeChannelId} activeChannelId={activeChannel.id}
/> />
) : ( ) : (
<LoadingSkeleton /> <LoadingSkeleton />
) )
) : ( ) : (
<EmptyChannel channel={channel} /> <EmptyChannel channel={activeChannel} />
)} )}
<ChatInput /> <ChatInput />
</> </>
@ -175,11 +165,8 @@ export function ChatBody({
{showChannelsList && narrow && ( {showChannelsList && narrow && (
<NarrowChannels <NarrowChannels
channels={channels}
community={community.name} community={community.name}
setActiveChannel={setActiveChannel}
setShowChannels={setShowChannelsList} setShowChannels={setShowChannelsList}
activeChannelId={activeChannelId}
membersList={membersList} membersList={membersList}
groupList={groupList} groupList={groupList}
setCreateChat={setCreateChat} setCreateChat={setCreateChat}

View File

@ -4,7 +4,6 @@ import { bufToHex } from "status-communities/dist/cjs/utils";
import styled from "styled-components"; import styled from "styled-components";
import { useMessengerContext } from "../../contexts/messengerProvider"; import { useMessengerContext } from "../../contexts/messengerProvider";
import { ChannelData } from "../../models/ChannelData";
import { CommunityData } from "../../models/CommunityData"; import { CommunityData } from "../../models/CommunityData";
import { buttonStyles } from "../Buttons/buttonStyle"; import { buttonStyles } from "../Buttons/buttonStyle";
import { CrossIcon } from "../Icons/CrossIcon"; import { CrossIcon } from "../Icons/CrossIcon";
@ -16,7 +15,6 @@ interface ChatCreationProps {
community: CommunityData; community: CommunityData;
setMembersList: any; setMembersList: any;
setGroupList: any; setGroupList: any;
setActiveChannel: (val: ChannelData) => void;
setCreateChat: (val: boolean) => void; setCreateChat: (val: boolean) => void;
editGroup?: boolean; editGroup?: boolean;
} }
@ -26,14 +24,13 @@ export function ChatCreation({
community, community,
setMembersList, setMembersList,
setGroupList, setGroupList,
setActiveChannel,
setCreateChat, setCreateChat,
editGroup, editGroup,
}: ChatCreationProps) { }: ChatCreationProps) {
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [styledGroup, setStyledGroup] = useState<string[]>([]); const [styledGroup, setStyledGroup] = useState<string[]>([]);
const { contacts } = useMessengerContext(); const { contacts, setActiveChannel } = useMessengerContext();
const addMember = (member: string) => { const addMember = (member: string) => {
setStyledGroup((prevMembers: string[]) => { setStyledGroup((prevMembers: string[]) => {

View File

@ -2,7 +2,6 @@ import React, { useState } from "react";
import { Identity } from "status-communities/dist/cjs"; import { Identity } from "status-communities/dist/cjs";
import { MessengerProvider } from "../contexts/messengerProvider"; import { MessengerProvider } from "../contexts/messengerProvider";
import { ChannelData } from "../models/ChannelData";
import { Chat } from "./Chat"; import { Chat } from "./Chat";
import { IdentityLoader } from "./Form/IdentityLoader"; import { IdentityLoader } from "./Form/IdentityLoader";
@ -13,25 +12,11 @@ interface ChatLoaderProps {
export function ChatLoader({ communityKey }: ChatLoaderProps) { export function ChatLoader({ communityKey }: ChatLoaderProps) {
const [identity, setIdentity] = useState<Identity | undefined>(undefined); const [identity, setIdentity] = useState<Identity | undefined>(undefined);
const [activeChannel, setActiveChannel] = useState<ChannelData>({
id: "",
name: "",
description: "",
});
if (identity) { if (identity) {
return ( return (
<MessengerProvider <MessengerProvider identity={identity} communityKey={communityKey}>
identity={identity} <Chat communityKey={communityKey} identity={identity} />
communityKey={communityKey}
activeChannel={activeChannel.id}
>
<Chat
communityKey={communityKey}
activeChannel={activeChannel}
setActiveChannel={setActiveChannel}
identity={identity}
/>
</MessengerProvider> </MessengerProvider>
); );
} else { } else {

View File

@ -1,7 +1,7 @@
import React, { useState } from "react"; import React, { useState } from "react";
import styled from "styled-components"; import styled from "styled-components";
import { ChannelData } from "../../models/ChannelData"; import { useMessengerContext } from "../../contexts/messengerProvider";
import { buttonStyles } from "../Buttons/buttonStyle"; import { buttonStyles } from "../Buttons/buttonStyle";
import { ChannelLogo } from "../Channels/Channel"; import { ChannelLogo } from "../Channels/Channel";
import { AddIcon } from "../Icons/AddIcon"; import { AddIcon } from "../Icons/AddIcon";
@ -10,11 +10,8 @@ import { textMediumStyles } from "../Text";
import { BasicModalProps, Modal } from "./Modal"; import { BasicModalProps, Modal } from "./Modal";
import { Heading, Section } from "./ModalStyle"; import { Heading, Section } from "./ModalStyle";
interface EditModalProps extends BasicModalProps { export const EditModal = ({ isVisible, onClose }: BasicModalProps) => {
channel: ChannelData; const { activeChannel } = useMessengerContext();
}
export const EditModal = ({ isVisible, onClose, channel }: EditModalProps) => {
const [groupName, setGroupName] = useState(""); const [groupName, setGroupName] = useState("");
const [image, setImage] = useState(""); const [image, setImage] = useState("");
@ -25,8 +22,8 @@ export const EditModal = ({ isVisible, onClose, channel }: EditModalProps) => {
}; };
const handleUpload = () => { const handleUpload = () => {
channel.icon = image; activeChannel.icon = image;
channel.name = groupName; activeChannel.name = groupName;
onClose(); onClose();
}; };
@ -57,12 +54,14 @@ export const EditModal = ({ isVisible, onClose, channel }: EditModalProps) => {
style={{ style={{
backgroundImage: image backgroundImage: image
? `url(${image}` ? `url(${image}`
: channel.icon : activeChannel.icon
? `url(${channel.icon}` ? `url(${activeChannel.icon}`
: "", : "",
}} }}
> >
{!channel.icon && !image && channel.name.slice(0, 1).toUpperCase()} {!activeChannel.icon &&
!image &&
activeChannel.name.slice(0, 1).toUpperCase()}
<AddPictureInputWrapper> <AddPictureInputWrapper>
<AddIcon /> <AddIcon />
<AddPictureInput <AddPictureInput

View File

@ -1,17 +1,13 @@
import React from "react"; import React from "react";
import styled from "styled-components"; import styled from "styled-components";
import { ChannelData } from "../../models/ChannelData";
import { Channels } from "../Channels/Channels"; import { Channels } from "../Channels/Channels";
import { NarrowTopbar } from "./NarrowTopbar"; import { NarrowTopbar } from "./NarrowTopbar";
interface NarrowChannelsProps { interface NarrowChannelsProps {
community: string; community: string;
setActiveChannel: (val: ChannelData) => void;
activeChannelId: string;
setShowChannels: (val: boolean) => void; setShowChannels: (val: boolean) => void;
channels: ChannelData[];
membersList: string[]; membersList: string[];
groupList: string[][]; groupList: string[][];
setCreateChat: (val: boolean) => void; setCreateChat: (val: boolean) => void;
@ -19,10 +15,7 @@ interface NarrowChannelsProps {
export function NarrowChannels({ export function NarrowChannels({
community, community,
setActiveChannel,
activeChannelId,
setShowChannels, setShowChannels,
channels,
membersList, membersList,
groupList, groupList,
setCreateChat, setCreateChat,
@ -31,12 +24,7 @@ export function NarrowChannels({
<ListWrapper> <ListWrapper>
<NarrowTopbar list="Channels" community={community} /> <NarrowTopbar list="Channels" community={community} />
<Channels <Channels
onCommunityClick={(e) => { onCommunityClick={() => setShowChannels(false)}
setActiveChannel(e);
setShowChannels(false);
}}
activeChannelId={activeChannelId}
channels={channels}
membersList={membersList} membersList={membersList}
groupList={groupList} groupList={groupList}
setCreateChat={setCreateChat} setCreateChat={setCreateChat}

View File

@ -13,6 +13,12 @@ const MessengerContext = createContext<MessengerType>({
loadingMessages: false, loadingMessages: false,
community: undefined, community: undefined,
contacts: [], contacts: [],
activeChannel: {
id: "",
name: "",
},
channels: [],
setActiveChannel: () => undefined,
}); });
export function useMessengerContext() { export function useMessengerContext() {
@ -21,17 +27,15 @@ export function useMessengerContext() {
interface MessengerProviderProps { interface MessengerProviderProps {
children: React.ReactNode; children: React.ReactNode;
activeChannel: string;
communityKey?: string; communityKey?: string;
identity?: Identity; identity?: Identity;
} }
export function MessengerProvider({ export function MessengerProvider({
children, children,
activeChannel,
communityKey, communityKey,
identity, identity,
}: MessengerProviderProps) { }: MessengerProviderProps) {
const messenger = useMessenger(activeChannel, communityKey, identity); const messenger = useMessenger(communityKey, identity);
return <MessengerContext.Provider value={messenger} children={children} />; return <MessengerContext.Provider value={messenger} children={children} />;
} }

View File

@ -7,6 +7,7 @@ import {
Messenger, Messenger,
} from "status-communities/dist/cjs"; } from "status-communities/dist/cjs";
import { ChannelData } from "../../models/ChannelData";
import { ChatMessage } from "../../models/ChatMessage"; import { ChatMessage } from "../../models/ChatMessage";
import { Contact } from "../../models/Contact"; import { Contact } from "../../models/Contact";
import { createCommunity } from "../../utils/createCommunity"; import { createCommunity } from "../../utils/createCommunity";
@ -28,13 +29,23 @@ export type MessengerType = {
loadingMessages: boolean; loadingMessages: boolean;
community: Community | undefined; community: Community | undefined;
contacts: Contact[]; contacts: Contact[];
channels: ChannelData[];
activeChannel: ChannelData;
setActiveChannel: (channel: ChannelData) => void;
}; };
export function useMessenger( export function useMessenger(
chatId: string,
communityKey: string | undefined, communityKey: string | undefined,
identity: Identity | undefined identity: Identity | undefined
) { ) {
const [activeChannel, setActiveChannel] = useState<ChannelData>({
id: "",
name: "",
description: "",
});
const chatId = useMemo(() => activeChannel.id, [activeChannel]);
const [messenger, setMessenger] = useState<Messenger | undefined>(undefined); const [messenger, setMessenger] = useState<Messenger | undefined>(undefined);
const [internalContacts, setInternalContacts] = useState<{ const [internalContacts, setInternalContacts] = useState<{
@ -114,6 +125,25 @@ export function useMessenger(
[chatId, messenger] [chatId, messenger]
); );
const channels = useMemo<ChannelData[]>(() => {
if (community?.chats) {
return Array.from(community.chats.values()).map((chat) => {
return {
id: chat.id,
name: chat.communityChat?.identity?.displayName ?? "",
description: chat.communityChat?.identity?.description ?? "",
type: "channel",
};
});
} else {
return [];
}
}, [community]);
useEffect(() => {
if (channels.length > 0) setActiveChannel(channels[0]);
}, [channels]);
return { return {
messenger, messenger,
messages, messages,
@ -124,5 +154,8 @@ export function useMessenger(
loadingMessages, loadingMessages,
community, community,
contacts, contacts,
channels,
activeChannel,
setActiveChannel,
}; };
} }