Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 26 additions & 2 deletions src/components/chat/settings/settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,18 @@ 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()
.default({
login_uri: '',
accept_uri: '',
decline_uri: '',
}),
}),
});

Expand All @@ -52,7 +64,17 @@ export const Settings = ({
const { save, isSaving } = useSettingsSave('Chat');
const form = useForm<z.infer<typeof FormSchema>>({
resolver: rhfZodResolver(FormSchema),
defaultValues: data,
defaultValues: {
...data,
explicit_room_joins: {
...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 ?? '',
},
},
},
});

useEffect(() => {
Expand All @@ -73,7 +95,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 => {
Expand Down
94 changes: 94 additions & 0 deletions src/components/chat/settings/settingsForm.tsx
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -180,6 +182,98 @@ export const SettingsForm = ({
/>
</>
</div>
<div className="flex flex-col gap-4 border-t pt-4">
<h3
className={cn(
'text-lg font-medium',
!explicitJoin && disabledStyling
)}
>
Invitation Redirects
</h3>
<div className="grid grid-cols-1 gap-4">
<FormField
control={formRef.control}
name="explicit_room_joins.redirect.login_uri"
render={({ field }) => (
<FormItem>
<FormLabel className={cn(!explicitJoin && disabledStyling)}>
Login Redirect URI
</FormLabel>
<FormControl>
<Input
disabled={!explicitJoin || !edit}
placeholder="https://example.com/login"
{...field}
value={field.value ?? ''}
/>
</FormControl>
<FormDescription
className={cn(!explicitJoin && disabledStyling)}
>
Absolute login page URL for unauthenticated email-link
clicks. Hook appends
?redirectUri=...&answer=...&invitationToken=... Empty means
email clicks fail until configured.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={formRef.control}
name="explicit_room_joins.redirect.accept_uri"
render={({ field }) => (
<FormItem>
<FormLabel className={cn(!explicitJoin && disabledStyling)}>
Accept Redirect URI
</FormLabel>
<FormControl>
<Input
disabled={!explicitJoin || !edit}
placeholder="https://example.com/chat/{roomId}"
{...field}
value={field.value ?? ''}
/>
</FormControl>
<FormDescription
className={cn(!explicitJoin && disabledStyling)}
>
Post-accept destination. Supports {'{roomId}'} placeholder.
If empty, returns a JSON result.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={formRef.control}
name="explicit_room_joins.redirect.decline_uri"
render={({ field }) => (
<FormItem>
<FormLabel className={cn(!explicitJoin && disabledStyling)}>
Decline Redirect URI
</FormLabel>
<FormControl>
<Input
disabled={!explicitJoin || !edit}
placeholder="https://example.com/dashboard"
{...field}
value={field.value ?? ''}
/>
</FormControl>
<FormDescription
className={cn(!explicitJoin && disabledStyling)}
>
Post-decline destination. Supports {'{roomId}'} placeholder.
If empty, returns a JSON result.
</FormDescription>
<FormMessage />
</FormItem>
)}
/>
</div>
</div>
</div>
<SettingsFormActions
edit={edit}
Expand Down
5 changes: 5 additions & 0 deletions src/lib/models/chat/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,10 @@ export type ChatSettings = {
enabled: boolean;
send_email: boolean;
send_notification: boolean;
redirect: {
login_uri: string;
accept_uri: string;
decline_uri: string;
};
};
};
Loading