From c04805f4a577358309a2f247884f813b64fa6741 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Wed, 13 Aug 2025 21:34:13 +0900 Subject: [PATCH 01/11] =?UTF-8?q?=E3=83=A1=E3=83=83=E3=82=BB=E3=83=BC?= =?UTF-8?q?=E3=82=B8=E3=81=AB=E3=83=9B=E3=83=90=E3=83=BC=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=81=A8=E3=81=8D=E3=81=AB=E8=89=B2=E3=81=8C=E5=A4=89=E3=82=8F?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=80=81=E5=8F=B3?= =?UTF-8?q?=E3=82=AF=E3=83=AA=E3=83=83=E3=82=AF=E3=81=A7=E3=83=89=E3=83=AD?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=83=80=E3=82=A6=E3=83=B3=E3=83=A1=E3=83=8B?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E3=82=92=E5=87=BA=E3=81=9B=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/chat/MessageDropdown.svelte | 20 ++++ .../src/components/chat/MessageList.svelte | 98 ++++++++++++------- 2 files changed, 84 insertions(+), 34 deletions(-) create mode 100644 packages/client/src/components/chat/MessageDropdown.svelte diff --git a/packages/client/src/components/chat/MessageDropdown.svelte b/packages/client/src/components/chat/MessageDropdown.svelte new file mode 100644 index 0000000..ac7578e --- /dev/null +++ b/packages/client/src/components/chat/MessageDropdown.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/client/src/components/chat/MessageList.svelte b/packages/client/src/components/chat/MessageList.svelte index 71398bf..bddf32f 100644 --- a/packages/client/src/components/chat/MessageList.svelte +++ b/packages/client/src/components/chat/MessageList.svelte @@ -3,6 +3,7 @@ import type { Doc } from "@packages/convex/src/convex/_generated/dataModel"; import { useQuery } from "convex-svelte"; import { onMount } from "svelte"; + import MessageDropdown from "./MessageDropdown.svelte"; interface Props { channelId: Id<"channels">; @@ -43,46 +44,75 @@ onMount(() => { scrollToBottom(); }); + + let clientX = $state(0); + let clientY = $state(0); + let onclick_dropdown_reply = $state(() => {}); + let visible_dropdown = $state(false); + document.addEventListener("click", () => { + visible_dropdown = false; + });
+ {#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} - - {formatTime(message.createdAt)} - -
-
- {message.content} -
-
- + {/if} +
+
+ {message.author} + + {formatTime(message.createdAt)} + +
+
+ {message.content} +
+
+
From 9bf5f7899a7ed6aed6a1a95f8d8593ca673a39f8 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Thu, 14 Aug 2025 17:50:12 +0900 Subject: [PATCH 02/11] =?UTF-8?q?=E3=82=AD=E3=83=A3=E3=83=A1=E3=83=AB?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=81=AB=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?snippet=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=9F=E5=AE=9F?= =?UTF-8?q?=E8=A3=85=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/chat/MessageDropdown.svelte | 22 +++++-------- .../src/components/chat/MessageList.svelte | 33 +++++++++++-------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/packages/client/src/components/chat/MessageDropdown.svelte b/packages/client/src/components/chat/MessageDropdown.svelte index ac7578e..41a37f8 100644 --- a/packages/client/src/components/chat/MessageDropdown.svelte +++ b/packages/client/src/components/chat/MessageDropdown.svelte @@ -1,20 +1,16 @@ - +{#if visible} +
+ {@render children()} +
+{/if} diff --git a/packages/client/src/components/chat/MessageList.svelte b/packages/client/src/components/chat/MessageList.svelte index bddf32f..214b1ca 100644 --- a/packages/client/src/components/chat/MessageList.svelte +++ b/packages/client/src/components/chat/MessageList.svelte @@ -47,22 +47,32 @@ let clientX = $state(0); let clientY = $state(0); - let onclick_dropdown_reply = $state(() => {}); - let visible_dropdown = $state(false); + let visibleDropdown = $state | null>(null); document.addEventListener("click", () => { - visible_dropdown = false; + visibleDropdown = null; });
- {#if messages.data} {#each messages.data as message (message._id)} + {#snippet dropdownContent()} + + {/snippet} + + {@render dropdownContent()} + +
{ - replyingTo = message; - }; + visibleDropdown = message._id; }} > {#if message.parentId && messages.data.find((m) => m._id === message.parentId)} From 851e6231436c31045ec3c71aebb9c77a6debcd13 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Mon, 8 Sep 2025 12:31:06 +0900 Subject: [PATCH 03/11] =?UTF-8?q?=E5=80=8B=E4=BA=BA=E7=94=A8=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=AE=E7=94=BB=E9=9D=A2=E3=81=AB=E9=A3=9B=E3=81=B9?= =?UTF-8?q?=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=EF=BC=88?= =?UTF-8?q?=E4=B8=AD=E8=BA=AB=E3=81=AF=E3=81=BE=E3=81=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/chat/ChannelList.svelte | 17 ++++++++-- .../client/src/components/chat/ChatApp.svelte | 32 +++++++++++-------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/packages/client/src/components/chat/ChannelList.svelte b/packages/client/src/components/chat/ChannelList.svelte index ba79353..fbe0363 100644 --- a/packages/client/src/components/chat/ChannelList.svelte +++ b/packages/client/src/components/chat/ChannelList.svelte @@ -4,9 +4,13 @@ interface Props { selectedChannelId?: Id<"channels">; + screenMode: string; } - let { selectedChannelId = $bindable(undefined) }: Props = $props(); + let { + selectedChannelId = $bindable(undefined), + screenMode = $bindable(), + }: Props = $props(); const convex = useConvexClient(); const channels = useQuery(api.channels.list, () => ({})); @@ -37,7 +41,10 @@ ? "bg-primary text-primary-content" : "hover:bg-base-300", ].join(" ")} - onclick={() => (selectedChannelId = channel._id)} + onclick={() => { + selectedChannelId = channel._id; + screenMode = "chat"; + }} >
# {channel.name}
{#if channel.description} @@ -51,4 +58,10 @@
{/if}
+
diff --git a/packages/client/src/components/chat/ChatApp.svelte b/packages/client/src/components/chat/ChatApp.svelte index 870e977..997686d 100644 --- a/packages/client/src/components/chat/ChatApp.svelte +++ b/packages/client/src/components/chat/ChatApp.svelte @@ -4,25 +4,29 @@ import ChannelList from "./ChannelList.svelte"; let selectedChannelId = $state | undefined>(undefined); + let screenMode = $state("chat");
- - +
- {#if selectedChannelId} - - {:else} -
-
-

- チャットアプリへようこそ -

-

- 左からチャンネルを選択して会話を始めましょう -

+ {#if screenMode == "chat"} + {#if selectedChannelId} + + {:else} +
+
+

+ チャットアプリへようこそ +

+

+ 左からチャンネルを選択して会話を始めましょう +

+
-
+ {/if} + {:else if screenMode == "personalization"} +

個人用設定

{/if}
From 9154ed624e9314f436c311f6ed88179a290d9b3a Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Tue, 9 Sep 2025 10:28:40 +0900 Subject: [PATCH 04/11] =?UTF-8?q?=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E5=A4=89=E6=9B=B4=E3=81=8C=E3=81=A7=E3=81=8D=E3=81=9D=E3=81=86?= =?UTF-8?q?=E3=81=AA=E7=94=BB=E9=9D=A2=E3=81=AB=E3=81=AA=E3=81=A3=E3=81=9F?= =?UTF-8?q?=E3=81=91=E3=81=A9=E3=81=BE=E3=81=A0=E3=81=A7=E3=81=8D=E3=81=AA?= =?UTF-8?q?=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/components/chat/ChatApp.svelte | 3 +- .../components/chat/Personalization.svelte | 71 +++++++++++++++++++ packages/convex/src/convex/personalization.ts | 17 +++++ 3 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 packages/client/src/components/chat/Personalization.svelte create mode 100644 packages/convex/src/convex/personalization.ts diff --git a/packages/client/src/components/chat/ChatApp.svelte b/packages/client/src/components/chat/ChatApp.svelte index 997686d..d60b1a9 100644 --- a/packages/client/src/components/chat/ChatApp.svelte +++ b/packages/client/src/components/chat/ChatApp.svelte @@ -2,6 +2,7 @@ import { type Id } from "@packages/convex"; import Channel from "./Channel.svelte"; import ChannelList from "./ChannelList.svelte"; + import Personalization from "./Personalization.svelte"; let selectedChannelId = $state | undefined>(undefined); let screenMode = $state("chat"); @@ -26,7 +27,7 @@
{/if} {:else if screenMode == "personalization"} -

個人用設定

+ {/if}
diff --git a/packages/client/src/components/chat/Personalization.svelte b/packages/client/src/components/chat/Personalization.svelte new file mode 100644 index 0000000..59d5893 --- /dev/null +++ b/packages/client/src/components/chat/Personalization.svelte @@ -0,0 +1,71 @@ + + +

アイコンの変更

+
+
+

変更前

+ googleアイコン +
+ {#if changedImage} +
+

変更後

+ 変更後 +
+ {/if} +
+ { + const input = event.target as HTMLInputElement; + const file = input.files?.[0]; + if (file) { + changedImage = URL.createObjectURL(file); + } + }} +/> +

名前の変更

+
+
+

変更前

+

{userName}

+
+
+

変更後

+ +
+
+ + diff --git a/packages/convex/src/convex/personalization.ts b/packages/convex/src/convex/personalization.ts new file mode 100644 index 0000000..3d7fbbc --- /dev/null +++ b/packages/convex/src/convex/personalization.ts @@ -0,0 +1,17 @@ +import { getAuthUserId } from "@convex-dev/auth/server"; +import { v } from "convex/values"; +import { mutation } from "./_generated/server"; + +export const save = mutation({ + args: { + name: v.string(), + }, + handler: async (ctx, args) => { + const userId = await getAuthUserId(ctx); + if (userId !== null) { + if (args.name !== "") { + await ctx.db.patch(userId, { name: args.name }); + } + } + }, +}); From d12a2853c029ab2f8039f541a91d593c785fa0d4 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Tue, 9 Sep 2025 16:03:38 +0900 Subject: [PATCH 05/11] =?UTF-8?q?=E3=82=A2=E3=82=A4=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=81=AE=E5=86=99=E7=9C=9F=E3=81=A8=E5=90=8D=E5=89=8D=E3=82=92?= =?UTF-8?q?=E5=A4=89=E3=81=88=E3=82=89=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/chat/Personalization.svelte | 69 ++++++++++++++-- packages/convex/src/convex/personalization.ts | 79 ++++++++++++++++++- packages/convex/src/convex/schema.ts | 5 ++ 3 files changed, 142 insertions(+), 11 deletions(-) diff --git a/packages/client/src/components/chat/Personalization.svelte b/packages/client/src/components/chat/Personalization.svelte index 59d5893..0557b7c 100644 --- a/packages/client/src/components/chat/Personalization.svelte +++ b/packages/client/src/components/chat/Personalization.svelte @@ -1,21 +1,75 @@ @@ -46,6 +100,7 @@ const file = input.files?.[0]; if (file) { changedImage = URL.createObjectURL(file); + changedImageFile = file; } }} /> diff --git a/packages/convex/src/convex/personalization.ts b/packages/convex/src/convex/personalization.ts index 3d7fbbc..6680677 100644 --- a/packages/convex/src/convex/personalization.ts +++ b/packages/convex/src/convex/personalization.ts @@ -1,17 +1,88 @@ import { getAuthUserId } from "@convex-dev/auth/server"; import { v } from "convex/values"; -import { mutation } from "./_generated/server"; +import { mutation, query } from "./_generated/server"; export const save = mutation({ args: { name: v.string(), }, + handler: async (ctx, args: { name: string }): Promise => { + const userId = await getAuthUserId(ctx); + if (userId) { + const data = await ctx.db + .query("personalization") + .filter((q) => q.eq(q.field("userId"), userId)) + .unique(); + + if (data) { + await ctx.db.patch(data._id, { + nickname: args.name, + }); + } else { + await ctx.db.insert("personalization", { + userId: userId, + nickname: args.name, + icon: null, + }); + } + } + }, +}); + +export const generateUploadUrl = mutation({ + handler: async (ctx) => { + return await ctx.storage.generateUploadUrl(); + }, +}); + +export const saveImage = mutation({ + args: { + icon: v.id("_storage"), + }, handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); - if (userId !== null) { - if (args.name !== "") { - await ctx.db.patch(userId, { name: args.name }); + if (userId) { + const data = await ctx.db + .query("personalization") + .filter((q) => q.eq(q.field("userId"), userId)) + .unique(); + + if (data) { + if (data.icon) { + await ctx.storage.delete(data.icon); + } + await ctx.db.patch(data._id, { + icon: args.icon, + }); + } else { + await ctx.db.insert("personalization", { + userId: userId, + nickname: "", + icon: args.icon, + }); } } }, }); + +export const getPersonalization = query({ + handler: async (ctx) => { + const userId = await getAuthUserId(ctx); + if (userId) { + const user = await ctx.db + .query("personalization") + .filter((q) => q.eq(q.field("userId"), userId)) + .unique(); + if (user) { + return await ctx.db.get(user._id); + } + } + }, +}); + +export const getImageUrl = mutation({ + args: { storageId: v.id("_storage") }, + handler: async (ctx, args) => { + return await ctx.storage.getUrl(args.storageId); + }, +}); diff --git a/packages/convex/src/convex/schema.ts b/packages/convex/src/convex/schema.ts index 777bb6e..ccacffe 100644 --- a/packages/convex/src/convex/schema.ts +++ b/packages/convex/src/convex/schema.ts @@ -20,5 +20,10 @@ export default defineSchema({ createdAt: v.number(), parentId: v.optional(v.id("messages")), }).index("by_channel", ["channelId"]), + personalization: defineTable({ + userId: v.id("users"), + nickname: v.string(), + icon: v.union(v.id("_storage"), v.null()), + }), ...authTables, }); From 98f08a21c9902f53866d128199bd2b64a83be87f Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Tue, 9 Sep 2025 16:13:29 +0900 Subject: [PATCH 06/11] =?UTF-8?q?=E6=80=AA=E3=81=97=E3=81=84=E6=94=B9?= =?UTF-8?q?=E8=A1=8C=E3=82=92=E7=9B=B4=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/chat/Personalization.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/client/src/components/chat/Personalization.svelte b/packages/client/src/components/chat/Personalization.svelte index 0557b7c..58b39fe 100644 --- a/packages/client/src/components/chat/Personalization.svelte +++ b/packages/client/src/components/chat/Personalization.svelte @@ -121,6 +121,4 @@ - + From b0bd850b178aecf498d1af48bff74d2a3ecf8cd3 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Tue, 9 Sep 2025 23:42:03 +0900 Subject: [PATCH 07/11] =?UTF-8?q?=E5=9E=8B=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/chat/ChannelList.svelte | 13 ++++++------- .../client/src/components/chat/ChatApp.svelte | 16 +++++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/client/src/components/chat/ChannelList.svelte b/packages/client/src/components/chat/ChannelList.svelte index fbe0363..ceac73f 100644 --- a/packages/client/src/components/chat/ChannelList.svelte +++ b/packages/client/src/components/chat/ChannelList.svelte @@ -2,13 +2,13 @@ import { api, type Id } from "@packages/convex"; import { useConvexClient, useQuery } from "convex-svelte"; + type Selection = {type: "chat", selectedChannelId: Id<"channels"> | undefined} | {type: "personalization", selectedChannelId: undefined}; + interface Props { - selectedChannelId?: Id<"channels">; - screenMode: string; + screenMode: Selection; } let { - selectedChannelId = $bindable(undefined), screenMode = $bindable(), }: Props = $props(); @@ -37,13 +37,12 @@ diff --git a/packages/client/src/components/chat/ChatApp.svelte b/packages/client/src/components/chat/ChatApp.svelte index d60b1a9..7f983cb 100644 --- a/packages/client/src/components/chat/ChatApp.svelte +++ b/packages/client/src/components/chat/ChatApp.svelte @@ -4,16 +4,18 @@ import ChannelList from "./ChannelList.svelte"; import Personalization from "./Personalization.svelte"; - let selectedChannelId = $state | undefined>(undefined); - let screenMode = $state("chat"); + type Selection = {type: "chat", selectedChannelId: Id<"channels"> | undefined} | {type: "personalization", selectedChannelId: undefined}; + + //let selectedChannelId = $state | undefined>(undefined); + let screenMode = $state({type: "chat", selectedChannelId: undefined});
- +
- {#if screenMode == "chat"} - {#if selectedChannelId} - + {#if screenMode.type == "chat"} + {#if screenMode.selectedChannelId} + {:else}
@@ -26,7 +28,7 @@
{/if} - {:else if screenMode == "personalization"} + {:else if screenMode.type == "personalization"} {/if}
From 17f81c6b389c8ffb848b0ed968a5dbf33d118931 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Tue, 9 Sep 2025 23:43:17 +0900 Subject: [PATCH 08/11] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/chat/ChatApp.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/client/src/components/chat/ChatApp.svelte b/packages/client/src/components/chat/ChatApp.svelte index 7f983cb..e079d19 100644 --- a/packages/client/src/components/chat/ChatApp.svelte +++ b/packages/client/src/components/chat/ChatApp.svelte @@ -6,7 +6,6 @@ type Selection = {type: "chat", selectedChannelId: Id<"channels"> | undefined} | {type: "personalization", selectedChannelId: undefined}; - //let selectedChannelId = $state | undefined>(undefined); let screenMode = $state({type: "chat", selectedChannelId: undefined}); From fba6133c1ad737c04cc12cd548760d31af47e62f Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Wed, 10 Sep 2025 12:42:20 +0900 Subject: [PATCH 09/11] =?UTF-8?q?=E3=81=A8=E3=82=8A=E3=81=82=E3=81=88?= =?UTF-8?q?=E3=81=9A=E3=82=B3=E3=83=B3=E3=83=95=E3=83=AA=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=82=92=E7=9B=B4=E3=81=97=E3=81=A6=E8=87=AA=E5=88=86=E3=81=8C?= =?UTF-8?q?=E4=BD=9C=E3=81=A3=E3=81=9F=E6=A9=9F=E8=83=BD=E3=81=8C=E4=BD=BF?= =?UTF-8?q?=E3=81=88=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/components/app/ChatApp.svelte | 12 +++++++++--- .../src/components/channels/ChannelList.svelte | 6 +++--- .../organization/OrganizationSelector.svelte | 2 +- packages/client/src/routes/orgs/[orgId]/+page.svelte | 2 +- .../routes/orgs/[orgId]/personalization/+page.svelte | 12 ++++++++++++ 5 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte diff --git a/packages/client/src/components/app/ChatApp.svelte b/packages/client/src/components/app/ChatApp.svelte index c554f1f..d143a8b 100644 --- a/packages/client/src/components/app/ChatApp.svelte +++ b/packages/client/src/components/app/ChatApp.svelte @@ -22,7 +22,7 @@
-
+
@@ -80,11 +80,17 @@ {organizationId} bind:screenMode={ () => screenMode, - (id) => { - goto(`/orgs/${organizationId}/chat/${id}`); + (screenMode) => { + if(screenMode.type === "chat"){ + goto(`/orgs/${organizationId}/chat/${screenMode.selectedChannelId}`); + } + else if(screenMode.type === "personalization"){ + goto(`/orgs/${organizationId}/personalization`); + } } } /> +
diff --git a/packages/client/src/components/channels/ChannelList.svelte b/packages/client/src/components/channels/ChannelList.svelte index 5348d3d..0850e8b 100644 --- a/packages/client/src/components/channels/ChannelList.svelte +++ b/packages/client/src/components/channels/ChannelList.svelte @@ -27,7 +27,7 @@ })); -
+

チャンネル

@@ -69,6 +69,6 @@ class="btn btn-primary mt-auto mb-2 w-full" onclick={() => { screenMode = {type: "personalization", selectedChannelId: undefined}; - }}>個人用設定 + }} + >個人用設定
diff --git a/packages/client/src/components/organization/OrganizationSelector.svelte b/packages/client/src/components/organization/OrganizationSelector.svelte index 9c3dc1a..5d3e4b0 100644 --- a/packages/client/src/components/organization/OrganizationSelector.svelte +++ b/packages/client/src/components/organization/OrganizationSelector.svelte @@ -54,7 +54,7 @@ {#if organizations.data && organizations.data.length === 0}

参加している組織がありません

- + 新しい組織を作成
diff --git a/packages/client/src/routes/orgs/[orgId]/+page.svelte b/packages/client/src/routes/orgs/[orgId]/+page.svelte index 47437e0..124d49e 100644 --- a/packages/client/src/routes/orgs/[orgId]/+page.svelte +++ b/packages/client/src/routes/orgs/[orgId]/+page.svelte @@ -6,4 +6,4 @@ const orgId = $derived(page.params.orgId as Id<"organizations">); - + diff --git a/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte b/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte new file mode 100644 index 0000000..d65b54f --- /dev/null +++ b/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte @@ -0,0 +1,12 @@ + + +} + screenMode={{type:"personalization", selectedChannelId :undefined}} +/> \ No newline at end of file From 297614ca18966227d4eacc07594ded093abe7cc5 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Wed, 10 Sep 2025 13:22:37 +0900 Subject: [PATCH 10/11] =?UTF-8?q?=E7=B5=84=E7=B9=94=E3=81=94=E3=81=A8?= =?UTF-8?q?=E3=81=AB=E5=90=8D=E5=89=8D=E3=81=A8=E3=82=A2=E3=82=A4=E3=82=B3?= =?UTF-8?q?=E3=83=B3=E3=82=92=E8=A8=AD=E5=AE=9A=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F=EF=BC=88=E3=81=A4?= =?UTF-8?q?=E3=82=82=E3=82=8A=E3=81=A0=E3=81=8C=E3=80=81=E7=B5=84=E7=B9=94?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=81=AE=E4=BB=95=E6=96=B9=E3=81=8C?= =?UTF-8?q?=E5=88=86=E3=81=8B=E3=82=89=E3=81=AA=E3=81=84=E3=81=9F=E3=82=81?= =?UTF-8?q?=E8=A9=A6=E3=81=9B=E3=81=AA=E3=81=8B=E3=81=A3=E3=81=9F=E3=80=82?= =?UTF-8?q?=E3=82=82=E3=81=97=E3=81=8B=E3=81=97=E3=81=9F=E3=82=89=E4=BD=95?= =?UTF-8?q?=E3=81=8B=E7=A0=B4=E5=A3=8A=E3=81=97=E3=81=A1=E3=82=83=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=82=8B=E3=81=8B=E3=82=82=E3=81=97=E3=82=8C?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=80=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/src/components/app/ChatApp.svelte | 19 ++++++++++--------- .../components/chat/Personalization.svelte | 14 +++++++++++--- packages/convex/src/convex/personalization.ts | 18 +++++++++++++----- packages/convex/src/convex/schema.ts | 1 + 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/packages/client/src/components/app/ChatApp.svelte b/packages/client/src/components/app/ChatApp.svelte index d143a8b..b7a5fe9 100644 --- a/packages/client/src/components/app/ChatApp.svelte +++ b/packages/client/src/components/app/ChatApp.svelte @@ -6,8 +6,9 @@ import ChannelList from "../channels/ChannelList.svelte"; import Personalization from "../chat/Personalization.svelte"; - type Selection = {type: "chat", selectedChannelId: Id<"channels"> | undefined} | {type: "personalization", selectedChannelId: undefined}; - + type Selection = + | { type: "chat"; selectedChannelId: Id<"channels"> | undefined } + | { type: "personalization"; selectedChannelId: undefined }; interface Props { organizationId: Id<"organizations">; @@ -22,7 +23,7 @@
-
+
@@ -81,16 +82,16 @@ bind:screenMode={ () => screenMode, (screenMode) => { - if(screenMode.type === "chat"){ - goto(`/orgs/${organizationId}/chat/${screenMode.selectedChannelId}`); - } - else if(screenMode.type === "personalization"){ + if (screenMode.type === "chat") { + goto( + `/orgs/${organizationId}/chat/${screenMode.selectedChannelId}`, + ); + } else if (screenMode.type === "personalization") { goto(`/orgs/${organizationId}/personalization`); } } } /> -
@@ -110,7 +111,7 @@
{/if} {:else if screenMode.type == "personalization"} - + {/if}
diff --git a/packages/client/src/components/chat/Personalization.svelte b/packages/client/src/components/chat/Personalization.svelte index 58b39fe..98718d3 100644 --- a/packages/client/src/components/chat/Personalization.svelte +++ b/packages/client/src/components/chat/Personalization.svelte @@ -2,10 +2,14 @@ import { api, type Id } from "@packages/convex"; import { useConvexClient, useQuery } from "convex-svelte"; + const { organizationId }: { organizationId: Id<"organizations"> } = $props(); + const convex = useConvexClient(); const identity = useQuery(api.users.me, {}); - const personalization = useQuery(api.personalization.getPersonalization, {}); + const personalization = useQuery(api.personalization.getPersonalization, { + organizationId: organizationId, + }); let iconURL = $state(""); let imageURL = $derived(iconURL || identity.data?.image); let userName = $derived( @@ -50,7 +54,8 @@ changedImageFile = undefined; if (changedUserName?.trim() && !(userName === changedUserName)) { await convex.mutation(api.personalization.save, { - name: changedUserName, + nickName: changedUserName, + organizationId: organizationId, }); } if (image) { @@ -68,6 +73,7 @@ await convex.mutation(api.personalization.saveImage, { icon: storageId, + organizationId: organizationId, }); } } @@ -121,4 +127,6 @@
- + diff --git a/packages/convex/src/convex/personalization.ts b/packages/convex/src/convex/personalization.ts index 6680677..96384b0 100644 --- a/packages/convex/src/convex/personalization.ts +++ b/packages/convex/src/convex/personalization.ts @@ -4,24 +4,27 @@ import { mutation, query } from "./_generated/server"; export const save = mutation({ args: { - name: v.string(), + nickName: v.string(), + organizationId: v.id("organizations"), }, - handler: async (ctx, args: { name: string }): Promise => { + handler: async (ctx, args): Promise => { const userId = await getAuthUserId(ctx); if (userId) { const data = await ctx.db .query("personalization") .filter((q) => q.eq(q.field("userId"), userId)) + .filter((q) => q.eq(q.field("organizationId"), args.organizationId)) .unique(); if (data) { await ctx.db.patch(data._id, { - nickname: args.name, + nickname: args.nickName, }); } else { await ctx.db.insert("personalization", { userId: userId, - nickname: args.name, + organizationId: args.organizationId, + nickname: args.nickName, icon: null, }); } @@ -38,6 +41,7 @@ export const generateUploadUrl = mutation({ export const saveImage = mutation({ args: { icon: v.id("_storage"), + organizationId: v.id("organizations"), }, handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); @@ -45,6 +49,7 @@ export const saveImage = mutation({ const data = await ctx.db .query("personalization") .filter((q) => q.eq(q.field("userId"), userId)) + .filter((q) => q.eq(q.field("organizationId"), args.organizationId)) .unique(); if (data) { @@ -58,6 +63,7 @@ export const saveImage = mutation({ await ctx.db.insert("personalization", { userId: userId, nickname: "", + organizationId: args.organizationId, icon: args.icon, }); } @@ -66,12 +72,14 @@ export const saveImage = mutation({ }); export const getPersonalization = query({ - handler: async (ctx) => { + args: { organizationId: v.id("organizations") }, + handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); if (userId) { const user = await ctx.db .query("personalization") .filter((q) => q.eq(q.field("userId"), userId)) + .filter((q) => q.eq(q.field("organizationId"), args.organizationId)) .unique(); if (user) { return await ctx.db.get(user._id); diff --git a/packages/convex/src/convex/schema.ts b/packages/convex/src/convex/schema.ts index fedd3bf..944ea15 100644 --- a/packages/convex/src/convex/schema.ts +++ b/packages/convex/src/convex/schema.ts @@ -42,6 +42,7 @@ export default defineSchema({ }).index("by_channel", ["channelId"]), personalization: defineTable({ userId: v.id("users"), + organizationId: v.id("organizations"), nickname: v.string(), icon: v.union(v.id("_storage"), v.null()), }), From afe590a5a27e486e518e243248d55d7e33718438 Mon Sep 17 00:00:00 2001 From: Kanata844 Date: Wed, 10 Sep 2025 13:26:46 +0900 Subject: [PATCH 11/11] =?UTF-8?q?add=E5=B8=82=E5=BF=98=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=9F=E3=81=BF=E3=81=9F=E3=81=84=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/client/src/app.html | 22 +++++++++---------- .../components/channels/ChannelList.svelte | 17 +++++++------- .../organization/OrganizationSelector.svelte | 4 +--- .../src/routes/orgs/[orgId]/+page.svelte | 5 ++++- .../[orgId]/chat/[channelId]/+page.svelte | 2 +- .../orgs/[orgId]/personalization/+page.svelte | 4 ++-- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/packages/client/src/app.html b/packages/client/src/app.html index 3b193fc..c808a7f 100644 --- a/packages/client/src/app.html +++ b/packages/client/src/app.html @@ -1,15 +1,13 @@ + + + + + %sveltekit.head% + - - - - - %sveltekit.head% - - - -
%sveltekit.body%
- - - \ No newline at end of file + +
%sveltekit.body%
+ + diff --git a/packages/client/src/components/channels/ChannelList.svelte b/packages/client/src/components/channels/ChannelList.svelte index 0850e8b..d5a3331 100644 --- a/packages/client/src/components/channels/ChannelList.svelte +++ b/packages/client/src/components/channels/ChannelList.svelte @@ -3,10 +3,11 @@ import { useQuery } from "convex-svelte"; import CreateChannelButton from "./CreateChannelButton.svelte"; - type Selection = {type: "chat", selectedChannelId: Id<"channels"> | undefined} | {type: "personalization", selectedChannelId: undefined}; + type Selection = + | { type: "chat"; selectedChannelId: Id<"channels"> | undefined } + | { type: "personalization"; selectedChannelId: undefined }; - -/*<<<<<<< HEAD:packages/client/src/components/chat/ChannelList.svelte + /*<<<<<<< HEAD:packages/client/src/components/chat/ChannelList.svelte screenMode: Selection; } @@ -27,7 +28,7 @@ })); -
+

チャンネル

@@ -44,7 +45,7 @@ : "hover:bg-base-300", ].join(" ")} onclick={() => { - screenMode = {type: "chat", selectedChannelId: channel._id} + screenMode = { type: "chat", selectedChannelId: channel._id }; }} >
# {channel.name}
@@ -68,7 +69,7 @@ + screenMode = { type: "personalization", selectedChannelId: undefined }; + }}>個人用設定
diff --git a/packages/client/src/components/organization/OrganizationSelector.svelte b/packages/client/src/components/organization/OrganizationSelector.svelte index 5d3e4b0..776b34c 100644 --- a/packages/client/src/components/organization/OrganizationSelector.svelte +++ b/packages/client/src/components/organization/OrganizationSelector.svelte @@ -54,9 +54,7 @@ {#if organizations.data && organizations.data.length === 0}

参加している組織がありません

- - 新しい組織を作成 - + 新しい組織を作成
{/if}
diff --git a/packages/client/src/routes/orgs/[orgId]/+page.svelte b/packages/client/src/routes/orgs/[orgId]/+page.svelte index 124d49e..70162ea 100644 --- a/packages/client/src/routes/orgs/[orgId]/+page.svelte +++ b/packages/client/src/routes/orgs/[orgId]/+page.svelte @@ -6,4 +6,7 @@ const orgId = $derived(page.params.orgId as Id<"organizations">); - + diff --git a/packages/client/src/routes/orgs/[orgId]/chat/[channelId]/+page.svelte b/packages/client/src/routes/orgs/[orgId]/chat/[channelId]/+page.svelte index 86a4aae..e9e55a2 100644 --- a/packages/client/src/routes/orgs/[orgId]/chat/[channelId]/+page.svelte +++ b/packages/client/src/routes/orgs/[orgId]/chat/[channelId]/+page.svelte @@ -8,5 +8,5 @@ } - screenMode={{type:"chat", selectedChannelId :channelId as Id<"channels">}} + screenMode={{ type: "chat", selectedChannelId: channelId as Id<"channels"> }} /> diff --git a/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte b/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte index d65b54f..90afbd0 100644 --- a/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte +++ b/packages/client/src/routes/orgs/[orgId]/personalization/+page.svelte @@ -8,5 +8,5 @@ } - screenMode={{type:"personalization", selectedChannelId :undefined}} -/> \ No newline at end of file + screenMode={{ type: "personalization", selectedChannelId: undefined }} +/>