feat(payment): unify payment flow with new pure redirect entry and update related endpoints

This commit is contained in:
hamed
2026-07-02 17:08:50 +03:30
parent c247ac2c80
commit 7f5c65129c
17 changed files with 720 additions and 82 deletions
+29 -13
View File
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
@@ -68,7 +68,10 @@ function SmsWalletPageInner() {
const chargeMutation = useMutation({
mutationFn: ({ amount_rials }: ChargeForm) =>
api.post<{ data: { payment_url: string } }>('/api/v1/sms/wallet/charge', { gateway, amount_rials }),
api.post<{ data: { payment_url: string } }>('/api/v1/sms/wallet/charge', {
gateway, amount_rials,
frontend_address: `${window.location.origin}${window.location.pathname}`,
}),
onSuccess: (res: any) => {
const url = res?.data?.pay_url ?? res?.data?.redirect_url ?? res?.data?.payment_url;
if (url) window.location.href = url;
@@ -80,9 +83,16 @@ function SmsWalletPageInner() {
const [localSettings, setLocalSettings] = useState<SmsSettings | null>(null);
const currentSettings = localSettings ?? settings;
// با هر بار تازه‌شدن داده‌ی سرور، ویرایش محلی صفر شود تا وضعیت واقعی (مثل وضعیت تأیید متن) نمایش داده شود.
useEffect(() => { setLocalSettings(null); }, [settingsData]);
const saveMutation = useMutation({
mutationFn: (body: SmsSettings) => api.patch('/api/v1/sms/settings', body),
onSuccess: () => { qc.invalidateQueries({ queryKey: ['sms-settings'] }); toast.success('تنظیمات ذخیره شد'); },
onSuccess: () => {
setLocalSettings(null);
qc.invalidateQueries({ queryKey: ['sms-settings'] });
toast.success('تنظیمات ذخیره شد');
},
onError: (e: any) => toast.error(e.message),
});
@@ -233,11 +243,14 @@ function SmsWalletPageInner() {
)}
</div>
</div>
<div
className={`switch${currentSettings.reminder_enabled ? ' on' : ''}`}
style={{ marginTop: 4, flexShrink: 0 }}
onClick={() => setLocalSettings({ ...currentSettings, reminder_enabled: !currentSettings.reminder_enabled })}
/>
<label className="switch" style={{ marginTop: 4, flexShrink: 0 }}>
<input
type="checkbox"
checked={currentSettings.reminder_enabled}
onChange={() => setLocalSettings({ ...currentSettings, reminder_enabled: !currentSettings.reminder_enabled })}
/>
<span className="switch-track"><span className="switch-thumb" /></span>
</label>
</div>
{/* ردیف: پیامک بعد از ویزیت */}
@@ -253,11 +266,14 @@ function SmsWalletPageInner() {
<div style={{ color: 'var(--text-3)', fontSize: 12.5, marginTop: 3 }}>متن تشکر پس از پایان مراجعه برای بیمار ارسال میشود</div>
</div>
</div>
<div
className={`switch${currentSettings.post_visit_enabled ? ' on' : ''}`}
style={{ flexShrink: 0 }}
onClick={() => setLocalSettings({ ...currentSettings, post_visit_enabled: !currentSettings.post_visit_enabled })}
/>
<label className="switch" style={{ flexShrink: 0 }}>
<input
type="checkbox"
checked={currentSettings.post_visit_enabled}
onChange={() => setLocalSettings({ ...currentSettings, post_visit_enabled: !currentSettings.post_visit_enabled })}
/>
<span className="switch-track"><span className="switch-thumb" /></span>
</label>
</div>
{/* محتوای باز‌شونده */}