feat(sms): sync tabs with url, add trigger duplicate, order created variables, fix default tab
This commit is contained in:
parent
09c8588401
commit
174a2f8cab
@ -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: '۱۴۰۳/۰۶/۱۵' },
|
||||
],
|
||||
|
||||
@ -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)}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user