Move e-payment to Settings and add ZarinPal credentials.

Gateway config now lives on the general Settings page, with Mellat fields in a 3-column layout and ZarinPal available at checkout.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-16 01:45:41 +03:30
co-authored by Cursor
parent 9a59bc8f65
commit e79211e3cd
35 changed files with 614 additions and 212 deletions
+13 -11
View File
@@ -158,11 +158,9 @@ export function StoreSpecialsPage() {
setCreateOpen(false)
showToast(t('website.specialItems.toastCreated'), 'success')
} catch (err) {
if (err instanceof ApiError) {
setError(err.message)
} else {
setError(t('website.specialItems.errorCreate'))
}
const message = err instanceof ApiError ? err.message : t('website.specialItems.errorCreate')
setError(message)
showToast(message, 'error')
} finally {
setIsSaving(false)
}
@@ -183,11 +181,9 @@ export function StoreSpecialsPage() {
setEditSpecialTarget(null)
showToast(t('website.specialItems.toastUpdated'), 'success')
} catch (err) {
if (err instanceof ApiError) {
setError(err.message)
} else {
setError(t('website.specialItems.errorUpdate'))
}
const message = err instanceof ApiError ? err.message : t('website.specialItems.errorUpdate')
setError(message)
showToast(message, 'error')
} finally {
setIsSaving(false)
}
@@ -362,7 +358,10 @@ export function StoreSpecialsPage() {
<button
type="button"
className={fabStyles.addFab}
onClick={() => setCreateOpen(true)}
onClick={() => {
setError('')
setCreateOpen(true)
}}
aria-label={t('website.specialItems.addFab')}
>
<Plus size={24} />
@@ -376,6 +375,7 @@ export function StoreSpecialsPage() {
title={t('website.specialItems.createTitle')}
submitLabel={t('website.create')}
isSubmitting={isSaving}
error={createOpen ? error : undefined}
/>
<StoreSpecialModal
@@ -387,6 +387,7 @@ export function StoreSpecialsPage() {
title={t('website.specialItems.editTitle')}
submitLabel={t('website.save')}
isSubmitting={isSaving}
error={editSpecialTarget ? error : undefined}
/>
<PickStoreSpecialItemsModal
@@ -410,6 +411,7 @@ export function StoreSpecialsPage() {
<StoreItemDiscountModal
open={!!discountTarget}
productTitle={discountTarget?.productTitle ?? ''}
productNameFa={discountTarget?.productNameFa ?? ''}
items={productItems}
onClose={() => setDiscountTarget(null)}
onSaved={mergeUpdatedItems}