feat(sms): simplify SMS settings to use only KAVENEGAR_API_KEY from env, remove other SMS-related fields from config

This commit is contained in:
hamed
2026-07-01 11:53:16 +03:30
parent 9d8d1014f1
commit b366baa64c
11 changed files with 352 additions and 92 deletions
+10 -56
View File
@@ -36,11 +36,6 @@ const schema = z.object({
mellat_username: z.string(),
mellat_password: z.string(),
sep_terminal_id: z.string(),
// sms
sms_provider: z.string(),
kavenegar_api_key: z.string(),
kavenegar_sender: z.string(),
sms_price_rials: z.string(),
});
type FormValues = z.infer<typeof schema>;
@@ -62,10 +57,7 @@ interface Settings {
mellat_username: string;
mellat_password: string;
sep_terminal_id: string;
sms_provider: string;
kavenegar_api_key: string;
kavenegar_sender: string;
sms_price_rials: string;
sms_api_key_configured: boolean;
}
// ── Component ─────────────────────────────────────────────────────────────
@@ -73,7 +65,6 @@ interface Settings {
export default function SettingsPage() {
const qc = useQueryClient();
const [showMellatPassword, setShowMellatPassword] = useState(false);
const [showKavenegarKey, setShowKavenegarKey] = useState(false);
const { data, isLoading } = useQuery({
queryKey: ['admin-settings'],
@@ -120,10 +111,6 @@ export default function SettingsPage() {
mellat_username: settings.mellat_username ?? '',
mellat_password: settings.mellat_password ?? '',
sep_terminal_id: settings.sep_terminal_id ?? '',
sms_provider: settings.sms_provider ?? 'kavenegar',
kavenegar_api_key: settings.kavenegar_api_key ?? '',
kavenegar_sender: settings.kavenegar_sender ?? '',
sms_price_rials: settings.sms_price_rials ?? '500',
});
}
}, [settings, reset]);
@@ -477,45 +464,16 @@ export default function SettingsPage() {
<h3 style={{ fontSize: 15 }}>تنظیمات پیامک (SMS)</h3>
</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '1rem' }}>
<div>
<label style={{ fontSize: 12.5, fontWeight: 500, display: 'block', marginBottom: 4 }}>سرویس پیامک</label>
<select {...register('sms_provider')}
style={{ width: '100%', height: 38, padding: '0 12px', borderRadius: 'var(--r-sm)', border: '1px solid var(--border)', background: 'var(--surface)', color: 'var(--text)', fontSize: 13 }}>
<option value="kavenegar">کاوهنگار</option>
<option value="rangineh">رنگینه</option>
</select>
</div>
<div>
<label style={{ fontSize: 12.5, fontWeight: 500, display: 'block', marginBottom: 4 }}>قیمت هر پیامک (ریال)</label>
<input {...register('sms_price_rials')} type="number" min={0} dir="ltr" placeholder="500"
style={{ width: '100%', height: 38, padding: '0 12px', borderRadius: 'var(--r-sm)', border: '1px solid var(--border)', background: 'var(--surface)', color: 'var(--text)', fontSize: 13, boxSizing: 'border-box' }}
/>
</div>
</div>
<div style={{ marginTop: '1rem' }}>
<div style={{ fontSize: 13, fontWeight: 600, marginBottom: '0.75rem' }}>تنظیمات کاوهنگار</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>
<div>
<label style={{ fontSize: 12.5, fontWeight: 500, display: 'block', marginBottom: 4 }}>API Key</label>
<div style={{ position: 'relative' }}>
<input {...register('kavenegar_api_key')} type={showKavenegarKey ? 'text' : 'password'} dir="ltr" placeholder="••••••••••••••••"
style={{ width: '100%', height: 38, padding: '0 36px 0 12px', borderRadius: 'var(--r-sm)', border: '1px solid var(--border)', background: 'var(--surface)', color: 'var(--text)', fontSize: 13, boxSizing: 'border-box' }}
/>
<button type="button" onClick={() => setShowKavenegarKey(p => !p)}
style={{ position: 'absolute', left: 10, top: '50%', transform: 'translateY(-50%)', background: 'none', border: 'none', cursor: 'pointer', color: 'var(--muted)', fontSize: 12 }}>
{showKavenegarKey ? 'پنهان' : 'نمایش'}
</button>
</div>
</div>
<div>
<label style={{ fontSize: 12.5, fontWeight: 500, display: 'block', marginBottom: 4 }}>شماره فرستنده</label>
<input {...register('kavenegar_sender')} dir="ltr" placeholder="10008664"
style={{ width: '100%', height: 38, padding: '0 12px', borderRadius: 'var(--r-sm)', border: '1px solid var(--border)', background: 'var(--surface)', color: 'var(--text)', fontSize: 13, boxSizing: 'border-box' }}
/>
</div>
<div>
<label style={{ fontSize: 12.5, fontWeight: 500, display: 'block', marginBottom: 4 }}>کلید API کاوهنگار</label>
<div style={{ fontSize: 13 }}>
{settings?.sms_api_key_configured
? <span style={{ color: 'var(--success)' }}> تنظیمشده (از متغیر محیطی KAVENEGAR_API_KEY)</span>
: <span style={{ color: 'var(--danger)' }}> تنظیمنشده مقدار KAVENEGAR_API_KEY را در فایل env قرار دهید</span>}
</div>
<p style={{ fontSize: 11.5, color: 'var(--muted)', marginTop: 8 }}>
کلید API فقط از طریق متغیر محیطی سرور مدیریت میشود و در این پنل قابل ویرایش نیست.
</p>
</div>
</div>
@@ -541,10 +499,6 @@ export default function SettingsPage() {
mellat_username: settings.mellat_username,
mellat_password: settings.mellat_password,
sep_terminal_id: settings.sep_terminal_id,
sms_provider: settings.sms_provider,
kavenegar_api_key: settings.kavenegar_api_key,
kavenegar_sender: settings.kavenegar_sender,
sms_price_rials: settings.sms_price_rials,
})}
disabled={!isDirty || mutation.isPending}
>