From 5fd5dd2454252a7cd617c9b9690ebb35344d560c Mon Sep 17 00:00:00 2001 From: nakomochi Date: Tue, 29 Jul 2025 00:38:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E8=BF=94=E4=BF=A1=E3=81=AE=E8=A1=A8?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/chat/MessageList.svelte | 16 ++++++++++++++++ packages/convex/src/convex/schema.ts | 1 + 2 files changed, 17 insertions(+) diff --git a/packages/client/src/components/chat/MessageList.svelte b/packages/client/src/components/chat/MessageList.svelte index e9d86ed..78c3e52 100644 --- a/packages/client/src/components/chat/MessageList.svelte +++ b/packages/client/src/components/chat/MessageList.svelte @@ -12,6 +12,11 @@ const messages = useQuery(api.messages.list, () => ({ channelId, })); + + const messagesById = $derived( + new Map(messages.data?.map((message) => [message._id, message])), + ); + let messagesContainer: HTMLDivElement; function formatTime(timestamp: number) { @@ -41,6 +46,17 @@
{#if messages.data} {#each messages.data as message (message._id)} + {#if message.parentId && messages.data.find((m) => m._id === message.parentId)} +
+ 返信 + {messagesById.get(message.parentId)?.author} + + {messagesById.get(message.parentId)?.content} + +
+ {/if}
{message.author} diff --git a/packages/convex/src/convex/schema.ts b/packages/convex/src/convex/schema.ts index 3c8f617..f7b09c4 100644 --- a/packages/convex/src/convex/schema.ts +++ b/packages/convex/src/convex/schema.ts @@ -17,5 +17,6 @@ export default defineSchema({ content: v.string(), author: v.string(), createdAt: v.number(), + parentId: v.optional(v.id("messages")), }).index("by_channel", ["channelId"]), }); From 21ff30154480a35f0983ca89ee36b0f7eec1f0b4 Mon Sep 17 00:00:00 2001 From: nakomochi Date: Thu, 31 Jul 2025 17:53:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E8=BF=94=E4=BF=A1=E4=BB=98=E3=81=8D?= =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AE=E9=80=81?= =?UTF-8?q?=E4=BF=A1=E3=83=BBUI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/components/chat/Channel.svelte | 7 ++++-- .../src/components/chat/MessageInput.svelte | 14 +++++++++++- .../src/components/chat/MessageList.svelte | 22 +++++++++++++++++-- packages/convex/src/convex/messages.ts | 2 ++ 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/client/src/components/chat/Channel.svelte b/packages/client/src/components/chat/Channel.svelte index 671c578..3ac3653 100644 --- a/packages/client/src/components/chat/Channel.svelte +++ b/packages/client/src/components/chat/Channel.svelte @@ -1,5 +1,6 @@
@@ -26,5 +29,5 @@ {/if}
- - + + diff --git a/packages/client/src/components/chat/MessageInput.svelte b/packages/client/src/components/chat/MessageInput.svelte index bb9b390..788a8c4 100644 --- a/packages/client/src/components/chat/MessageInput.svelte +++ b/packages/client/src/components/chat/MessageInput.svelte @@ -1,12 +1,14 @@
+ {#if replyingTo} +
+ 返信先: + {replyingTo.author} + {replyingTo.content} +
+ {/if} +
import { api, type Id } from "@packages/convex"; + import type { Doc } from "@packages/convex/src/convex/_generated/dataModel"; import { useQuery } from "convex-svelte"; import { onMount } from "svelte"; interface Props { channelId: Id<"channels">; + replyingTo: Doc<"messages"> | null; } - const { channelId }: Props = $props(); + let { channelId, replyingTo = $bindable() }: Props = $props(); const messages = useQuery(api.messages.list, () => ({ channelId, @@ -57,7 +59,7 @@
{/if} -
+
{message.author} @@ -67,6 +69,22 @@
{message.content}
+
+ +
{:else}
diff --git a/packages/convex/src/convex/messages.ts b/packages/convex/src/convex/messages.ts index 640a59b..a6e4837 100644 --- a/packages/convex/src/convex/messages.ts +++ b/packages/convex/src/convex/messages.ts @@ -17,6 +17,7 @@ export const send = mutation({ channelId: v.id("channels"), content: v.string(), author: v.string(), + parentId: v.optional(v.id("messages")), }, handler: async (ctx, args) => { await ctx.db.insert("messages", { @@ -24,6 +25,7 @@ export const send = mutation({ content: args.content, author: args.author, createdAt: Date.now(), + parentId: args.parentId, }); }, });