Skip to content

Commit 1312cc2

Browse files
committed
メッセージを送った人と送られた人で表示を変更
1 parent 07f8828 commit 1312cc2

File tree

4 files changed

+125
-62
lines changed

4 files changed

+125
-62
lines changed

server/src/database/chat.ts

Lines changed: 57 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ import type {
1414
} from "common/types";
1515
import { prisma } from "./client";
1616
import { getRelation } from "./matches";
17-
import { getMatchedUser, getPendingRequestsToUser } from "./requests";
17+
import {
18+
getMatchedUser,
19+
getPendingRequestsFromUser,
20+
getPendingRequestsToUser,
21+
} from "./requests";
1822

1923
export async function getOverview(
2024
user: UserID,
@@ -23,18 +27,22 @@ export async function getOverview(
2327
const matched = await getMatchedUser(user);
2428
if (!matched.ok) return Err(matched.error);
2529

26-
const requester = await getPendingRequestsToUser(user);
27-
if (!requester.ok) return Err(requester.error);
30+
const senders = await getPendingRequestsToUser(user);
31+
if (!senders.ok) return Err(senders.error);
2832

29-
const dm = await Promise.all(
33+
const receivers = await getPendingRequestsFromUser(user);
34+
if (!receivers.ok) return Err(receivers.error);
35+
36+
//マッチングしている人のオーバービュー
37+
const matchingOverview = await Promise.all(
3038
matched.value.map(async (friend) => {
3139
const lastMessageResult = await getLastMessage(user, friend.id);
3240
const lastMessage = lastMessageResult.ok
3341
? lastMessageResult.value
3442
: undefined;
3543
const overview: DMOverview = {
3644
isDM: true,
37-
isFriend: true,
45+
matchingStatus: "matched",
3846
friendId: friend.id,
3947
name: friend.name,
4048
thumbnail: friend.pictureUrl,
@@ -44,6 +52,44 @@ export async function getOverview(
4452
}),
4553
);
4654

55+
//自分にリクエストを送ってきた人のオーバービュー
56+
const senderOverview = await Promise.all(
57+
senders.value.map(async (sender) => {
58+
const lastMessageResult = await getLastMessage(user, sender.id);
59+
const lastMessage = lastMessageResult.ok
60+
? lastMessageResult.value
61+
: undefined;
62+
const overview: DMOverview = {
63+
isDM: true,
64+
matchingStatus: "otherRequest",
65+
friendId: sender.id,
66+
name: sender.name,
67+
thumbnail: sender.pictureUrl,
68+
lastMsg: lastMessage,
69+
};
70+
return overview;
71+
}),
72+
);
73+
74+
//自分がリクエストを送った人のオーバービュー
75+
const receiverOverview = await Promise.all(
76+
receivers.value.map(async (receiver) => {
77+
const lastMessageResult = await getLastMessage(user, receiver.id);
78+
const lastMessage = lastMessageResult.ok
79+
? lastMessageResult.value
80+
: undefined;
81+
const overview: DMOverview = {
82+
isDM: true,
83+
matchingStatus: "myRequest",
84+
friendId: receiver.id,
85+
name: receiver.name,
86+
thumbnail: receiver.pictureUrl,
87+
lastMsg: lastMessage,
88+
};
89+
return overview;
90+
}),
91+
);
92+
4793
const sharedRooms: {
4894
id: number;
4995
name: string;
@@ -65,26 +111,12 @@ export async function getOverview(
65111
return overview;
66112
});
67113

68-
// リクエスター (友達申請者) のオーバービュー作成
69-
const requesterOverview = await Promise.all(
70-
requester.value.map(async (requester) => {
71-
const lastMessageResult = await getLastMessage(user, requester.id);
72-
const lastMessage = lastMessageResult.ok
73-
? lastMessageResult.value
74-
: undefined;
75-
const overview: DMOverview = {
76-
isDM: true,
77-
isFriend: false,
78-
friendId: requester.id,
79-
name: requester.name,
80-
thumbnail: requester.pictureUrl,
81-
lastMsg: lastMessage,
82-
};
83-
return overview;
84-
}),
85-
);
86-
87-
return Ok([...shared, ...dm, ...requesterOverview]);
114+
return Ok([
115+
...matchingOverview,
116+
...senderOverview,
117+
...receiverOverview,
118+
...shared,
119+
]);
88120
} catch (e) {
89121
return Err(e);
90122
}

server/src/functions/chat.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,17 @@ export async function sendDM(
6161
}
6262

6363
export async function getDM(
64-
requester: UserID,
65-
_with: UserID,
64+
user: UserID,
65+
friend: UserID,
6666
): Promise<http.Response<PersonalizedDMRoom & DMRoom>> {
67-
const rel = await getRelation(requester, _with);
67+
const rel = await getRelation(user, friend);
6868
if (!rel.ok || rel.value.status === "REJECTED")
6969
return http.forbidden("cannot send to rejected-friend");
7070

71-
const room = await db.getDMbetween(requester, _with);
71+
const room = await db.getDMbetween(user, friend);
7272
if (!room.ok) return http.internalError();
7373

74-
const friendData = await getUserByID(_with);
74+
const friendData = await getUserByID(friend);
7575
if (!friendData.ok) return http.notFound("friend not found");
7676

7777
const personalized: PersonalizedDMRoom & DMRoom = {
@@ -80,9 +80,9 @@ export async function getDM(
8080
matchingStatus:
8181
rel.value.status === "MATCHED"
8282
? "matched"
83-
: rel.value.status === "PENDING"
83+
: rel.value.sendingUserId === user //どっちが送ったリクエストなのかを判定
8484
? "myRequest"
85-
: "otherRequest", //Fix Me: これだとREJECTEDの時に、matchingStatus = otherRequest になってしまう。本当はちゃんと判別しないといけない。呼び出し口でこれがちゃんと使われてないので、無視している。
85+
: "otherRequest",
8686
...room.value,
8787
};
8888

web/components/chat/RoomList.tsx

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import { Box, List, Typography } from "@mui/material";
44
import type { RoomOverview } from "common/types";
55
import { useRouter } from "next/navigation";
6-
import request from "~/api/request";
76
import { HumanListItem } from "../human/humanListItem";
87

98
type RoomListProps = {
@@ -35,7 +34,7 @@ export function RoomList(props: RoomListProps) {
3534
</p>
3635
{roomsData?.map((room) => {
3736
if (room.isDM) {
38-
if (!room.isFriend) {
37+
if (room.matchingStatus === "otherRequest") {
3938
return (
4039
<Box
4140
key={room.friendId}
@@ -51,16 +50,33 @@ export function RoomList(props: RoomListProps) {
5150
pictureUrl={room.thumbnail}
5251
rollUpName={true}
5352
lastMessage={room.lastMsg?.content}
54-
onAccept={() => {
55-
request.accept(room.friendId).then(() => location.reload());
56-
}}
57-
onReject={() => {
58-
request.reject(room.friendId).then(() => location.reload());
59-
}}
53+
statusMessage="リクエストを受けました"
6054
/>
6155
</Box>
6256
);
6357
}
58+
if (room.matchingStatus === "myRequest") {
59+
return (
60+
<Box
61+
key={room.friendId}
62+
onClick={(e) => {
63+
e.stopPropagation();
64+
navigateToRoom(room);
65+
}}
66+
>
67+
<HumanListItem
68+
key={room.friendId}
69+
id={room.friendId}
70+
name={room.name}
71+
pictureUrl={room.thumbnail}
72+
rollUpName={true}
73+
lastMessage={room.lastMsg?.content}
74+
statusMessage="リクエスト中 メッセージを送りましょう!"
75+
/>
76+
</Box>
77+
);
78+
}
79+
// if (room.matchingStatus === "matched")
6480
return (
6581
<Box
6682
key={room.friendId}

web/components/chat/RoomWindow.tsx

Lines changed: 37 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,15 @@ export function RoomWindow(props: Props) {
158158

159159
return (
160160
<>
161-
{!room.isFriend && (
161+
{room.matchingStatus !== "matched" && (
162162
<FloatingMessage
163-
message="この人とはマッチングしていません。"
163+
message={
164+
room.matchingStatus === "myRequest"
165+
? "この人とはマッチングしていません。最初の挨拶をしましょう。"
166+
: "この人とはマッチングしていません。"
167+
}
164168
friendId={friendId}
169+
showButtons={room.matchingStatus === "otherRequest"}
165170
/>
166171
)}
167172

@@ -258,11 +263,17 @@ export function RoomWindow(props: Props) {
258263

259264
type FloatingMessageProps = {
260265
message: string;
261-
friendId: UserID;
266+
friendId: number;
267+
showButtons: boolean;
262268
};
263269

264-
const FloatingMessage = ({ message, friendId }: FloatingMessageProps) => {
270+
const FloatingMessage = ({
271+
message,
272+
friendId,
273+
showButtons,
274+
}: FloatingMessageProps) => {
265275
const router = useRouter();
276+
266277
return (
267278
<div
268279
className="fixed inset-0 z-50 flex items-center justify-center"
@@ -277,24 +288,28 @@ const FloatingMessage = ({ message, friendId }: FloatingMessageProps) => {
277288
}}
278289
>
279290
<p>{message}</p>
280-
{/* biome-ignore lint/a11y/useButtonType: <explanation> */}
281-
<button
282-
className="btn btn-success btn-sm"
283-
onClick={() => {
284-
request.accept(friendId).then(() => router.push("/chat"));
285-
}}
286-
>
287-
承認
288-
</button>
289-
{/* biome-ignore lint/a11y/useButtonType: <explanation> */}
290-
<button
291-
className="btn btn-error btn-sm"
292-
onClick={() => {
293-
request.reject(friendId).then(() => router.push("/chat"));
294-
}}
295-
>
296-
拒否
297-
</button>
291+
{showButtons && (
292+
<div className="mt-4 space-x-4">
293+
{/* biome-ignore lint/a11y/useButtonType: <explanation> */}
294+
<button
295+
className="btn btn-success btn-sm"
296+
onClick={() => {
297+
request.accept(friendId).then(() => router.push("/chat"));
298+
}}
299+
>
300+
承認
301+
</button>
302+
{/* biome-ignore lint/a11y/useButtonType: <explanation> */}
303+
<button
304+
className="btn btn-error btn-sm"
305+
onClick={() => {
306+
request.reject(friendId).then(() => router.push("/chat"));
307+
}}
308+
>
309+
拒否
310+
</button>
311+
</div>
312+
)}
298313
</div>
299314
</div>
300315
);

0 commit comments

Comments
 (0)