added chat 2

This commit is contained in:
2026-07-30 18:30:32 +03:30
parent 99698e345a
commit f4733214ed
26 changed files with 6921 additions and 53 deletions
File diff suppressed because it is too large Load Diff
+55 -1
View File
@@ -55,6 +55,9 @@ export const appNotificationEnabledSetting = ref(true)
/** reactive — منبع قیمت فعال (montzar / zaarbox / main_product) */
export const priceProviderSetting = ref('')
/** reactive — منوی افقی / دکمه «چت پشتیبانی» */
export const supportChatMenuEnabledSetting = ref(false)
export const accountingProviderSetting = ref<AccountingProvider>('none')
let tahesabEnabledFromSettings: boolean | null = null
@@ -65,7 +68,7 @@ let accountingProviderFromSettings: AccountingProvider | null = null
function isSwitchOn(value: string | undefined | null): boolean {
const v = (value ?? '').trim().toLowerCase()
return v === 'true' || v === '1' || v === 'yes'
return v === 'true' || v === '1' || v === 'yes' || v === 'activate'
}
function normalizeAccountingProvider(value: string | undefined | null): AccountingProvider {
@@ -146,6 +149,56 @@ export function setAppNotificationEnabledFromSettings(value: boolean): void {
appNotificationEnabledSetting.value = value
}
export function setSupportChatMenuEnabledFromSettings(value: boolean): void {
supportChatMenuEnabledSetting.value = value
}
let lastShowToUsersChat = ''
let lastHasChat = ''
let lastChatApi = ''
/** منوی چت: show_to_users_chat + has_chat + chat_api */
export function resolveSupportChatMenuEnabled(
getValue: (key: string) => string | undefined | null
): boolean {
const api = String(getValue('chat_api') ?? '').trim()
return (
isSwitchOn(getValue('show_to_users_chat')) &&
isSwitchOn(getValue('has_chat')) &&
Boolean(api) &&
api.toLowerCase() !== 'null'
)
}
export function applySupportChatMenuEnabledFromRows(
rows: Array<{ key?: string; value?: string | null }>
): void {
let touched = false
for (const row of rows) {
const key = String(row.key ?? '')
if (key === 'show_to_users_chat') {
lastShowToUsersChat = String(row.value ?? '')
touched = true
} else if (key === 'has_chat') {
lastHasChat = String(row.value ?? '')
touched = true
} else if (key === 'chat_api') {
lastChatApi = String(row.value ?? '')
touched = true
}
}
if (!touched) return
setSupportChatMenuEnabledFromSettings(
resolveSupportChatMenuEnabled((key) => {
if (key === 'show_to_users_chat') return lastShowToUsersChat
if (key === 'has_chat') return lastHasChat
if (key === 'chat_api') return lastChatApi
return undefined
})
)
}
export function setPriceProviderFromSettings(value?: string | null): void {
priceProviderSetting.value = (value ?? '').trim().toLowerCase()
}
@@ -217,6 +270,7 @@ async function bootstrapSettingsFromApi(): Promise<void> {
applyConditionalOrderEnabledFromRows(list)
applyPriceTriggerEnabledFromRows(list)
applyAppNotificationEnabledFromRows(list)
applySupportChatMenuEnabledFromRows(list)
applyPriceProviderFromRows(list)
setCachedMainMetal(mainMetalRow?.value)
const { setCachedMainWalletProductIds } = await import('@/components/mobile/utils/wallet')
+24 -1
View File
@@ -23,4 +23,27 @@ export function removeToken() {
}
export function hotSelect(e: any) {
e.target?.select()
}
}
export const createUuid = () => {
if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
return crypto.randomUUID()
}
if (typeof crypto !== 'undefined' && typeof crypto.getRandomValues === 'function') {
const bytes = new Uint8Array(16)
crypto.getRandomValues(bytes)
bytes[6] = (bytes[6] & 0x0f) | 0x40
bytes[8] = (bytes[8] & 0x3f) | 0x80
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')
return [
hex.slice(0, 8),
hex.slice(8, 12),
hex.slice(12, 16),
hex.slice(16, 20),
hex.slice(20),
].join('-')
}
return `${Date.now()}-${Math.floor(Math.random() * 1e9)}`
}
+5
View File
@@ -0,0 +1,5 @@
/** true / 1 / yes / activate */
export function isSettingFlagOn(value: unknown): boolean {
const v = String(value ?? '').trim().toLowerCase()
return v === 'true' || v === '1' || v === 'yes' || v === 'activate'
}