1405/04/27
-
This commit is contained in:
+278
-81
@@ -1,5 +1,17 @@
|
||||
import { ref } from 'vue'
|
||||
import { getSettings } from '@/api/configuration'
|
||||
import type { DepositGuideVars } from '@/utils/depositGuideText'
|
||||
import {
|
||||
DEFAULT_DEPOSIT_GUIDE_TEXT,
|
||||
getCustomerNameFromUser,
|
||||
getDepositGuideVarsFromSettings,
|
||||
getDepositSupportMessageTemplate,
|
||||
getRenderedDepositGuideText,
|
||||
getRenderedDepositSupportMessage,
|
||||
renderDepositGuideText,
|
||||
renderDepositSupportMessageText,
|
||||
} from '@/utils/depositGuideText'
|
||||
import { useSettingsStore } from '@/store/settingsStore'
|
||||
|
||||
export type SupportMessengerType =
|
||||
| 'bale'
|
||||
@@ -8,23 +20,24 @@ export type SupportMessengerType =
|
||||
| 'rubika'
|
||||
| 'eitaa'
|
||||
| 'soroush'
|
||||
|
||||
export interface SupportMessengerEntry {
|
||||
messenger: string
|
||||
id: string
|
||||
}
|
||||
| 'call'
|
||||
| 'sms'
|
||||
|
||||
export interface SupportMessengerSettings {
|
||||
messengers?: SupportMessengerEntry[]
|
||||
messenger?: SupportMessengerType | string
|
||||
messengerId?: string
|
||||
messengerText?: string
|
||||
depositSupportMessageText?: string
|
||||
depositAccountHolder?: string
|
||||
depositCardNumber?: string
|
||||
depositSheba?: string
|
||||
depositSmsSupportNumber?: string
|
||||
}
|
||||
|
||||
export interface SupportMessengerMeta {
|
||||
label: string
|
||||
icon: string
|
||||
accent: string
|
||||
export interface SupportMessengerEntry {
|
||||
messenger: string
|
||||
id: string
|
||||
}
|
||||
|
||||
export interface ResolvedSupportMessengerEntry extends SupportMessengerEntry {
|
||||
@@ -34,9 +47,6 @@ export interface ResolvedSupportMessengerEntry extends SupportMessengerEntry {
|
||||
url: string
|
||||
}
|
||||
|
||||
export const supportMessengerSettings = ref<SupportMessengerSettings>({})
|
||||
export const supportMessengerPickerOpen = ref(false)
|
||||
|
||||
const VALID_SUPPORT_MESSENGERS = new Set([
|
||||
'bale',
|
||||
'telegram',
|
||||
@@ -44,27 +54,16 @@ const VALID_SUPPORT_MESSENGERS = new Set([
|
||||
'rubika',
|
||||
'eitaa',
|
||||
'soroush',
|
||||
'call',
|
||||
'sms',
|
||||
])
|
||||
|
||||
export const SUPPORT_MESSENGER_META: Record<string, SupportMessengerMeta> = {
|
||||
bale: { label: 'بله', icon: 'vuesax-linear:messages-2', accent: '#16a34a' },
|
||||
telegram: { label: 'تلگرام', icon: 'vuesax-linear:send-2', accent: '#0ea5e9' },
|
||||
whatsapp: { label: 'واتساپ', icon: 'vuesax-linear:whatsapp', accent: '#22c55e' },
|
||||
rubika: { label: 'روبیکا', icon: 'vuesax-linear:messages-2', accent: '#7c3aed' },
|
||||
eitaa: { label: 'ایتا', icon: 'vuesax-linear:messages-2', accent: '#f59e0b' },
|
||||
soroush: { label: 'سروش', icon: 'vuesax-linear:messages-2', accent: '#2563eb' },
|
||||
}
|
||||
const PHONE_NATIVE_MESSENGERS = new Set(['call', 'sms'])
|
||||
|
||||
function getSupportSettingValue(
|
||||
settings: Array<{ key?: string; value?: unknown }>,
|
||||
key: string,
|
||||
) {
|
||||
const setting = settings.find((item) => item?.key === key)
|
||||
if (!setting) return ''
|
||||
const value = setting.value
|
||||
if (value === undefined || value === null) return ''
|
||||
return String(value).trim()
|
||||
}
|
||||
export const supportMessengerSettings = ref<SupportMessengerSettings>({})
|
||||
export const supportMessengerPickerOpen = ref(false)
|
||||
/** لنگر منوی انتخاب پیامرسان — FAB یا دکمه داخل مودال شارژ */
|
||||
export const supportMessengerPickerAnchor = ref<HTMLElement | null>(null)
|
||||
|
||||
export function parseSupportMessengersJson(raw?: string | null): SupportMessengerEntry[] {
|
||||
const value = (raw ?? '').trim()
|
||||
@@ -101,54 +100,13 @@ export function resolveSupportMessengersFromSettings(
|
||||
return [{ messenger, id: legacyId }]
|
||||
}
|
||||
|
||||
export function resolveSupportMessengerMeta(messenger?: string): SupportMessengerMeta {
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
return SUPPORT_MESSENGER_META[type] ?? {
|
||||
label: 'پشتیبانی',
|
||||
icon: 'vuesax-linear:headphone',
|
||||
accent: '#334155',
|
||||
}
|
||||
}
|
||||
|
||||
export function buildSupportMessengerUrl(
|
||||
messenger?: string,
|
||||
messengerId?: string,
|
||||
) {
|
||||
const id = (messengerId ?? '').trim()
|
||||
if (!id) return ''
|
||||
|
||||
if (/^https?:\/\//i.test(id)) return id
|
||||
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
const username = id.replace(/^@/, '')
|
||||
|
||||
if (!type) return ''
|
||||
|
||||
switch (type) {
|
||||
case 'bale':
|
||||
if (id.includes('ble.ir')) {
|
||||
return id.startsWith('http') ? id : `https://${id.replace(/^\/\//, '')}`
|
||||
}
|
||||
return `https://ble.ir/${username}`
|
||||
case 'telegram':
|
||||
return `https://t.me/${username}`
|
||||
case 'whatsapp':
|
||||
return `https://wa.me/${username.replace(/\D/g, '')}`
|
||||
case 'rubika':
|
||||
return `https://rubika.ir/${username}`
|
||||
case 'eitaa':
|
||||
return `https://eitaa.com/${username}`
|
||||
case 'soroush':
|
||||
return `https://splus.ir/splus/${username}`
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
/** فقط موارد موجود در `support_messengers` — تماس/پیامک خودکار اضافه نمیشوند */
|
||||
export function resolveSupportMessengerEntries(
|
||||
settings?: SupportMessengerSettings,
|
||||
messageText?: string,
|
||||
): ResolvedSupportMessengerEntry[] {
|
||||
const resolved = settings ?? supportMessengerSettings.value
|
||||
const text = (messageText ?? '').trim()
|
||||
const source = resolved.messengers?.length
|
||||
? resolved.messengers
|
||||
: resolveLegacySingleMessenger(resolved)
|
||||
@@ -156,9 +114,13 @@ export function resolveSupportMessengerEntries(
|
||||
return source
|
||||
.map((entry) => {
|
||||
const meta = resolveSupportMessengerMeta(entry.messenger)
|
||||
const url = buildSupportMessengerUrl(entry.messenger, entry.id)
|
||||
const url = buildSupportMessengerUrl(entry.messenger, entry.id, text)
|
||||
if (!url) return null
|
||||
return { ...entry, ...meta, url }
|
||||
return {
|
||||
...entry,
|
||||
...meta,
|
||||
url,
|
||||
}
|
||||
})
|
||||
.filter((entry): entry is ResolvedSupportMessengerEntry => entry !== null)
|
||||
}
|
||||
@@ -171,25 +133,260 @@ function resolveLegacySingleMessenger(settings: SupportMessengerSettings): Suppo
|
||||
return [{ messenger, id }]
|
||||
}
|
||||
|
||||
export async function openSupportMessengerEntry(entry: ResolvedSupportMessengerEntry | SupportMessengerEntry) {
|
||||
const url = 'url' in entry && entry.url
|
||||
? entry.url
|
||||
: buildSupportMessengerUrl(entry.messenger, entry.id)
|
||||
/** @deprecated از depositGuideText استفاده کنید */
|
||||
export const DEFAULT_SUPPORT_MESSENGER_TEXT = DEFAULT_DEPOSIT_GUIDE_TEXT
|
||||
|
||||
export interface SupportMessengerMeta {
|
||||
label: string
|
||||
icon: string
|
||||
accent: string
|
||||
}
|
||||
|
||||
export const SUPPORT_MESSENGER_META: Record<string, SupportMessengerMeta> = {
|
||||
bale: { label: 'بله', icon: 'vuesax-linear:messages-2', accent: '#16a34a' },
|
||||
telegram: { label: 'تلگرام', icon: 'vuesax-linear:send-2', accent: '#0ea5e9' },
|
||||
whatsapp: { label: 'واتساپ', icon: 'vuesax-linear:whatsapp', accent: '#22c55e' },
|
||||
rubika: { label: 'روبیکا', icon: 'vuesax-linear:messages-2', accent: '#7c3aed' },
|
||||
eitaa: { label: 'ایتا', icon: 'vuesax-linear:messages-2', accent: '#f59e0b' },
|
||||
soroush: { label: 'سروش', icon: 'vuesax-linear:messages-2', accent: '#2563eb' },
|
||||
call: { label: 'تماس', icon: 'vuesax-linear:call-calling', accent: '#10b981' },
|
||||
sms: { label: 'پیامک', icon: 'vuesax-linear:sms', accent: '#3b82f6' },
|
||||
}
|
||||
|
||||
export const DEFAULT_SUPPORT_MESSENGER_META: SupportMessengerMeta = {
|
||||
label: 'پشتیبانی',
|
||||
icon: 'vuesax-linear:headphone',
|
||||
accent: '#334155',
|
||||
}
|
||||
|
||||
export function resolveSupportMessengerMeta(messenger?: string): SupportMessengerMeta {
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
return SUPPORT_MESSENGER_META[type] ?? DEFAULT_SUPPORT_MESSENGER_META
|
||||
}
|
||||
|
||||
export function resolveSupportMessengerLink(
|
||||
messenger?: string,
|
||||
messengerId?: string,
|
||||
fallbackLink = '',
|
||||
messageText?: string,
|
||||
) {
|
||||
const fromSettings = buildSupportMessengerUrl(messenger, messengerId, messageText)
|
||||
return fromSettings || fallbackLink
|
||||
}
|
||||
|
||||
export function getDepositGuideVarsFromSupportSettings(
|
||||
settings: SupportMessengerSettings,
|
||||
): DepositGuideVars {
|
||||
return {
|
||||
accountHolder: settings.depositAccountHolder,
|
||||
cardNumber: settings.depositCardNumber,
|
||||
sheba: settings.depositSheba,
|
||||
customerName: getCustomerNameFromUser(),
|
||||
}
|
||||
}
|
||||
|
||||
export function resolveDepositGuideText(settings?: SupportMessengerSettings): string {
|
||||
try {
|
||||
const fromStore = getRenderedDepositGuideText()
|
||||
if (fromStore.trim()) return fromStore
|
||||
} catch {
|
||||
// settings store may not be ready
|
||||
}
|
||||
|
||||
const resolved = settings ?? supportMessengerSettings.value
|
||||
const template = resolved.messengerText?.trim() || DEFAULT_DEPOSIT_GUIDE_TEXT
|
||||
const vars = resolved.depositAccountHolder
|
||||
? getDepositGuideVarsFromSupportSettings(resolved)
|
||||
: getDepositGuideVarsFromSettings()
|
||||
|
||||
return renderDepositGuideText(template, vars)
|
||||
}
|
||||
|
||||
export function resolveDepositSupportMessage(settings?: SupportMessengerSettings): string {
|
||||
try {
|
||||
const fromStore = getRenderedDepositSupportMessage()
|
||||
if (fromStore.trim()) return fromStore
|
||||
} catch {
|
||||
// settings store may not be ready
|
||||
}
|
||||
|
||||
const resolved = settings ?? supportMessengerSettings.value
|
||||
const rawTemplate = resolved.depositSupportMessageText?.trim() || ''
|
||||
const template = rawTemplate || getDepositSupportMessageTemplate()
|
||||
const vars = resolved.depositAccountHolder
|
||||
? getDepositGuideVarsFromSupportSettings(resolved)
|
||||
: getDepositGuideVarsFromSettings()
|
||||
|
||||
return renderDepositSupportMessageText(template, vars)
|
||||
}
|
||||
|
||||
/** پیامرسانهایی که پارامتر text در URL دارند */
|
||||
export function messengerSupportsUrlText(messenger?: string): boolean {
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
return type === 'telegram' || type === 'whatsapp' || type === 'sms'
|
||||
}
|
||||
|
||||
/** تماس/پیام بومی — نیازی به کپی متن در کلیپبورد نیست */
|
||||
export function isPhoneNativeSupportMessenger(messenger?: string): boolean {
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
return PHONE_NATIVE_MESSENGERS.has(type)
|
||||
}
|
||||
|
||||
export function messengerNeedsClipboardCopy(messenger?: string): boolean {
|
||||
if (isPhoneNativeSupportMessenger(messenger) || messengerSupportsUrlText(messenger)) {
|
||||
return false
|
||||
}
|
||||
return Boolean((messenger ?? '').trim())
|
||||
}
|
||||
|
||||
export async function openSupportMessengerWithMessage(
|
||||
messenger?: string,
|
||||
messengerId?: string,
|
||||
messageText?: string,
|
||||
fallbackLink = '',
|
||||
): Promise<boolean> {
|
||||
const text = (messageText ?? '').trim()
|
||||
const url =
|
||||
buildSupportMessengerUrl(messenger, messengerId, text) ||
|
||||
(fallbackLink.trim() || '')
|
||||
|
||||
return openSupportMessengerUrl(url, messenger, text)
|
||||
}
|
||||
|
||||
export async function openSupportMessengerEntry(
|
||||
entry: SupportMessengerEntry | ResolvedSupportMessengerEntry,
|
||||
messageText?: string,
|
||||
fallbackLink = '',
|
||||
): Promise<boolean> {
|
||||
const text = (messageText ?? '').trim()
|
||||
// همیشه URL را با متن فعلی بساز — url کششدهٔ entry ممکن است text قدیمی داشته باشد
|
||||
const url =
|
||||
buildSupportMessengerUrl(entry.messenger, entry.id, text) ||
|
||||
('url' in entry && !text ? entry.url : '') ||
|
||||
fallbackLink.trim()
|
||||
|
||||
return openSupportMessengerUrl(url, entry.messenger, text)
|
||||
}
|
||||
|
||||
async function openSupportMessengerUrl(
|
||||
url: string,
|
||||
messenger?: string,
|
||||
messageText?: string,
|
||||
): Promise<boolean> {
|
||||
if (!url) return false
|
||||
|
||||
if (messageText && messengerNeedsClipboardCopy(messenger) && navigator.clipboard?.writeText) {
|
||||
try {
|
||||
await navigator.clipboard.writeText(messageText)
|
||||
} catch {
|
||||
// clipboard optional
|
||||
}
|
||||
}
|
||||
|
||||
if (url.startsWith('tel:') || url.startsWith('sms:')) {
|
||||
window.location.href = url
|
||||
return true
|
||||
}
|
||||
|
||||
window.open(url, '_blank', 'noopener,noreferrer')
|
||||
return true
|
||||
}
|
||||
|
||||
export async function loadSupportMessengerFromSettings() {
|
||||
function getSupportSettingValue(
|
||||
settings: Array<{ key?: string; is_active?: boolean | number; value?: unknown }>,
|
||||
key: string
|
||||
) {
|
||||
const setting = settings.find((item) => item?.key === key)
|
||||
if (!setting) return ''
|
||||
|
||||
const value = setting.value
|
||||
if (value === undefined || value === null) return ''
|
||||
|
||||
return String(value).trim()
|
||||
}
|
||||
|
||||
export function buildSupportMessengerUrl(
|
||||
messenger?: string,
|
||||
messengerId?: string,
|
||||
messageText?: string,
|
||||
) {
|
||||
const id = (messengerId ?? '').trim()
|
||||
if (!id) return ''
|
||||
|
||||
if (/^https?:\/\//i.test(id)) return id
|
||||
|
||||
const type = (messenger ?? '').trim().toLowerCase()
|
||||
const username = id.replace(/^@/, '')
|
||||
const text = (messageText ?? '').trim()
|
||||
const textQuery = text ? `?text=${encodeURIComponent(text)}` : ''
|
||||
|
||||
if (!type) return ''
|
||||
|
||||
switch (type) {
|
||||
case 'bale':
|
||||
if (id.includes('ble.ir')) {
|
||||
return id.startsWith('http') ? id : `https://${id.replace(/^\/\//, '')}`
|
||||
}
|
||||
return `https://ble.ir/${username}`
|
||||
case 'telegram':
|
||||
return `https://t.me/${username}${textQuery}`
|
||||
case 'whatsapp':
|
||||
return `https://wa.me/${username.replace(/\D/g, '')}${textQuery}`
|
||||
case 'rubika':
|
||||
return `https://rubika.ir/${username}`
|
||||
case 'eitaa':
|
||||
return `https://eitaa.com/${username}`
|
||||
case 'soroush':
|
||||
return `https://splus.ir/splus/${username}`
|
||||
case 'call':
|
||||
return buildSupportPhoneUrl(id)
|
||||
case 'sms':
|
||||
return buildDepositSmsUrl(id, text)
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
export function buildDepositSmsUrl(phoneNumber?: string, messageText?: string) {
|
||||
const digits = (phoneNumber ?? '').replace(/\D/g, '')
|
||||
if (!digits) return ''
|
||||
|
||||
const body = (messageText ?? '').trim()
|
||||
// بدون پیشنویس مگر صریحاً متن داده شود (مودال واریز)
|
||||
if (!body) return `sms:${digits}`
|
||||
return `sms:${digits}?body=${encodeURIComponent(body)}`
|
||||
}
|
||||
|
||||
export function buildSupportPhoneUrl(phoneNumber?: string) {
|
||||
const digits = (phoneNumber ?? '').replace(/\D/g, '')
|
||||
if (!digits) return ''
|
||||
return `tel:${digits}`
|
||||
}
|
||||
|
||||
export async function loadSupportMessengerFromSettings(forceSettingsRefresh = false) {
|
||||
try {
|
||||
const settingsStore = useSettingsStore()
|
||||
if (forceSettingsRefresh) {
|
||||
await settingsStore.fetchSettings(true)
|
||||
} else if (!settingsStore.loaded) {
|
||||
await settingsStore.fetchSettings()
|
||||
}
|
||||
|
||||
const settings = await getSettings()
|
||||
if (!settings || !Array.isArray(settings)) return
|
||||
|
||||
settingsStore.mergeSettings(settings)
|
||||
|
||||
supportMessengerSettings.value = {
|
||||
messengers: resolveSupportMessengersFromSettings(settings),
|
||||
messenger: getSupportSettingValue(settings, 'support_messenger'),
|
||||
messengerId: getSupportSettingValue(settings, 'support_messenger_id'),
|
||||
messengerText: getSupportSettingValue(settings, 'support_messenger_text'),
|
||||
depositSupportMessageText: getSupportSettingValue(settings, 'deposit_support_message_text'),
|
||||
depositAccountHolder: getSupportSettingValue(settings, 'deposit_account_holder'),
|
||||
depositCardNumber: getSupportSettingValue(settings, 'deposit_card_number'),
|
||||
depositSheba: getSupportSettingValue(settings, 'deposit_sheba'),
|
||||
depositSmsSupportNumber: getSupportSettingValue(settings, 'deposit_sms_support_number'),
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
|
||||
Reference in New Issue
Block a user