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 1535a0e..9ca383c 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, })); + + const messagesById = $derived( + new Map(messages.data?.map((message) => [message._id, message])), + ); + let messagesContainer: HTMLDivElement; function formatTime(timestamp: number) { @@ -41,7 +48,18 @@
{#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} @@ -51,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, }); }, }); diff --git a/packages/convex/src/convex/schema.ts b/packages/convex/src/convex/schema.ts index 4686109..777bb6e 100644 --- a/packages/convex/src/convex/schema.ts +++ b/packages/convex/src/convex/schema.ts @@ -18,6 +18,7 @@ export default defineSchema({ content: v.string(), author: v.string(), createdAt: v.number(), + parentId: v.optional(v.id("messages")), }).index("by_channel", ["channelId"]), ...authTables, });