Skip to content

Commit

Permalink
Refactored comon fields from conversation group editors;
Browse files Browse the repository at this point in the history
  • Loading branch information
stef-coenen committed Oct 22, 2024
1 parent 8106d41 commit e74ebce
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Input, t, useAllContacts } from '@homebase-id/common-app';
import { useState } from 'react';
import { SingleConversationItem } from '../Item/ConversationItem';

export const GroupContactSearch = ({
addContact,
defaultValue,
}: {
addContact: (newOdinId: string) => void;
defaultValue: string[];
}) => {
const [query, setQuery] = useState<string | undefined>(undefined);

const { data: contacts } = useAllContacts(true);
const contactResults = contacts
? contacts
.map((dsr) => dsr.fileMetadata.appData.content)
.filter(
(contact) =>
contact.odinId &&
(!query ||
contact.odinId?.includes(query) ||
contact.name?.displayName?.includes(query))
)
.filter((contact) => contact.odinId && !defaultValue.includes(contact.odinId))
: [];

return (
<>
<form onSubmit={(e) => e.preventDefault()} className="w-full">
<div className="flex w-full flex-col gap-2 p-5">
<Input
onChange={(e) => setQuery(e.target.value)}
defaultValue={query}
className="w-full"
placeholder={t('Search for contacts')}
/>
</div>
</form>
{contactResults?.length ? (
<div className="flex-grow overflow-auto">
{contactResults.map((result, index) => (
<SingleConversationItem
odinId={result.odinId as string}
isActive={false}
key={result.odinId || index}
onClick={() => {
if (!result.odinId) return;
addContact(result.odinId);
}}
/>
))}
</div>
) : (
<div className="flex flex-grow items-center justify-center p-5">
<p className="text-slate-400">{t('No contacts found')}</p>
</div>
)}
</>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ import {
Label,
NotFound,
t,
useAllContacts,
useDotYouClient,
useIntroductions,
} from '@homebase-id/common-app';
import { Save, Times } from '@homebase-id/common-app/icons';
import { useNavigate, useParams } from 'react-router-dom';
import { useConversation } from '../../../../hooks/chat/useConversation';
import { SingleConversationItem } from '../Item/ConversationItem';
import { GroupContactSearch } from './ConversationGroupFIelds';

export const EditConversationGroup = () => {
const identity = useDotYouClient().getIdentity();
Expand All @@ -28,26 +27,11 @@ export const EditConversationGroup = () => {
} = useConversation({ conversationId: conversationKey });
const { mutate: introduceIdentities } = useIntroductions().introduceIdentities;

const [query, setQuery] = useState<string | undefined>(undefined);

const [newRecipients, setNewRecipients] = useState<string[]>([]);
const [groupTitle, setGroupTitle] = useState<string>();

const navigate = useNavigate();

const { data: contacts } = useAllContacts(true);
const contactResults = contacts
? contacts
.map((dsr) => dsr.fileMetadata.appData.content)
.filter(
(contact) =>
contact.odinId &&
(!query ||
contact.odinId?.includes(query) ||
contact.name?.displayName?.includes(query))
)
: [];

const doUpdate = async () => {
if (!conversation) return;
const newConversation = { ...conversation };
Expand Down Expand Up @@ -143,32 +127,12 @@ export const EditConversationGroup = () => {
</div>
</div>

<form onSubmit={(e) => e.preventDefault()} className="w-full">
<div className="flex w-full flex-col gap-2 p-5">
<Input
onChange={(e) => setQuery(e.target.value)}
defaultValue={query}
className="w-full"
placeholder={t('Search for contacts')}
/>
</div>
</form>
<div className="flex-grow overflow-auto">
{contactResults.map((result, index) => (
<SingleConversationItem
odinId={result.odinId as string}
isActive={false}
key={result.odinId || index}
onClick={() => {
if (!result.odinId) return;
setNewRecipients([
...newRecipients.filter((x) => x !== result.odinId),
result.odinId,
]);
}}
/>
))}
</div>
<GroupContactSearch
addContact={(newContact) => {
setNewRecipients([...newRecipients.filter((x) => x !== newContact), newContact]);
}}
defaultValue={[...newRecipients, ...conversation.fileMetadata.appData.content.recipients]}
/>
</ErrorBoundary>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -8,42 +8,24 @@ import {
Input,
Label,
t,
useAllContacts,
} from '@homebase-id/common-app';
import { Arrow, Times } from '@homebase-id/common-app/icons';
import { useNavigate } from 'react-router-dom';
import { ContactFile } from '@homebase-id/js-lib/network';
import { useConversation } from '../../../../hooks/chat/useConversation';
import { SingleConversationItem } from '../Item/ConversationItem';
import { GroupContactSearch } from './ConversationGroupFIelds';

export const NewConversationGroup = () => {
const [query, setQuery] = useState<string | undefined>(undefined);

const [isStepOne, setIsStepOne] = useState<boolean>(true);
const [newRecipients, setNewRecipients] = useState<ContactFile[]>([]);
const [newRecipients, setNewRecipients] = useState<string[]>([]);
const [groupTitle, setGroupTitle] = useState<string>();

const navigate = useNavigate();

const { data: contacts } = useAllContacts(true);
const contactResults = contacts
? contacts
.map((dsr) => dsr.fileMetadata.appData.content)
.filter(
(contact) =>
contact.odinId &&
(!query ||
contact.odinId?.includes(query) ||
contact.name?.displayName?.includes(query))
)
: [];

const { mutateAsync: createNew, status: createStatus } = useConversation().create;
const doCreate = async () => {
const recipients = newRecipients.map((x) => x.odinId).filter(Boolean) as string[];
if (!recipients?.length) return;
if (!newRecipients?.length) return;
try {
const result = await createNew({ recipients: recipients, title: groupTitle });
const result = await createNew({ recipients: newRecipients, title: groupTitle });
navigate(`${CHAT_ROOT_PATH}/${result.newConversationId}`);
} catch (e) {
console.error(e);
Expand All @@ -63,17 +45,15 @@ export const NewConversationGroup = () => {
{newRecipients.map((recipient, index) => (
<div
className="flex flex-row items-center gap-1 rounded-lg bg-background px-2 py-1"
key={recipient.odinId || index}
key={recipient || index}
>
<ConnectionImage odinId={recipient.odinId} size="xs" />
<ConnectionName odinId={recipient.odinId} />
<ConnectionImage odinId={recipient} size="xs" />
<ConnectionName odinId={recipient} />
<ActionButton
icon={Times}
type="mute"
className="ml-auto"
onClick={() =>
setNewRecipients(newRecipients.filter((x) => x.odinId !== recipient.odinId))
}
onClick={() => setNewRecipients(newRecipients.filter((x) => x !== recipient))}
/>
</div>
))}
Expand Down Expand Up @@ -115,28 +95,12 @@ export const NewConversationGroup = () => {
</div>
) : null}

<form onSubmit={(e) => e.preventDefault()} className="w-full">
<div className="flex w-full flex-col gap-2 p-5">
<Input
onChange={(e) => setQuery(e.target.value)}
defaultValue={query}
className="w-full"
placeholder={t('Search for contacts')}
/>
</div>
</form>
<div className="flex-grow overflow-auto">
{contactResults.map((result, index) => (
<SingleConversationItem
odinId={result.odinId as string}
isActive={false}
key={result.odinId || index}
onClick={() =>
setNewRecipients([...newRecipients.filter((x) => x.odinId !== result.odinId), result])
}
/>
))}
</div>
<GroupContactSearch
addContact={(newContact) => {
setNewRecipients([...newRecipients.filter((x) => x !== newContact), newContact]);
}}
defaultValue={newRecipients}
/>
</ErrorBoundary>
);
};
25 changes: 12 additions & 13 deletions packages/chat-app/src/components/Chat/Detail/ChatInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,18 @@ export const ChatInfo = ({
</div>
{recipients?.length > 1 ? (
<div className="mt-10">
<p className="mb-4 text-lg">{t('Recipients')}</p>
<div className="flex flex-col items-center justify-between sm:flex-row">
<p className="mb-4 text-lg">{t('Recipients')}</p>
{isAdmin ? (
<ActionLink
type="mute"
size="none"
href={`${CHAT_ROOT_PATH}/${conversation.fileMetadata.appData.uniqueId}/edit`}
>
{t('Edit')}
</ActionLink>
) : null}
</div>
<div className="flex flex-col gap-4">
{recipients.map((recipient) => (
<a
Expand All @@ -119,18 +130,6 @@ export const ChatInfo = ({
</div>
</div>
) : null}

{isAdmin ? (
<div className="flex flex-row-reverse">
<ActionLink
type="secondary"
href={`${CHAT_ROOT_PATH}/${conversation.fileMetadata.appData.uniqueId}/edit`}
icon={Plus}
>
{t('Add')}
</ActionLink>
</div>
) : null}
</DialogWrapper>
);

Expand Down

0 comments on commit e74ebce

Please sign in to comment.