297 lines
9.1 KiB
TypeScript
297 lines
9.1 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { message } from 'ant-design-vue'
|
|
import { useRoute, useRouter } from 'vue-router'
|
|
import {
|
|
buildDepositSmsUrl,
|
|
buildSupportPhoneUrl,
|
|
loadSupportMessengerFromSettings,
|
|
messengerNeedsClipboardCopy,
|
|
openSupportMessengerEntry,
|
|
resolveDepositGuideText,
|
|
resolveDepositSupportMessage,
|
|
resolveSupportMessengerEntries,
|
|
resolveSupportMessengerLink,
|
|
resolveSupportMessengerMeta,
|
|
supportMessengerPickerAnchor,
|
|
supportMessengerPickerOpen,
|
|
supportMessengerSettings,
|
|
type ResolvedSupportMessengerEntry,
|
|
} from '@/utils/supportMessenger'
|
|
import {
|
|
copyDepositFieldValue,
|
|
displayDepositCardNumber,
|
|
displayDepositSheba,
|
|
getDepositGuideVarsFromSettings,
|
|
getDepositSettingLabel,
|
|
hasDepositFieldValue,
|
|
} from '@/utils/depositGuideText'
|
|
import { useSettingsStore } from '@/store/settingsStore'
|
|
import { isUserSupportChatEnabled } from '@/utils/chat'
|
|
|
|
/** plain: منوی شناور / درباره ما — بدون پیشمتن | deposit: مودال واریز — با deposit_support_message_text */
|
|
type SupportPickerIntent = 'plain' | 'deposit'
|
|
|
|
const CHAT_PICKER_ENTRY: ResolvedSupportMessengerEntry = {
|
|
messenger: 'chat',
|
|
id: 'support-chat',
|
|
label: 'چت پشتیبانی',
|
|
icon: 'vuesax-linear:messages-2',
|
|
accent: '#16a34a',
|
|
url: '',
|
|
}
|
|
|
|
export function useSupportMessenger() {
|
|
const settingsStore = useSettingsStore()
|
|
const router = useRouter()
|
|
const route = useRoute()
|
|
const supportPickerOpen = supportMessengerPickerOpen
|
|
const supportPickerIntent = ref<SupportPickerIntent>('plain')
|
|
|
|
/** چت فقط بعد از لاگین — روی صفحه ورود در picker نیاید */
|
|
const isChatEnabled = computed(() => {
|
|
void route.name
|
|
return isUserSupportChatEnabled()
|
|
})
|
|
|
|
const legacySupportLink = computed(() => '')
|
|
|
|
const depositSupportMessage = computed(() => resolveDepositSupportMessage())
|
|
|
|
const supportMessengerEntries = computed(() =>
|
|
resolveSupportMessengerEntries(supportMessengerSettings.value),
|
|
)
|
|
|
|
const pickerEntries = computed(() => {
|
|
const list = [...supportMessengerEntries.value]
|
|
if (isChatEnabled.value) {
|
|
list.unshift(CHAT_PICKER_ENTRY)
|
|
}
|
|
return list
|
|
})
|
|
|
|
const primaryMessengerEntry = computed(() => supportMessengerEntries.value[0] ?? null)
|
|
|
|
const messengerType = computed(
|
|
() => (primaryMessengerEntry.value?.messenger ?? supportMessengerSettings.value.messenger ?? '').trim().toLowerCase(),
|
|
)
|
|
|
|
const messengerMeta = computed(() => {
|
|
if (isChatEnabled.value && supportMessengerEntries.value.length === 0) {
|
|
return {
|
|
label: CHAT_PICKER_ENTRY.label,
|
|
icon: CHAT_PICKER_ENTRY.icon,
|
|
accent: CHAT_PICKER_ENTRY.accent,
|
|
}
|
|
}
|
|
return primaryMessengerEntry.value
|
|
? {
|
|
label: primaryMessengerEntry.value.label,
|
|
icon: primaryMessengerEntry.value.icon,
|
|
accent: primaryMessengerEntry.value.accent,
|
|
}
|
|
: resolveSupportMessengerMeta(messengerType.value)
|
|
})
|
|
|
|
const messengerLink = computed(() =>
|
|
primaryMessengerEntry.value?.url
|
|
|| resolveSupportMessengerLink(
|
|
supportMessengerSettings.value.messenger,
|
|
supportMessengerSettings.value.messengerId,
|
|
legacySupportLink.value,
|
|
),
|
|
)
|
|
|
|
function goToSupportChat() {
|
|
void router.push({ name: 'support' })
|
|
return true
|
|
}
|
|
|
|
async function openMessengerEntry(entry: ResolvedSupportMessengerEntry, text?: string) {
|
|
if (entry.messenger === 'chat') {
|
|
return goToSupportChat()
|
|
}
|
|
|
|
const messageText =
|
|
text !== undefined
|
|
? text.trim()
|
|
: supportPickerIntent.value === 'deposit'
|
|
? depositSupportMessage.value.trim()
|
|
: ''
|
|
const opened = await openSupportMessengerEntry(entry, messageText, legacySupportLink.value)
|
|
if (!opened) return false
|
|
|
|
if (messageText && messengerNeedsClipboardCopy(entry.messenger)) {
|
|
message.success('متن پیام کپی شد — در پیامرسان paste کنید')
|
|
}
|
|
return true
|
|
}
|
|
|
|
let supportPickerOpenedAt = 0
|
|
|
|
async function openSupportPicker(
|
|
intent: SupportPickerIntent,
|
|
anchorEl?: HTMLElement | null,
|
|
) {
|
|
supportPickerIntent.value = intent
|
|
if (anchorEl !== undefined) {
|
|
supportMessengerPickerAnchor.value = anchorEl
|
|
}
|
|
|
|
const draft =
|
|
intent === 'deposit' ? depositSupportMessage.value.trim() : ''
|
|
const messengerEntries = supportMessengerEntries.value
|
|
const entries = pickerEntries.value
|
|
|
|
// لیست خالی + چت خاموش → هیچکار
|
|
if (entries.length === 0) {
|
|
return false
|
|
}
|
|
|
|
// فقط چت (لیست پیامرسان خالی) → مستقیم چت
|
|
if (isChatEnabled.value && messengerEntries.length === 0) {
|
|
return goToSupportChat()
|
|
}
|
|
|
|
// فقط یک گزینه (چت یا یک پیامرسان) → مستقیم همان
|
|
if (entries.length === 1) {
|
|
return openMessengerEntry(entries[0], draft)
|
|
}
|
|
|
|
// چند گزینه (چت + لینکها یا چند پیامرسان) → منوی انتخاب
|
|
const now = Date.now()
|
|
if (supportPickerOpen.value) {
|
|
if (now - supportPickerOpenedAt < 450) return true
|
|
supportPickerOpen.value = false
|
|
return true
|
|
}
|
|
|
|
supportPickerOpen.value = true
|
|
supportPickerOpenedAt = now
|
|
return true
|
|
}
|
|
|
|
async function openSupportMessenger(anchorEl?: HTMLElement | null) {
|
|
return openSupportPicker('plain', anchorEl)
|
|
}
|
|
|
|
async function openDepositSupportMessenger(anchorEl?: HTMLElement | null) {
|
|
return openSupportPicker('deposit', anchorEl)
|
|
}
|
|
|
|
function handleSupportMessengerClick(event?: Event) {
|
|
const target = event?.currentTarget
|
|
const anchor = target instanceof HTMLElement ? target : null
|
|
void openSupportMessenger(anchor)
|
|
}
|
|
|
|
const depositSmsLink = computed(() =>
|
|
buildDepositSmsUrl(
|
|
supportMessengerSettings.value.depositSmsSupportNumber,
|
|
depositSupportMessage.value,
|
|
),
|
|
)
|
|
|
|
const supportPhoneLink = computed(() => {
|
|
const fromSettings = buildSupportPhoneUrl(
|
|
supportMessengerSettings.value.depositSmsSupportNumber,
|
|
)
|
|
if (fromSettings) return fromSettings
|
|
|
|
const legacy = legacySupportLink.value
|
|
if (legacy.startsWith('tel:') && legacy.length > 4) return legacy
|
|
|
|
return ''
|
|
})
|
|
|
|
const supportMessengerText = computed(() => resolveDepositGuideText())
|
|
|
|
const depositCardNumberRaw = computed(() => {
|
|
void settingsStore.settings
|
|
const fromMessenger = supportMessengerSettings.value.depositCardNumber?.trim()
|
|
if (fromMessenger) return fromMessenger
|
|
return String(getDepositGuideVarsFromSettings().cardNumber ?? '').trim()
|
|
})
|
|
|
|
const depositShebaRaw = computed(() => {
|
|
void settingsStore.settings
|
|
const fromMessenger = supportMessengerSettings.value.depositSheba?.trim()
|
|
if (fromMessenger) return fromMessenger
|
|
return String(getDepositGuideVarsFromSettings().sheba ?? '').trim()
|
|
})
|
|
|
|
const depositCardNumber = computed(() => displayDepositCardNumber(depositCardNumberRaw.value))
|
|
const depositSheba = computed(() => displayDepositSheba(depositShebaRaw.value))
|
|
|
|
const depositCardLabel = computed(() => {
|
|
void settingsStore.settings
|
|
return getDepositSettingLabel('deposit_card_number', 'شماره کارت واریز')
|
|
})
|
|
|
|
const depositShebaLabel = computed(() => {
|
|
void settingsStore.settings
|
|
return getDepositSettingLabel('deposit_sheba', 'شبا واریز')
|
|
})
|
|
|
|
const hasDepositCardValue = computed(() => hasDepositFieldValue(depositCardNumberRaw.value))
|
|
const hasDepositShebaValue = computed(() => hasDepositFieldValue(depositShebaRaw.value))
|
|
|
|
async function copyDepositCardNumber() {
|
|
await copyDepositFieldValue(
|
|
depositCardNumberRaw.value,
|
|
'card',
|
|
'شماره کارت ثبت نشده است',
|
|
)
|
|
}
|
|
|
|
async function copyDepositShebaNumber() {
|
|
await copyDepositFieldValue(
|
|
depositShebaRaw.value,
|
|
'sheba',
|
|
'شماره شبا ثبت نشده است',
|
|
)
|
|
}
|
|
|
|
const hasMessengerLink = computed(
|
|
() => isChatEnabled.value || supportMessengerEntries.value.length > 0,
|
|
)
|
|
const hasMultipleMessengers = computed(() => pickerEntries.value.length > 1)
|
|
const hasSupportPhoneLink = computed(() => !!supportPhoneLink.value)
|
|
const hasSupportActions = computed(() => hasSupportPhoneLink.value || hasMessengerLink.value)
|
|
const opensInNewTab = computed(() => /^https?:\/\//i.test(messengerLink.value))
|
|
|
|
return {
|
|
supportPickerOpen,
|
|
supportPickerAnchor: supportMessengerPickerAnchor,
|
|
supportMessengerEntries: pickerEntries,
|
|
isChatEnabled,
|
|
messengerType,
|
|
messengerMeta,
|
|
messengerLink,
|
|
supportPhoneLink,
|
|
depositSmsLink,
|
|
supportMessengerText,
|
|
depositSupportMessage,
|
|
depositCardNumber,
|
|
depositSheba,
|
|
depositCardNumberRaw,
|
|
depositShebaRaw,
|
|
depositCardLabel,
|
|
depositShebaLabel,
|
|
hasDepositCardValue,
|
|
hasDepositShebaValue,
|
|
copyDepositCardNumber,
|
|
copyDepositShebaNumber,
|
|
openSupportMessenger,
|
|
openDepositSupportMessenger,
|
|
openMessengerEntry,
|
|
handleSupportMessengerClick,
|
|
goToSupportChat,
|
|
hasMessengerLink,
|
|
hasMultipleMessengers,
|
|
hasSupportPhoneLink,
|
|
hasSupportActions,
|
|
opensInNewTab,
|
|
loadSupportMessengerFromSettings,
|
|
}
|
|
}
|