@mdguggenbichler/slugbase-core 0.0.22 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAiPxB,eAAe,MAAM,CAAC"}
|
|
@@ -52,6 +52,23 @@ router.get('/ai', async (req, res) => {
|
|
|
52
52
|
res.status(500).json({ error: error.message });
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
|
+
/** GET /admin/settings/smtp — SMTP keys only (for Settings page; no ai_* or other keys). */
|
|
56
|
+
router.get('/smtp', async (req, res) => {
|
|
57
|
+
try {
|
|
58
|
+
const tenantId = getTenantId(req);
|
|
59
|
+
const smtpKeys = ['smtp_enabled', 'smtp_host', 'smtp_port', 'smtp_secure', 'smtp_user', 'smtp_password', 'smtp_from', 'smtp_from_name'];
|
|
60
|
+
const settingsObj = {};
|
|
61
|
+
for (const key of smtpKeys) {
|
|
62
|
+
const row = await queryOne('SELECT value FROM system_config WHERE key = ? AND tenant_id = ?', [key, tenantId]);
|
|
63
|
+
const val = row ? row.value : '';
|
|
64
|
+
settingsObj[key] = key === 'smtp_password' && val ? '***SET***' : (val || '');
|
|
65
|
+
}
|
|
66
|
+
res.json(settingsObj);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
res.status(500).json({ error: error.message });
|
|
70
|
+
}
|
|
71
|
+
});
|
|
55
72
|
router.get('/ai/models', async (req, res) => {
|
|
56
73
|
try {
|
|
57
74
|
const tenantId = getTenantId(req);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/routes/admin/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,19 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
2
|
import { useTranslation } from 'react-i18next';
|
|
3
3
|
import { useAuth } from '../../contexts/AuthContext';
|
|
4
4
|
import api from '../../api/client';
|
|
5
5
|
import { useToast } from '../ui/Toast';
|
|
6
|
-
import { Save,
|
|
6
|
+
import { Save, Mail, Send } from 'lucide-react';
|
|
7
7
|
import Button from '../ui/Button';
|
|
8
|
-
import ConfirmDialog from '../ui/ConfirmDialog';
|
|
9
|
-
import { useConfirmDialog } from '../../hooks/useConfirmDialog';
|
|
10
8
|
import { PageLoadingSkeleton } from '../ui/PageLoadingSkeleton';
|
|
9
|
+
import { Switch } from '../ui/switch';
|
|
10
|
+
import { Label } from '../ui/label';
|
|
11
11
|
|
|
12
12
|
export default function AdminSettings() {
|
|
13
13
|
const { t } = useTranslation();
|
|
14
14
|
const { user } = useAuth();
|
|
15
|
-
const { showConfirm, dialogState } = useConfirmDialog();
|
|
16
15
|
const { showToast } = useToast();
|
|
17
|
-
const [settings, setSettings] = useState<Record<string, string>>({});
|
|
18
16
|
const [loading, setLoading] = useState(true);
|
|
19
|
-
const [newKey, setNewKey] = useState('');
|
|
20
|
-
const [newValue, setNewValue] = useState('');
|
|
21
|
-
|
|
22
|
-
// SMTP settings state
|
|
23
17
|
const [smtpSettings, setSmtpSettings] = useState({
|
|
24
18
|
enabled: false,
|
|
25
19
|
host: '',
|
|
@@ -34,94 +28,45 @@ export default function AdminSettings() {
|
|
|
34
28
|
const [testingEmail, setTestingEmail] = useState(false);
|
|
35
29
|
|
|
36
30
|
useEffect(() => {
|
|
37
|
-
|
|
31
|
+
loadSmtpSettings();
|
|
38
32
|
}, []);
|
|
39
33
|
|
|
40
|
-
const
|
|
34
|
+
const loadSmtpSettings = async () => {
|
|
41
35
|
try {
|
|
42
|
-
const response = await api.get('/admin/settings');
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// Load SMTP settings
|
|
47
|
-
// Check if password is set (backend returns '***SET***' if password exists)
|
|
48
|
-
const hasPassword = allSettings.smtp_password === '***SET***';
|
|
36
|
+
const response = await api.get<Record<string, string>>('/admin/settings/smtp');
|
|
37
|
+
const data = response.data;
|
|
38
|
+
const hasPassword = data.smtp_password === '***SET***';
|
|
49
39
|
setPasswordIsSet(hasPassword);
|
|
50
|
-
|
|
51
40
|
setSmtpSettings({
|
|
52
|
-
enabled:
|
|
53
|
-
host:
|
|
54
|
-
port: parseInt(
|
|
55
|
-
secure:
|
|
56
|
-
user:
|
|
57
|
-
password: hasPassword ? '••••••••••••••••' : '',
|
|
58
|
-
from:
|
|
59
|
-
fromName:
|
|
41
|
+
enabled: data.smtp_enabled === 'true',
|
|
42
|
+
host: data.smtp_host || '',
|
|
43
|
+
port: parseInt(data.smtp_port || '587'),
|
|
44
|
+
secure: data.smtp_secure === 'true',
|
|
45
|
+
user: data.smtp_user || '',
|
|
46
|
+
password: hasPassword ? '••••••••••••••••' : '',
|
|
47
|
+
from: data.smtp_from || '',
|
|
48
|
+
fromName: data.smtp_from_name || 'SlugBase',
|
|
60
49
|
});
|
|
61
50
|
} catch (error) {
|
|
62
|
-
console.error('Failed to load settings:', error);
|
|
51
|
+
console.error('Failed to load SMTP settings:', error);
|
|
52
|
+
showToast(t('common.error'), 'error');
|
|
63
53
|
} finally {
|
|
64
54
|
setLoading(false);
|
|
65
55
|
}
|
|
66
56
|
};
|
|
67
57
|
|
|
68
|
-
const handleSave = async (key: string, value: string) => {
|
|
69
|
-
try {
|
|
70
|
-
await api.post('/admin/settings', { key, value });
|
|
71
|
-
setSettings({ ...settings, [key]: value });
|
|
72
|
-
showToast(t('common.success'), 'success');
|
|
73
|
-
} catch (error: any) {
|
|
74
|
-
showToast(error.response?.data?.error || t('common.error'), 'error');
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const handleAdd = async (e: React.FormEvent) => {
|
|
79
|
-
e.preventDefault();
|
|
80
|
-
if (!newKey) return;
|
|
81
|
-
try {
|
|
82
|
-
await api.post('/admin/settings', { key: newKey, value: newValue });
|
|
83
|
-
setSettings({ ...settings, [newKey]: newValue });
|
|
84
|
-
setNewKey('');
|
|
85
|
-
setNewValue('');
|
|
86
|
-
showToast(t('common.success'), 'success');
|
|
87
|
-
} catch (error: any) {
|
|
88
|
-
showToast(error.response?.data?.error || t('common.error'), 'error');
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
const handleDelete = (key: string) => {
|
|
93
|
-
showConfirm(
|
|
94
|
-
t('admin.confirmDeleteSetting'),
|
|
95
|
-
t('admin.confirmDeleteSetting'),
|
|
96
|
-
async () => {
|
|
97
|
-
try {
|
|
98
|
-
await api.delete(`/admin/settings/${key}`);
|
|
99
|
-
const newSettings = { ...settings };
|
|
100
|
-
delete newSettings[key];
|
|
101
|
-
setSettings(newSettings);
|
|
102
|
-
showToast(t('common.success'), 'success');
|
|
103
|
-
} catch (error: any) {
|
|
104
|
-
showToast(error.response?.data?.error || t('common.error'), 'error');
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
{ variant: 'danger', confirmText: t('common.delete'), cancelText: t('common.cancel') }
|
|
108
|
-
);
|
|
109
|
-
};
|
|
110
|
-
|
|
111
58
|
const handleSMTPSave = async () => {
|
|
112
59
|
try {
|
|
113
|
-
|
|
114
|
-
const settingsToSave: any = { ...smtpSettings };
|
|
60
|
+
const settingsToSave: Record<string, unknown> = { ...smtpSettings };
|
|
115
61
|
if (settingsToSave.password === '••••••••••••••••') {
|
|
116
|
-
// Password is masked, don't send it to keep existing password
|
|
117
62
|
delete settingsToSave.password;
|
|
118
63
|
}
|
|
119
|
-
|
|
120
64
|
await api.post('/admin/settings/smtp', settingsToSave);
|
|
121
65
|
showToast(t('common.success'), 'success');
|
|
122
|
-
await
|
|
123
|
-
} catch (error:
|
|
124
|
-
|
|
66
|
+
await loadSmtpSettings();
|
|
67
|
+
} catch (error: unknown) {
|
|
68
|
+
const e = error as { response?: { data?: { error?: string } } };
|
|
69
|
+
showToast(e?.response?.data?.error || t('common.error'), 'error');
|
|
125
70
|
}
|
|
126
71
|
};
|
|
127
72
|
|
|
@@ -134,8 +79,9 @@ export default function AdminSettings() {
|
|
|
134
79
|
try {
|
|
135
80
|
await api.post('/admin/settings/smtp/test', { email: user.email });
|
|
136
81
|
showToast(t('smtp.testSent'), 'success');
|
|
137
|
-
} catch (error:
|
|
138
|
-
|
|
82
|
+
} catch (error: unknown) {
|
|
83
|
+
const e = error as { response?: { data?: { error?: string } } };
|
|
84
|
+
showToast(e?.response?.data?.error || t('smtp.testFailed'), 'error');
|
|
139
85
|
} finally {
|
|
140
86
|
setTestingEmail(false);
|
|
141
87
|
}
|
|
@@ -145,14 +91,8 @@ export default function AdminSettings() {
|
|
|
145
91
|
return <PageLoadingSkeleton lines={8} />;
|
|
146
92
|
}
|
|
147
93
|
|
|
148
|
-
// Filter out SMTP settings from general settings display
|
|
149
|
-
const generalSettings = Object.fromEntries(
|
|
150
|
-
Object.entries(settings).filter(([key]) => !key.startsWith('smtp_'))
|
|
151
|
-
);
|
|
152
|
-
|
|
153
94
|
return (
|
|
154
95
|
<div className="space-y-6">
|
|
155
|
-
{/* SMTP Settings Section */}
|
|
156
96
|
<div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm p-4">
|
|
157
97
|
<div className="flex items-center gap-2 mb-6">
|
|
158
98
|
<Mail className="h-5 w-5 text-gray-400 dark:text-gray-500" />
|
|
@@ -168,246 +108,148 @@ export default function AdminSettings() {
|
|
|
168
108
|
|
|
169
109
|
<div className="space-y-4">
|
|
170
110
|
<div className="flex items-center gap-3">
|
|
171
|
-
<
|
|
172
|
-
type="checkbox"
|
|
111
|
+
<Switch
|
|
173
112
|
id="smtp-enabled"
|
|
174
113
|
checked={smtpSettings.enabled}
|
|
175
|
-
|
|
176
|
-
className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
114
|
+
onCheckedChange={(checked) => setSmtpSettings({ ...smtpSettings, enabled: checked })}
|
|
177
115
|
/>
|
|
178
|
-
<
|
|
116
|
+
<Label htmlFor="smtp-enabled" className="text-sm font-medium text-gray-900 dark:text-white cursor-pointer">
|
|
179
117
|
{t('smtp.enabled')}
|
|
180
|
-
</
|
|
118
|
+
</Label>
|
|
181
119
|
</div>
|
|
182
120
|
|
|
183
121
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
184
|
-
<div>
|
|
185
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
186
|
-
{t('smtp.host')}
|
|
187
|
-
</label>
|
|
188
|
-
<input
|
|
189
|
-
type="text"
|
|
190
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
191
|
-
placeholder={t('smtp.hostPlaceholder')}
|
|
192
|
-
value={smtpSettings.host}
|
|
193
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, host: e.target.value })}
|
|
194
|
-
/>
|
|
195
|
-
</div>
|
|
196
|
-
<div>
|
|
197
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
198
|
-
{t('smtp.port')}
|
|
199
|
-
</label>
|
|
200
|
-
<input
|
|
201
|
-
type="number"
|
|
202
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
203
|
-
placeholder={t('smtp.portPlaceholder')}
|
|
204
|
-
value={smtpSettings.port}
|
|
205
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, port: parseInt(e.target.value) || 587 })}
|
|
206
|
-
/>
|
|
207
|
-
</div>
|
|
208
|
-
<div>
|
|
209
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
210
|
-
{t('smtp.user')}
|
|
211
|
-
</label>
|
|
212
|
-
<input
|
|
213
|
-
type="text"
|
|
214
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
215
|
-
placeholder={t('smtp.userPlaceholder')}
|
|
216
|
-
value={smtpSettings.user}
|
|
217
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, user: e.target.value })}
|
|
218
|
-
/>
|
|
219
|
-
</div>
|
|
220
|
-
<div>
|
|
221
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
222
|
-
{t('smtp.password')}
|
|
223
|
-
</label>
|
|
224
|
-
<input
|
|
225
|
-
type="password"
|
|
226
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
227
|
-
placeholder={passwordIsSet ? t('smtp.passwordPlaceholder') : t('smtp.passwordPlaceholder')}
|
|
228
|
-
value={smtpSettings.password}
|
|
229
|
-
onChange={(e) => {
|
|
230
|
-
// If user starts typing, clear the masked password
|
|
231
|
-
const newValue = e.target.value;
|
|
232
|
-
if (passwordIsSet && smtpSettings.password === '••••••••••••••••' && newValue.length > 0) {
|
|
233
|
-
// User is typing, clear the masked value
|
|
234
|
-
setSmtpSettings({ ...smtpSettings, password: newValue });
|
|
235
|
-
setPasswordIsSet(false);
|
|
236
|
-
} else {
|
|
237
|
-
setSmtpSettings({ ...smtpSettings, password: newValue });
|
|
238
|
-
if (newValue.length > 0) {
|
|
239
|
-
setPasswordIsSet(true);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}}
|
|
243
|
-
onFocus={() => {
|
|
244
|
-
// Clear masked password when field is focused
|
|
245
|
-
if (smtpSettings.password === '••••••••••••••••') {
|
|
246
|
-
setSmtpSettings({ ...smtpSettings, password: '' });
|
|
247
|
-
setPasswordIsSet(false);
|
|
248
|
-
}
|
|
249
|
-
}}
|
|
250
|
-
/>
|
|
251
|
-
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
|
|
252
|
-
{passwordIsSet ? t('smtp.passwordChangeHint') : t('admin.leaveBlank')}
|
|
253
|
-
</p>
|
|
254
|
-
</div>
|
|
255
|
-
<div>
|
|
256
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
257
|
-
{t('smtp.from')}
|
|
258
|
-
</label>
|
|
259
|
-
<input
|
|
260
|
-
type="email"
|
|
261
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
262
|
-
placeholder={t('smtp.fromPlaceholder')}
|
|
263
|
-
value={smtpSettings.from}
|
|
264
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, from: e.target.value })}
|
|
265
|
-
/>
|
|
266
|
-
</div>
|
|
267
|
-
<div>
|
|
268
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
269
|
-
{t('smtp.fromName')}
|
|
270
|
-
</label>
|
|
271
|
-
<input
|
|
272
|
-
type="text"
|
|
273
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
274
|
-
placeholder={t('smtp.fromNamePlaceholder')}
|
|
275
|
-
value={smtpSettings.fromName}
|
|
276
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, fromName: e.target.value })}
|
|
277
|
-
/>
|
|
278
|
-
</div>
|
|
279
|
-
</div>
|
|
280
|
-
|
|
281
|
-
<div className="flex items-center gap-3 pt-2">
|
|
282
|
-
<input
|
|
283
|
-
type="checkbox"
|
|
284
|
-
id="smtp-secure"
|
|
285
|
-
checked={smtpSettings.secure}
|
|
286
|
-
onChange={(e) => setSmtpSettings({ ...smtpSettings, secure: e.target.checked })}
|
|
287
|
-
className="w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
|
|
288
|
-
/>
|
|
289
|
-
<label htmlFor="smtp-secure" className="text-sm font-medium text-gray-900 dark:text-white">
|
|
290
|
-
{t('smtp.secure')}
|
|
291
|
-
</label>
|
|
292
|
-
</div>
|
|
293
|
-
|
|
294
|
-
<div className="flex items-center gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
|
|
295
|
-
<div className="flex-1">
|
|
296
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
297
|
-
{t('smtp.testEmail')}
|
|
298
|
-
</label>
|
|
299
|
-
<div className="px-4 py-2.5 text-sm text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-700/50 border border-gray-300 dark:border-gray-600 rounded-lg">
|
|
300
|
-
{user?.email || t('common.loading')}
|
|
301
|
-
</div>
|
|
302
|
-
</div>
|
|
303
|
-
<div className="pt-6">
|
|
304
|
-
<Button
|
|
305
|
-
variant="ghost"
|
|
306
|
-
icon={Send}
|
|
307
|
-
onClick={handleTestEmail}
|
|
308
|
-
disabled={testingEmail || !user?.email}
|
|
309
|
-
>
|
|
310
|
-
{t('smtp.sendTest')}
|
|
311
|
-
</Button>
|
|
312
|
-
</div>
|
|
313
|
-
</div>
|
|
314
|
-
|
|
315
|
-
<div className="pt-4">
|
|
316
|
-
<Button variant="primary" icon={Save} onClick={handleSMTPSave} >
|
|
317
|
-
{t('smtp.save')}
|
|
318
|
-
</Button>
|
|
319
|
-
</div>
|
|
320
|
-
</div>
|
|
321
|
-
</div>
|
|
322
|
-
|
|
323
|
-
{/* General Settings Section */}
|
|
324
|
-
<div>
|
|
325
|
-
<h2 className="text-lg font-semibold text-gray-900 dark:text-white">{t('admin.settings')}</h2>
|
|
326
|
-
<p className="mt-1 text-sm text-gray-500 dark:text-gray-400">
|
|
327
|
-
{Object.keys(generalSettings).length} {Object.keys(generalSettings).length === 1 ? t('common.setting') : t('common.settings')}
|
|
328
|
-
</p>
|
|
329
|
-
</div>
|
|
330
|
-
|
|
331
|
-
{/* Existing Settings */}
|
|
332
|
-
{Object.keys(generalSettings).length > 0 && (
|
|
333
|
-
<div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm overflow-hidden">
|
|
334
|
-
<div className="divide-y divide-gray-200 dark:divide-gray-700">
|
|
335
|
-
{Object.entries(generalSettings).map(([key, value]) => (
|
|
336
|
-
<div key={key} className="px-6 py-4 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors">
|
|
337
|
-
<div className="flex items-center justify-between gap-4">
|
|
338
|
-
<div className="flex-1 min-w-0">
|
|
339
|
-
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
340
|
-
{key}
|
|
341
|
-
</label>
|
|
342
|
-
<input
|
|
343
|
-
type="text"
|
|
344
|
-
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
|
|
345
|
-
value={value}
|
|
346
|
-
onChange={(e) => setSettings({ ...settings, [key]: e.target.value })}
|
|
347
|
-
/>
|
|
348
|
-
</div>
|
|
349
|
-
<div className="flex items-center gap-2">
|
|
350
|
-
<Button
|
|
351
|
-
variant="ghost"
|
|
352
|
-
size="sm"
|
|
353
|
-
icon={Save}
|
|
354
|
-
onClick={() => handleSave(key, settings[key])}
|
|
355
|
-
/>
|
|
356
|
-
<Button
|
|
357
|
-
variant="danger"
|
|
358
|
-
size="sm"
|
|
359
|
-
icon={Trash2}
|
|
360
|
-
onClick={() => handleDelete(key)}
|
|
361
|
-
/>
|
|
362
|
-
</div>
|
|
363
|
-
</div>
|
|
364
|
-
</div>
|
|
365
|
-
))}
|
|
366
|
-
</div>
|
|
367
|
-
</div>
|
|
368
|
-
)}
|
|
369
|
-
|
|
370
|
-
{/* Add New Setting */}
|
|
371
|
-
<div className="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 shadow-sm p-4">
|
|
372
|
-
<div className="flex items-center gap-2 mb-4">
|
|
373
|
-
<SettingsIcon className="h-5 w-5 text-gray-400 dark:text-gray-500" />
|
|
374
|
-
<h3 className="text-lg font-semibold text-gray-900 dark:text-white">
|
|
375
|
-
{t('admin.addSetting')}
|
|
376
|
-
</h3>
|
|
377
|
-
</div>
|
|
378
|
-
<form onSubmit={handleAdd} className="space-y-4">
|
|
379
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
380
122
|
<div>
|
|
381
123
|
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
382
|
-
{t('
|
|
124
|
+
{t('smtp.host')}
|
|
125
|
+
</label>
|
|
126
|
+
<input
|
|
127
|
+
type="text"
|
|
128
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
129
|
+
placeholder={t('smtp.hostPlaceholder')}
|
|
130
|
+
value={smtpSettings.host}
|
|
131
|
+
onChange={(e) => setSmtpSettings({ ...smtpSettings, host: e.target.value })}
|
|
132
|
+
/>
|
|
133
|
+
</div>
|
|
134
|
+
<div>
|
|
135
|
+
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
136
|
+
{t('smtp.port')}
|
|
137
|
+
</label>
|
|
138
|
+
<input
|
|
139
|
+
type="number"
|
|
140
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
141
|
+
placeholder={t('smtp.portPlaceholder')}
|
|
142
|
+
value={smtpSettings.port}
|
|
143
|
+
onChange={(e) => setSmtpSettings({ ...smtpSettings, port: parseInt(e.target.value) || 587 })}
|
|
144
|
+
/>
|
|
145
|
+
</div>
|
|
146
|
+
<div>
|
|
147
|
+
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
148
|
+
{t('smtp.user')}
|
|
383
149
|
</label>
|
|
384
150
|
<input
|
|
385
151
|
type="text"
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
value={
|
|
389
|
-
onChange={(e) =>
|
|
152
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
153
|
+
placeholder={t('smtp.userPlaceholder')}
|
|
154
|
+
value={smtpSettings.user}
|
|
155
|
+
onChange={(e) => setSmtpSettings({ ...smtpSettings, user: e.target.value })}
|
|
390
156
|
/>
|
|
391
157
|
</div>
|
|
392
158
|
<div>
|
|
393
159
|
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
394
|
-
{t('
|
|
160
|
+
{t('smtp.password')}
|
|
161
|
+
</label>
|
|
162
|
+
<input
|
|
163
|
+
type="password"
|
|
164
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
165
|
+
placeholder={passwordIsSet ? t('smtp.passwordPlaceholder') : t('smtp.passwordPlaceholder')}
|
|
166
|
+
value={smtpSettings.password}
|
|
167
|
+
onChange={(e) => {
|
|
168
|
+
const newValue = e.target.value;
|
|
169
|
+
if (passwordIsSet && smtpSettings.password === '••••••••••••••••' && newValue.length > 0) {
|
|
170
|
+
setSmtpSettings({ ...smtpSettings, password: newValue });
|
|
171
|
+
setPasswordIsSet(false);
|
|
172
|
+
} else {
|
|
173
|
+
setSmtpSettings({ ...smtpSettings, password: newValue });
|
|
174
|
+
setPasswordIsSet(newValue.length > 0);
|
|
175
|
+
}
|
|
176
|
+
}}
|
|
177
|
+
onFocus={() => {
|
|
178
|
+
if (smtpSettings.password === '••••••••••••••••') {
|
|
179
|
+
setSmtpSettings({ ...smtpSettings, password: '' });
|
|
180
|
+
setPasswordIsSet(false);
|
|
181
|
+
}
|
|
182
|
+
}}
|
|
183
|
+
/>
|
|
184
|
+
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
|
|
185
|
+
{passwordIsSet ? t('smtp.passwordChangeHint') : t('admin.leaveBlank')}
|
|
186
|
+
</p>
|
|
187
|
+
</div>
|
|
188
|
+
<div>
|
|
189
|
+
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
190
|
+
{t('smtp.from')}
|
|
191
|
+
</label>
|
|
192
|
+
<input
|
|
193
|
+
type="email"
|
|
194
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
195
|
+
placeholder={t('smtp.fromPlaceholder')}
|
|
196
|
+
value={smtpSettings.from}
|
|
197
|
+
onChange={(e) => setSmtpSettings({ ...smtpSettings, from: e.target.value })}
|
|
198
|
+
/>
|
|
199
|
+
</div>
|
|
200
|
+
<div>
|
|
201
|
+
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
202
|
+
{t('smtp.fromName')}
|
|
395
203
|
</label>
|
|
396
204
|
<input
|
|
397
205
|
type="text"
|
|
398
|
-
className="w-full px-4
|
|
399
|
-
|
|
400
|
-
|
|
206
|
+
className="w-full px-4 h-9 text-sm text-gray-900 dark:text-white bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"
|
|
207
|
+
placeholder={t('smtp.fromNamePlaceholder')}
|
|
208
|
+
value={smtpSettings.fromName}
|
|
209
|
+
onChange={(e) => setSmtpSettings({ ...smtpSettings, fromName: e.target.value })}
|
|
401
210
|
/>
|
|
402
211
|
</div>
|
|
403
212
|
</div>
|
|
404
|
-
<Button type="submit" variant="primary" icon={Plus}>
|
|
405
|
-
{t('admin.addSetting')}
|
|
406
|
-
</Button>
|
|
407
|
-
</form>
|
|
408
|
-
</div>
|
|
409
213
|
|
|
410
|
-
|
|
214
|
+
<div className="flex items-center gap-3 pt-2">
|
|
215
|
+
<Switch
|
|
216
|
+
id="smtp-secure"
|
|
217
|
+
checked={smtpSettings.secure}
|
|
218
|
+
onCheckedChange={(checked) => setSmtpSettings({ ...smtpSettings, secure: checked })}
|
|
219
|
+
/>
|
|
220
|
+
<Label htmlFor="smtp-secure" className="text-sm font-medium text-gray-900 dark:text-white cursor-pointer">
|
|
221
|
+
{t('smtp.secure')}
|
|
222
|
+
</Label>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<div className="flex items-center gap-4 pt-4 border-t border-gray-200 dark:border-gray-700">
|
|
226
|
+
<div className="flex-1">
|
|
227
|
+
<label className="block text-sm font-semibold text-gray-900 dark:text-white mb-2">
|
|
228
|
+
{t('smtp.testEmail')}
|
|
229
|
+
</label>
|
|
230
|
+
<div className="px-4 py-2.5 text-sm text-gray-600 dark:text-gray-400 bg-gray-50 dark:bg-gray-700/50 border border-gray-300 dark:border-gray-600 rounded-lg">
|
|
231
|
+
{user?.email || t('common.loading')}
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
<div className="pt-6">
|
|
235
|
+
<Button
|
|
236
|
+
variant="ghost"
|
|
237
|
+
icon={Send}
|
|
238
|
+
onClick={handleTestEmail}
|
|
239
|
+
disabled={testingEmail || !user?.email}
|
|
240
|
+
>
|
|
241
|
+
{t('smtp.sendTest')}
|
|
242
|
+
</Button>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
|
|
246
|
+
<div className="pt-4">
|
|
247
|
+
<Button variant="primary" icon={Save} onClick={handleSMTPSave}>
|
|
248
|
+
{t('smtp.save')}
|
|
249
|
+
</Button>
|
|
250
|
+
</div>
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
411
253
|
</div>
|
|
412
254
|
);
|
|
413
255
|
}
|