From 43fc358b5037b012943b89a5834282fd6ea91bdc Mon Sep 17 00:00:00 2001 From: Christina Papadogianni <59121443+ChrisPdgn@users.noreply.github.com> Date: Thu, 3 Sep 2026 11:30:11 +0000 Subject: [PATCH 1/2] feat(chat): add invitation redirect URI fields Wire Chat admin settings to explicit_room_joins.redirect from Conduit #1512 so login/accept/decline URIs can be configured without treating {roomId} as an invalid URL. Co-authored-by: Christina Papadogianni --- src/components/chat/settings/settings.tsx | 24 ++++- src/components/chat/settings/settingsForm.tsx | 94 +++++++++++++++++++ src/lib/models/chat/settings.ts | 5 + 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/src/components/chat/settings/settings.tsx b/src/components/chat/settings/settings.tsx index 78f81edbe..883311081 100644 --- a/src/components/chat/settings/settings.tsx +++ b/src/components/chat/settings/settings.tsx @@ -33,6 +33,13 @@ const FormSchema = z.object({ enabled: z.boolean(), send_email: z.boolean(), send_notification: z.boolean(), + redirect: z + .object({ + login_uri: z.string().optional().default(''), + accept_uri: z.string().optional().default(''), + decline_uri: z.string().optional().default(''), + }) + .optional(), }), }); @@ -52,7 +59,18 @@ export const Settings = ({ const { save, isSaving } = useSettingsSave('Chat'); const form = useForm>({ resolver: rhfZodResolver(FormSchema), - defaultValues: data, + defaultValues: { + ...data, + explicit_room_joins: { + ...data.explicit_room_joins, + redirect: { + login_uri: '', + accept_uri: '', + decline_uri: '', + ...(data.explicit_room_joins?.redirect ?? {}), + }, + }, + }, }); useEffect(() => { @@ -73,7 +91,9 @@ export const Settings = ({ const handleSwitchChange = () => { addAlert({ title: 'Chat Module', - description: `Are you sure you want to ${chatModule ? 'disable' : 'enable'} Chat module?`, + description: `Are you sure you want to ${ + chatModule ? 'disable' : 'enable' + } Chat module?`, cancelText: 'Cancel', actionText: 'Proceed', onDecision: cancel => { diff --git a/src/components/chat/settings/settingsForm.tsx b/src/components/chat/settings/settingsForm.tsx index f2200b567..e657d7a11 100644 --- a/src/components/chat/settings/settingsForm.tsx +++ b/src/components/chat/settings/settingsForm.tsx @@ -1,10 +1,12 @@ import { FormControl, + FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; import { Switch } from '@/components/ui/switch'; import { useFormContext, useWatch } from 'react-hook-form'; import { cn } from '@/lib/utils'; @@ -180,6 +182,98 @@ export const SettingsForm = ({ /> +
+

+ Invitation Redirects +

+
+ ( + + + Login Redirect URI + + + + + + Absolute login page URL for unauthenticated email-link + clicks. Hook appends + ?redirectUri=...&answer=...&invitationToken=... Empty means + email clicks fail until configured. + + + + )} + /> + ( + + + Accept Redirect URI + + + + + + Post-accept destination. Supports {'{roomId}'} placeholder. + If empty, returns a JSON result. + + + + )} + /> + ( + + + Decline Redirect URI + + + + + + Post-decline destination. Supports {'{roomId}'} placeholder. + If empty, returns a JSON result. + + + + )} + /> +
+
Date: Thu, 3 Sep 2026 11:32:44 +0000 Subject: [PATCH 2/2] fix(chat): keep invitation redirect defaults type-safe Use equivalent empty-string fallbacks so TypeScript does not see overwritten keys, and default the optional redirect object so submit stays assignable to ChatSettings. --- src/components/chat/settings/settings.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/chat/settings/settings.tsx b/src/components/chat/settings/settings.tsx index 883311081..68cc77828 100644 --- a/src/components/chat/settings/settings.tsx +++ b/src/components/chat/settings/settings.tsx @@ -39,7 +39,12 @@ const FormSchema = z.object({ accept_uri: z.string().optional().default(''), decline_uri: z.string().optional().default(''), }) - .optional(), + .optional() + .default({ + login_uri: '', + accept_uri: '', + decline_uri: '', + }), }), }); @@ -64,10 +69,9 @@ export const Settings = ({ explicit_room_joins: { ...data.explicit_room_joins, redirect: { - login_uri: '', - accept_uri: '', - decline_uri: '', - ...(data.explicit_room_joins?.redirect ?? {}), + login_uri: data.explicit_room_joins?.redirect?.login_uri ?? '', + accept_uri: data.explicit_room_joins?.redirect?.accept_uri ?? '', + decline_uri: data.explicit_room_joins?.redirect?.decline_uri ?? '', }, }, },