feat(sms): sync tabs with url, add trigger duplicate, order created variables, fix default tab
Some checks failed
Deploy Canina / deploy (push) Failing after 7s
E2E Playwright Tests / Run Full E2E & Security Suites (push) Failing after 3s

This commit is contained in:
parsa aghaei 2026-09-05 10:57:30 +03:30
parent 09c8588401
commit 174a2f8cab
2 changed files with 40 additions and 1 deletions

View File

@ -59,6 +59,8 @@ export const SMS_EVENT_DEFINITIONS: SmsEventDefinition[] = [
{ key: 'provinceCity', label: 'استان و شهر مقصد', sample: 'تهران - تهران' },
{ key: 'postalCode', label: 'کد پستی ۱۰ رقمی', sample: '1967812345' },
{ key: 'address', label: 'نشانی پستی', sample: 'خیابان ولیعصر، کوچه بهار، پلاک ۴' },
{ key: 'itemsSummary', label: 'خلاصه اقلام سفارش', sample: 'شیر خشک توله سگ (۲)' },
{ key: 'itemCount', label: 'تعداد کل اقلام', sample: '۲' },
{ key: 'paymentMethod', label: 'روش پرداخت', sample: 'کارت به کارت' },
{ key: 'orderDate', label: 'تاریخ ثبت سفارش', sample: '۱۴۰۳/۰۶/۱۵' },
],

View File

@ -43,6 +43,7 @@ import {
FileText,
} from 'lucide-react';
import { toast } from 'react-hot-toast';
import { useSearchParams } from 'react-router-dom';
import api from '../services/api';
import Spinner from '../components/ui/Spinner';
import Button from '../components/ui/Button';
@ -122,7 +123,19 @@ const toPersianDigits = (n: string | number | null | undefined): string => {
};
export default function SmsSettingsPage() {
const [activeTab, setActiveTab] = useState<'settings' | 'patterns' | 'triggers' | 'logs'>('patterns');
const [searchParams, setSearchParams] = useSearchParams();
const urlTab = searchParams.get('tab');
const validTabs: ('settings' | 'patterns' | 'triggers' | 'logs')[] = ['settings', 'patterns', 'triggers', 'logs'];
const activeTab: 'settings' | 'patterns' | 'triggers' | 'logs' =
urlTab && validTabs.includes(urlTab as any) ? (urlTab as any) : 'settings';
const setActiveTab = (tab: 'settings' | 'patterns' | 'triggers' | 'logs') => {
setSearchParams((prev) => {
const next = new URLSearchParams(prev);
next.set('tab', tab);
return next;
}, { replace: false });
};
// Config State
const [config, setConfig] = useState<SmsConfigState>({
@ -382,6 +395,20 @@ export default function SmsSettingsPage() {
setIsRuleModalOpen(true);
};
const handleDuplicateRule = (rule: SmsRule) => {
setEditingRule(null); // Create new rule on save
setRuleFormTitle(`${rule.title} (کپی)`);
setRuleFormEvent(rule.event);
setRuleFormEnabled(rule.enabled);
setRuleFormRecipientType(rule.recipientType);
setRuleFormCustomPhone(rule.customPhone || '');
setRuleFormPatternId(String(rule.patternId || ''));
setRuleFormVariables(rule.variables ? [...rule.variables] : []);
setRuleFormDescription(rule.description ? `${rule.description} (رونوشت)` : '');
setIsRuleModalOpen(true);
toast.info('اطلاعات سناریو تکثیر شد. پس از بازبینی، ذخیره نمایید.');
};
const handleSaveRule = async (e: React.FormEvent) => {
e.preventDefault();
if (!ruleFormTitle.trim()) {
@ -1367,6 +1394,16 @@ export default function SmsSettingsPage() {
</button>
<div className="flex items-center gap-1">
<button
type="button"
onClick={() => handleDuplicateRule(rule)}
className="p-1.5 text-gray-500 hover:text-purple-600 hover:bg-white rounded-lg border border-transparent hover:border-gray-200 transition-all text-xs font-bold flex items-center gap-1"
title="تکثیر / ساخت کپی از سناریو"
>
<Copy className="w-3.5 h-3.5" />
<span>تکثیر</span>
</button>
<button
type="button"
onClick={() => handleOpenEditRuleModal(rule)}