Fix context error and group chats msg loading (#179)

This commit is contained in:
Szymon Szlachtowicz 2022-01-10 13:44:02 +01:00 committed by GitHub
parent fe3c189f00
commit 7c0668d010
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 94 additions and 83 deletions

View File

@ -34,20 +34,28 @@ export function ChatCreation({
const addMember = useCallback( const addMember = useCallback(
(member: string) => { (member: string) => {
setStyledGroup((prevMembers: string[]) => { setStyledGroup((prevMembers: string[]) => {
if (prevMembers.find((mem) => mem === member)) { if (
prevMembers.find((mem) => mem === member) ||
prevMembers.length >= 5
) {
return prevMembers; return prevMembers;
} else { } else {
return [...prevMembers, member]; return [...prevMembers, member];
} }
}); });
setQuery("");
}, },
[setStyledGroup, styledGroup] [setStyledGroup, styledGroup]
); );
const removeMember = (member: string) => { const removeMember = useCallback(
(member: string) => {
setStyledGroup((prev) => prev.filter((e) => e != member)); setStyledGroup((prev) => prev.filter((e) => e != member));
}; },
[setStyledGroup]
);
const createChat = (group: string[]) => { const createChat = useCallback(
(group: string[]) => {
if (identity) { if (identity) {
const newGroup = group.slice(); const newGroup = group.slice();
newGroup.push(bufToHex(identity.publicKey)); newGroup.push(bufToHex(identity.publicKey));
@ -61,14 +69,15 @@ export function ChatCreation({
}); });
setChatState(ChatState.ChatBody); setChatState(ChatState.ChatBody);
} }
}; },
[identity, createGroupChat, setChannel]
);
return ( return (
<CreationWrapper> <CreationWrapper>
<CreationBar> <CreationBar>
<InputBar> <InputBar>
<InputText>To:</InputText> <InputText>To:</InputText>
{styledGroup.length > 0 && (
<StyledList> <StyledList>
{styledGroup.map((member) => ( {styledGroup.map((member) => (
<StyledMember key={member}> <StyledMember key={member}>
@ -79,24 +88,19 @@ export function ChatCreation({
</StyledMember> </StyledMember>
))} ))}
</StyledList> </StyledList>
)}
<SearchMembers>
{styledGroup.length < 5 && ( {styledGroup.length < 5 && (
<> <SearchMembers>
<Input <Input
value={query} value={query}
onInput={(e) => setQuery(e.currentTarget.value)} onInput={(e) => setQuery(e.currentTarget.value)}
/> />
{query && (
<SearchBlock <SearchBlock
query={query} query={query}
discludeList={styledGroup} discludeList={styledGroup}
onClick={addMember} onClick={addMember}
/> />
)}
</>
)}
</SearchMembers> </SearchMembers>
)}
{styledGroup.length === 5 && ( {styledGroup.length === 5 && (
<LimitAlert>5 user Limit reached</LimitAlert> <LimitAlert>5 user Limit reached</LimitAlert>
)} )}

View File

@ -47,11 +47,13 @@ export function ChatInput({ reply, setReply }: ChatInputProps) {
const inputRef = useRef<HTMLDivElement>(null); const inputRef = useRef<HTMLDivElement>(null);
useEffect(() => { useEffect(() => {
if (showEmoji) {
window.addEventListener("click", () => setShowEmoji(false)); window.addEventListener("click", () => setShowEmoji(false));
}
return () => { return () => {
window.removeEventListener("click", () => setShowEmoji(false)); window.removeEventListener("click", () => setShowEmoji(false));
}; };
}, []); }, [showEmoji]);
const image = useMemo( const image = useMemo(
() => (imageUint ? uintToImgUrl(imageUint) : ""), () => (imageUint ? uintToImgUrl(imageUint) : ""),

View File

@ -3,7 +3,7 @@ import { utils } from "status-communities/dist/cjs";
import { bufToHex } from "status-communities/dist/cjs/utils"; import { bufToHex } from "status-communities/dist/cjs/utils";
import styled from "styled-components"; import styled from "styled-components";
import { useIdentity, useNickname } from "../../contexts/identityProvider"; import { useIdentity } from "../../contexts/identityProvider";
import { useMessengerContext } from "../../contexts/messengerProvider"; import { useMessengerContext } from "../../contexts/messengerProvider";
import { useModal } from "../../contexts/modalProvider"; import { useModal } from "../../contexts/modalProvider";
import { buttonStyles } from "../Buttons/buttonStyle"; import { buttonStyles } from "../Buttons/buttonStyle";
@ -17,12 +17,10 @@ interface MembersListProps {
} }
export function MembersList({ switchShowMembers }: MembersListProps) { export function MembersList({ switchShowMembers }: MembersListProps) {
const { contacts } = useMessengerContext(); const { contacts, nickname } = useMessengerContext();
const identity = useIdentity(); const identity = useIdentity();
const { setModal } = useModal(LogoutModalName); const { setModal } = useModal(LogoutModalName);
const nickname = useNickname();
const userContacts = useMemo(() => { const userContacts = useMemo(() => {
if (identity) { if (identity) {
return Object.values(contacts).filter( return Object.values(contacts).filter(

View File

@ -4,10 +4,10 @@ import styled from "styled-components";
import { import {
useIdentity, useIdentity,
useNickname,
useSetIdentity, useSetIdentity,
useSetNikcname, useSetNikcname,
} from "../../contexts/identityProvider"; } from "../../contexts/identityProvider";
import { useMessengerContext } from "../../contexts/messengerProvider";
import { useModal } from "../../contexts/modalProvider"; import { useModal } from "../../contexts/modalProvider";
import { ButtonNo, ButtonYes } from "../Buttons/buttonStyle"; import { ButtonNo, ButtonYes } from "../Buttons/buttonStyle";
import { UserLogo } from "../Members/UserLogo"; import { UserLogo } from "../Members/UserLogo";
@ -29,7 +29,7 @@ export const LogoutModal = () => {
const logout = useSetIdentity(); const logout = useSetIdentity();
const setNickname = useSetNikcname(); const setNickname = useSetNikcname();
const identity = useIdentity(); const identity = useIdentity();
const nickname = useNickname(); const { nickname } = useMessengerContext();
if (identity) { if (identity) {
return ( return (

View File

@ -32,7 +32,7 @@ export const SearchBlock = ({
.filter((member) => !discludeList.includes(member.id)); .filter((member) => !discludeList.includes(member.id));
}, [query, discludeList, contacts]); }, [query, discludeList, contacts]);
if (searchList.length === 0) { if (searchList.length === 0 || !query) {
return null; return null;
} }
return ( return (

View File

@ -25,6 +25,7 @@ const MessengerContext = createContext<MessengerType>({
createGroupChat: () => undefined, createGroupChat: () => undefined,
changeGroupChatName: () => undefined, changeGroupChatName: () => undefined,
addMembers: () => undefined, addMembers: () => undefined,
nickname: undefined,
}); });
export function useMessengerContext() { export function useMessengerContext() {

View File

@ -6,15 +6,14 @@ import {
} from "status-communities/dist/cjs"; } from "status-communities/dist/cjs";
import { bufToHex } from "status-communities/dist/cjs/utils"; import { bufToHex } from "status-communities/dist/cjs/utils";
import { useSetNikcname } from "../../contexts/identityProvider";
import { Contacts } from "../../models/Contact"; import { Contacts } from "../../models/Contact";
export function useContacts( export function useContacts(
messenger: Messenger | undefined, messenger: Messenger | undefined,
identity: Identity | undefined, identity: Identity | undefined,
nickname: string | undefined newNickname: string | undefined
) { ) {
const setNickname = useSetNikcname(); const [nickname, setNickname] = useState<string | undefined>(undefined);
const [internalContacts, setInternalContacts] = useState<{ const [internalContacts, setInternalContacts] = useState<{
[id: string]: { clock: number; nickname?: string }; [id: string]: { clock: number; nickname?: string };
}>({}); }>({});
@ -37,7 +36,7 @@ export function useContacts(
return { ...prev, [id]: { ...prev[id], nickname } }; return { ...prev, [id]: { ...prev[id], nickname } };
}); });
}, },
nickname newNickname
); );
return newContacts; return newContacts;
} }
@ -65,5 +64,5 @@ export function useContacts(
}); });
}, [internalContacts]); }, [internalContacts]);
return { contacts, setContacts, contactsClass }; return { contacts, setContacts, contactsClass, nickname };
} }

View File

@ -45,7 +45,6 @@ export function useGroupChats(
setChannels((prev) => { setChannels((prev) => {
return { ...prev, [channel.id]: channel }; return { ...prev, [channel.id]: channel };
}); });
setActiveChannel(channel);
}; };
const removeChat = (chat: GroupChat) => { const removeChat = (chat: GroupChat) => {
setChannels((prev) => { setChannels((prev) => {

View File

@ -33,6 +33,8 @@ export function useLoadPrevDay(
loadingPreviousMessages.current[id] = true; loadingPreviousMessages.current[id] = true;
setLoadingMessages(true); setLoadingMessages(true);
let amountOfMessages = 0; let amountOfMessages = 0;
let failed = true;
try {
if (groupChat && groupChats) { if (groupChat && groupChats) {
amountOfMessages = await groupChats.retrievePreviousMessages( amountOfMessages = await groupChats.retrievePreviousMessages(
id, id,
@ -47,9 +49,13 @@ export function useLoadPrevDay(
); );
} }
lastLoadTime.current[id] = startTime; lastLoadTime.current[id] = startTime;
failed = false;
} catch {
failed = true;
}
loadingPreviousMessages.current[id] = false; loadingPreviousMessages.current[id] = false;
setLoadingMessages(false); setLoadingMessages(false);
if (amountOfMessages === 0) { if (amountOfMessages === 0 && !failed) {
loadPrevDay(id, groupChat); loadPrevDay(id, groupChat);
} }
} }

View File

@ -47,6 +47,7 @@ export type MessengerType = {
createGroupChat: (members: string[]) => void; createGroupChat: (members: string[]) => void;
changeGroupChatName: (name: string, chatId: string) => void; changeGroupChatName: (name: string, chatId: string) => void;
addMembers: (members: string[], chatId: string) => void; addMembers: (members: string[], chatId: string) => void;
nickname: string | undefined;
}; };
function useCreateMessenger(identity: Identity | undefined) { function useCreateMessenger(identity: Identity | undefined) {
@ -101,7 +102,7 @@ function useCreateCommunity(
export function useMessenger( export function useMessenger(
identity: Identity | undefined, identity: Identity | undefined,
nickname: string | undefined newNickname: string | undefined
) { ) {
const { communityKey } = useConfig(); const { communityKey } = useConfig();
const [activeChannel, setActiveChannel] = useState<ChannelData>({ const [activeChannel, setActiveChannel] = useState<ChannelData>({
@ -113,10 +114,10 @@ export function useMessenger(
const messenger = useCreateMessenger(identity); const messenger = useCreateMessenger(identity);
const { contacts, setContacts, contactsClass } = useContacts( const { contacts, setContacts, contactsClass, nickname } = useContacts(
messenger, messenger,
identity, identity,
nickname newNickname
); );
const { const {
@ -258,5 +259,6 @@ export function useMessenger(
createGroupChat, createGroupChat,
changeGroupChatName, changeGroupChatName,
addMembers, addMembers,
nickname,
}; };
} }

View File

@ -293,6 +293,10 @@ export class GroupChats {
async (message) => await this.decodeUpdateMessage(message, false) async (message) => await this.decodeUpdateMessage(message, false)
) )
); );
this.waku.relay.addObserver(
(message) => this.decodeUpdateMessage(message, true),
[topic]
);
await Promise.all( await Promise.all(
Object.values(this.chats).map(async (chat) => { Object.values(this.chats).map(async (chat) => {
if (!chat?.removed) { if (!chat?.removed) {
@ -301,10 +305,6 @@ export class GroupChats {
} }
}) })
); );
this.waku.relay.addObserver(
(message) => this.decodeUpdateMessage(message, true),
[topic]
);
} }
private async sendUpdateMessage( private async sendUpdateMessage(