Skip to content

Commit 8489d27

Browse files
authored
feat(web-ui): support new conversation's api (#776)
* feat(web-ui): support conversations * feat(api): expose conversation id * feat(web-ui): support conversations * refactor(web-ui): rename component
1 parent de75806 commit 8489d27

File tree

17 files changed

+110
-108
lines changed

17 files changed

+110
-108
lines changed

services/api/src/features/chat/application/contracts/dtos/chat-conversation.dto.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export class ChatConversationDetails {
2+
id!: string;
23
imageUrl?: string;
34
lastMessage?: string;
45
lastMessageSent?: Date;

services/api/src/features/chat/application/handlers/query-handlers/get-conversation-list.handler.ts

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export class GetConversationListHandler
4747
ChatConversationDetails,
4848
matchingConversations,
4949
(conversation) => ({
50+
id: conversation.id,
5051
imageUrl:
5152
conversation.photo &&
5253
this.photoService.getUrl(

services/web-ui/src/Router.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { NavigationTrackingProvider } from "src/core/tracking/NavigationTracking
77
import { BlogPostListPage } from "src/pages/BlogPostListPage";
88
import { BlogPostPage } from "src/pages/BlogPostPage";
99
import { ChatPage } from "src/pages/ChatPage";
10-
import { ConnectionsPage } from "src/pages/ConnectionsPage";
10+
import { ConversationsPage } from "src/pages/ConversationsPage";
1111
import { CreateOrganizationPage } from "src/pages/CreateOrganizationPage";
1212
import { CurrentOrganizationPage } from "src/pages/CurrentOrganizationPage";
1313
import { CurrentProfilePage } from "src/pages/CurrentProfilePage";
@@ -44,7 +44,7 @@ const router = createBrowserRouter([
4444
},
4545
{
4646
path: "/chat",
47-
element: <ConnectionsPage />,
47+
element: <ConversationsPage />,
4848
},
4949
{
5050
path: "/chat/:id",

services/web-ui/src/pages/ChatPage/ChatPage.container.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ import { ChatMessageList } from "./components/ChatMessageList";
1717
import { ChatTextField } from "./components/ChatTextField";
1818

1919
export function ChatPageContainer(): ReactElement {
20-
const { id } = useParams();
20+
const { id = "" } = useParams();
2121
const { t } = useTranslation("chat");
2222

2323
const { error, data, isLoading, refetch } = useQuery({
2424
queryKey: ["chat", id],
25-
queryFn: () => chatsApi.getChats({ profileId: Number.parseInt(id || "") }),
25+
queryFn: () => chatsApi.getChats({ conversationId: id }),
2626
});
2727

2828
useHandleNotification({

services/web-ui/src/pages/ConnectionsPage/ConnectionsPage.component.tsx

-29
This file was deleted.

services/web-ui/src/pages/ConnectionsPage/ConnectionsPage.container.tsx

-53
This file was deleted.

services/web-ui/src/pages/ConnectionsPage/components/ConnectionListItem/index.ts

-1
This file was deleted.

services/web-ui/src/pages/ConnectionsPage/index.ts

-1
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from "react";
2+
3+
import { List } from "@mui/material";
4+
5+
import { ChatConversationDetails } from "src/api";
6+
7+
import { ConversationListItem } from "./components/ConversationListItem";
8+
9+
export interface ConversationsPageComponentProps {
10+
data: ChatConversationDetails[];
11+
}
12+
13+
export function ConversationsPageComponent({
14+
data,
15+
}: ConversationsPageComponentProps): React.ReactElement {
16+
return (
17+
<>
18+
<List>
19+
{data.map((conversation, index) => (
20+
<ConversationListItem
21+
divider={index < data.length - 1}
22+
key={conversation.id}
23+
data={conversation}
24+
/>
25+
))}
26+
</List>
27+
</>
28+
);
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { ReactElement } from "react";
2+
3+
import { Typography } from "@mui/material";
4+
5+
import { chatsApi } from "src/apis";
6+
import { useTranslation } from "src/core/i18n";
7+
import { useQuery } from "src/core/query";
8+
import { ErrorView } from "src/views/ErrorView";
9+
10+
import { ConversationsPageComponent } from "./ConversationsPage.component";
11+
import { ConversationsPageNav } from "./ConversationsPage.nav";
12+
import { ConversationsPageSkeleton } from "./ConversationsPage.skeleton";
13+
14+
export function ConversationsPageContainer(): ReactElement {
15+
const { t } = useTranslation("connections");
16+
17+
const { error, data, isPending } = useQuery({
18+
queryKey: ["chat-conversations"],
19+
queryFn: () => chatsApi.getConversations(),
20+
});
21+
22+
if (error) {
23+
return (
24+
<ConversationsPageNav>
25+
<ErrorView error={error} />
26+
</ConversationsPageNav>
27+
);
28+
}
29+
30+
if (isPending) {
31+
return (
32+
<ConversationsPageNav>
33+
<ConversationsPageSkeleton />
34+
</ConversationsPageNav>
35+
);
36+
}
37+
38+
if (!data || data.length === 0) {
39+
return (
40+
<ConversationsPageNav>
41+
<Typography sx={{ paddingTop: 1 }} gutterBottom>
42+
{t("no-connections")}
43+
</Typography>
44+
</ConversationsPageNav>
45+
);
46+
}
47+
48+
return (
49+
<ConversationsPageNav>
50+
<ConversationsPageComponent data={data} />
51+
</ConversationsPageNav>
52+
);
53+
}

services/web-ui/src/pages/ConnectionsPage/ConnectionsPage.nav.tsx renamed to services/web-ui/src/pages/ConversationsPage/ConversationsPage.nav.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { Typography } from "@mui/material";
44

55
import { useTranslation } from "src/core/i18n";
66

7-
export interface ConnectionsPageNavProps {
7+
export interface ConversationsPageNavProps {
88
children: ReactNode;
99
}
1010

11-
export function ConnectionsPageNav({
11+
export function ConversationsPageNav({
1212
children,
13-
}: ConnectionsPageNavProps): React.ReactElement {
13+
}: ConversationsPageNavProps): React.ReactElement {
1414
const { t } = useTranslation("connections");
1515

1616
return (

services/web-ui/src/pages/ConnectionsPage/ConnectionsPage.skeleton.tsx renamed to services/web-ui/src/pages/ConversationsPage/ConversationsPage.skeleton.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React from "react";
22

33
import { List, ListItem, Skeleton } from "@mui/material";
44

5-
export function ConnectionsPageSkeleton(): React.ReactElement {
5+
export function ConversationsPageSkeleton(): React.ReactElement {
66
return (
77
<>
88
<List>
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
import type { Meta } from "@storybook/react";
22

3-
import { ConnectionDetails } from "src/api";
3+
import { ChatConversationDetails } from "src/api";
44

5-
import { ConnectionsPageComponent } from "./ConnectionsPage.component";
5+
import { ConversationsPageComponent } from "./ConversationsPage.component";
66

7-
const MATCHES_DATA: ConnectionDetails[] = [
7+
const MATCHES_DATA: ChatConversationDetails[] = [
88
{
9+
id: "1",
910
name: "John",
10-
profileId: 1,
1111
lastMessage: "hi",
1212
},
1313

1414
{
15+
id: "2",
1516
name: "Eric",
16-
profileId: 2,
1717
lastMessage: "hi",
1818
},
1919

2020
{
21+
id: "3",
2122
name: "Dalene",
22-
profileId: 3,
2323
lastMessage: "hi",
2424
},
2525
];
@@ -29,5 +29,5 @@ export default {
2929
} as Meta;
3030

3131
export const Default = {
32-
render: () => <ConnectionsPageComponent data={MATCHES_DATA} />,
32+
render: () => <ConversationsPageComponent data={MATCHES_DATA} />,
3333
};

services/web-ui/src/pages/ConnectionsPage/ConnectionsPage.test.tsx renamed to services/web-ui/src/pages/ConversationsPage/ConversationsPage.test.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { ReactQueryTestProvider, TestRouter, render, screen } from "src/test";
22

3-
import { ConnectionsPage } from ".";
3+
import { ConversationsPage } from ".";
44

5-
describe.skip("<ConnectionsPage />", () => {
5+
describe.skip("<ConversationsPage />", () => {
66
it("renders message when no matches", async () => {
77
render(
88
<TestRouter>
99
<ReactQueryTestProvider>
10-
<ConnectionsPage />
10+
<ConversationsPage />
1111
</ReactQueryTestProvider>
1212
</TestRouter>
1313
);

services/web-ui/src/pages/ConnectionsPage/components/ConnectionListItem/ConnectionListItem.tsx renamed to services/web-ui/src/pages/ConversationsPage/components/ConversationListItem/ConversationListItem.tsx

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,20 @@ import {
99
ListItemText,
1010
} from "@mui/material";
1111

12-
import { ConnectionDetails } from "src/api";
12+
import { ChatConversationDetails } from "src/api";
1313

14-
export interface ConnectionListItemProps {
15-
data: ConnectionDetails;
14+
export interface ConversationListItemProps {
15+
data: ChatConversationDetails;
1616
divider?: boolean;
1717
}
1818

19-
export function ConnectionListItem({
19+
export function ConversationListItem({
2020
data,
2121
divider,
22-
}: ConnectionListItemProps): React.ReactElement {
22+
}: ConversationListItemProps): React.ReactElement {
2323
return (
2424
<ListItem divider={divider}>
25-
<ListItemButton component={Link} to={`/chat/${data.profileId}`}>
25+
<ListItemButton component={Link} to={`/chat/${data.id}`}>
2626
<ListItemAvatar>
2727
<Avatar src={data.imageUrl} />
2828
</ListItemAvatar>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { ConversationListItem } from "./ConversationListItem";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { ConversationsPageContainer as ConversationsPage } from "./ConversationsPage.container";

0 commit comments

Comments
 (0)