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('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, } }