feat: add inquiry notification settings to admin settings UI
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -27,7 +27,7 @@ const KNOWN_SETTINGS: Array<{
|
|||||||
key: string;
|
key: string;
|
||||||
label: string;
|
label: string;
|
||||||
description: string;
|
description: string;
|
||||||
type: 'boolean' | 'number' | 'json';
|
type: 'boolean' | 'number' | 'json' | 'string';
|
||||||
defaultValue: unknown;
|
defaultValue: unknown;
|
||||||
}> = [
|
}> = [
|
||||||
{
|
{
|
||||||
@@ -73,6 +73,22 @@ const KNOWN_SETTINGS: Array<{
|
|||||||
type: 'json',
|
type: 'json',
|
||||||
defaultValue: [],
|
defaultValue: [],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: 'inquiry_contact_email',
|
||||||
|
label: 'Inquiry Contact Email',
|
||||||
|
description:
|
||||||
|
'Reply-to email shown in client confirmation emails when a new interest is registered',
|
||||||
|
type: 'string',
|
||||||
|
defaultValue: 'sales@portnimara.com',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'inquiry_notification_recipients',
|
||||||
|
label: 'External Notification Recipients',
|
||||||
|
description:
|
||||||
|
'Additional email addresses that receive sales notifications for new interests (JSON array)',
|
||||||
|
type: 'json',
|
||||||
|
defaultValue: [],
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export function SettingsManager() {
|
export function SettingsManager() {
|
||||||
@@ -187,6 +203,49 @@ export function SettingsManager() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
|
{/* String Settings */}
|
||||||
|
{KNOWN_SETTINGS.some((s) => s.type === 'string') && (
|
||||||
|
<Card>
|
||||||
|
<CardHeader>
|
||||||
|
<CardTitle>Inquiry Settings</CardTitle>
|
||||||
|
<CardDescription>Configure inquiry notification behavior</CardDescription>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent className="space-y-4">
|
||||||
|
{KNOWN_SETTINGS.filter((s) => s.type === 'string').map((setting) => (
|
||||||
|
<div key={setting.key} className="flex items-center justify-between gap-4">
|
||||||
|
<div className="flex-1">
|
||||||
|
<Label>{setting.label}</Label>
|
||||||
|
<p className="text-xs text-muted-foreground">{setting.description}</p>
|
||||||
|
</div>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Input
|
||||||
|
type="text"
|
||||||
|
className="w-64"
|
||||||
|
value={String(getEffectiveValue(setting.key, setting.defaultValue) ?? '')}
|
||||||
|
onChange={(e) =>
|
||||||
|
setValues((prev) => ({
|
||||||
|
...prev,
|
||||||
|
[setting.key]: e.target.value,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
variant="outline"
|
||||||
|
disabled={saving === setting.key}
|
||||||
|
onClick={() =>
|
||||||
|
saveSetting(setting.key, values[setting.key] ?? setting.defaultValue)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<Save className="h-3.5 w-3.5" />
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Numeric Settings */}
|
{/* Numeric Settings */}
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
|
|||||||
Reference in New Issue
Block a user