This commit is contained in:
2026-06-17 17:39:41 +03:30
parent 8fea618b18
commit 137f793ae0
9 changed files with 124 additions and 125 deletions
+3
View File
@@ -20,8 +20,10 @@ declare module 'vue' {
ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup']
ASelect: typeof import('ant-design-vue/es')['Select']
ASelectOption: typeof import('ant-design-vue/es')['SelectOption']
ASlider: typeof import('ant-design-vue/es')['Slider']
ASpin: typeof import('ant-design-vue/es')['Spin']
ASwitch: typeof import('ant-design-vue/es')['Switch']
ATag: typeof import('ant-design-vue/es')['Tag']
ATextarea: typeof import('ant-design-vue/es')['Textarea']
ATooltip: typeof import('ant-design-vue/es')['Tooltip']
BaseDatePicker: typeof import('./src/components/BasicPacks/BaseDatePicker/src/BaseDatePicker.vue')['default']
@@ -68,5 +70,6 @@ declare module 'vue' {
TransactionSkeleton: typeof import('./src/components/TransactionSkeleton.vue')['default']
VanActionSheet: typeof import('vant/es')['ActionSheet']
VanDialog: typeof import('vant/es')['Dialog']
VanField: typeof import('vant/es')['Field']
}
}
+6
View File
@@ -7,6 +7,7 @@ import { setupRouterGuards } from '@/app/setupRouter'
import router from '@/router'
import { applyProjectTheme } from '@/utils/config'
import { useSettingsStore } from '@/store/settingsStore'
import { useUserStore } from '@/store/userStore'
import { getToken } from '@/utils'
type BootWindow = Window & {
@@ -93,9 +94,14 @@ export async function bootstrapApp() {
const { app } = createVueApp()
const settingsStore = useSettingsStore()
const userStore = useUserStore()
await withTimeout(settingsStore.fetchSettings(), 45000, 'Settings loading timeout')
if (getToken()) {
await withTimeout(userStore.getMyInfo(), 45000, 'User session loading timeout')
}
setupRouterGuards()
app.mount('#app')
-102
View File
@@ -12,8 +12,6 @@ import bazretalaNavLogo from '@/assets/img/bazretala-nav-logo.png'
import bazretalaFundBg from '@/assets/img/bazretala-fund-bg.png'
import bazretalaEmptyFund from '@/assets/img/bazretala-empty-fund.png'
import { useSettingsStore } from '@/store/settingsStore'
export function getConfigApp(key: string) {
const config = window.__APP_CONFIG__ ? window.__APP_CONFIG__.user:{}
@@ -241,103 +239,3 @@ export function applyProjectTheme() {
document.documentElement.style.setProperty('--App-brand-red-100', '#f0d8d8')
document.documentElement.style.setProperty('--App-brand-red-700', '#963130')
}
export function getReferralShareTitle(projectName?: string | null) {
return projectName ?? getConfigApp('name_fa') ?? getConfigApp('name') ?? 'طلا'
}
/** جایگزینی ٪نام / %نام و ٪لینک / %لینک در قالب متن دعوت */
export function renderInviteLinkText(
template: string,
options: { userName?: string | null; link?: string | null },
): string {
const userName = String(options.userName ?? '').trim()
const link = String(options.link ?? '').trim()
return template
.replace(/[%٪]\s*لینک/gu, link)
.replace(/[%٪]\s*نام/gu, userName)
}
function resolveReferralLoginLink(referralId?: string | number | null): string {
const id = String(referralId ?? '').trim()
if (!id) return ''
let base = ''
try {
base = String(useSettingsStore().getSettingByKey('app_url') ?? '').trim()
} catch {
base = ''
}
if (base) {
return `${base.replace(/\/+$/, '')}/login?id=${encodeURIComponent(id)}`
}
if (typeof window !== 'undefined' && window.location?.origin) {
return `${window.location.origin}/login?id=${encodeURIComponent(id)}`
}
return `/login?id=${encodeURIComponent(id)}`
}
export function getReferralShareText(options: {
userName?: string | null
projectName?: string | null
referralId?: string | number | null
}) {
const userName = options.userName ?? ''
const referralId = options.referralId ?? ''
const link = resolveReferralLoginLink(referralId)
const marketText = options.projectName
? `بازار طلای ${options.projectName}`
: 'بازار طلا'
let template = ''
try {
template = String(useSettingsStore().getSettingByKey('invite_link_text') ?? '').trim()
} catch {
template = ''
}
if (template) {
return renderInviteLinkText(template, { userName, link })
}
if (isBoursecuProject()) {
return `مس؛ فلز آینده جهان
⭐️ امروز در آینده مس سرمایه‌گذاری کن؛ ثمره آن را در سال‌های پیش رو برداشت کن!
رشد صنایع انرژی پاک، خودروهای برقی و زیرساخت‌های نوین، تقاضا برای مس را در سال‌های آینده افزایش خواهد داد.
با سرمایه‌گذاری تدریجی و مستمر در بازار مس، از رشد بلندمدت یکی از مهم‌ترین فلزات استراتژیک جهان بهره‌مند شوید.
این دعوت‌نامه از طرف «${userName}» برای شما ارسال شده است تا شما نیز از فرصت‌های سرمایه‌گذاری در بورس مس جا نمانید.
برای مشاهده قیمت‌ها، تحلیل بازار و تکمیل ثبت‌نام، روی لینک زیر کلیک کنید
${link}`
}
if (isBazretalaProject()) {
return `️سلام به مناسبت افتتاحیه بذرطلا وایّام عیدغدیر ومباهله با ثبت نام آنلاین واَمن بدون کارمزد0/5% از بذرطلا با تائیدمُعرف خرید کنید و نذارین پول خُرداتون خاک بخوره (عضویت فقط ازطریق مُعرف امکان پذیرمیباشد)
بذرش کن بکار،پس اندازکن هروقت خواستی
طلا برداشت کن بدون مالیات
با پول های کوچک و بیکارت
ی پس انداز طلایی برای خودت و خونوادت درست کن ما در بذرطلا آنلاین کنارت هستیم
این دعوت نامه از طرف "${userName}" عضوفعالِ اَپ بذرطلا برای شما ارسال شده تا شما هم از کاشت بذر طلای خودتون جا نمونید.
روی لینک زیر کلیک کنید و کاشت بذرطلای خودتونو با ثبت نام و خرید اول تکمیل کنید.
${link}`
}
return `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "${userName}" عزیز برای شما ارسال شده تا شما هم از ${marketText} جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
${link}`
}
+95
View File
@@ -0,0 +1,95 @@
import { message } from 'ant-design-vue'
import { useSettingsStore } from '@/store/settingsStore'
import { getConfigApp } from '@/utils/config'
export function getReferralShareTitle(projectName?: string | null) {
return projectName ?? getConfigApp('name_fa') ?? getConfigApp('name') ?? 'طلا'
}
export const DEFAULT_INVITE_LINK_TEXT = `⭐️الان طلا بخر؛ آخر ماه سودشو ببر!
با خرید طلای آبشده در مقدارهای کم ولی مستمر، سود بیشتری ببر!
این دعوت نامه از طرف "٪نام" عزیز برای شما ارسال شده تا شما هم از بازار طلای ما جا نمونید.
روی لینک زیر کلیک کنید و ثبت نام خود را تکمیل کنید.
٪لینک`
export function getInviteLinkTemplate(): string {
try {
const fromSettings = String(useSettingsStore().getSettingByKey('invite_link_text') ?? '').trim()
if (fromSettings) {
return fromSettings
}
} catch {
// settings store may not be ready yet
}
return DEFAULT_INVITE_LINK_TEXT
}
/** جایگزینی ٪نام / %نام و ٪لینک / %لینک در قالب متن دعوت */
export function renderInviteLinkText(
template: string,
options: { userName?: string | null; link?: string | null },
): string {
const userName = String(options.userName ?? '').trim()
const link = String(options.link ?? '').trim()
return template
.replace(/[%٪]\s*لینک/gu, link)
.replace(/[%٪]\s*نام/gu, userName)
}
function resolveReferralLoginLink(referralId?: string | number | null): string {
const id = String(referralId ?? '').trim()
if (!id) return ''
let base = ''
try {
base = String(useSettingsStore().getSettingByKey('app_url') ?? '').trim()
} catch {
base = ''
}
if (base) {
return `${base.replace(/\/+$/, '')}/login?id=${encodeURIComponent(id)}`
}
if (typeof window !== 'undefined' && window.location?.origin) {
return `${window.location.origin}/login?id=${encodeURIComponent(id)}`
}
return `/login?id=${encodeURIComponent(id)}`
}
export function getReferralShareText(options: {
userName?: string | null
projectName?: string | null
referralId?: string | number | null
}) {
const userName = options.userName ?? ''
const link = resolveReferralLoginLink(options.referralId)
return renderInviteLinkText(getInviteLinkTemplate(), { userName, link })
}
export async function shareReferralText(text: string, title?: string | null): Promise<void> {
const shareTitle = title ?? getReferralShareTitle()
if (typeof navigator !== 'undefined' && typeof navigator.share === 'function') {
try {
await navigator.share({ title: shareTitle, text })
return
} catch (err) {
if ((err as Error)?.name === 'AbortError') {
return
}
}
}
if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {
await navigator.clipboard.writeText(text)
message.info('متن دعوتنامه رونوشت شد')
return
}
message.error('اشتراک‌گذاری در این مرورگر پشتیبانی نمی‌شود')
}
@@ -4,7 +4,7 @@ import { getEarnMoney } from '@/api/earnMoney'
import type { EarnMoney } from '@/models/earnMoney'
import { useUserStore } from '@/store/userStore'
import { useConfigStore } from '@/store/configStore'
import { getReferralShareText, getReferralShareTitle } from '@/utils/config'
import { getReferralShareText, getReferralShareTitle, shareReferralText } from '@/utils/referralShare'
import { loading } from '@/utils'
export interface EarnMoneyPageContext {
@@ -44,10 +44,7 @@ export function useEarnMoneyPage() {
projectName: nameProject,
referralId: userStore.userInfo?.referral_id,
})
navigator.share({
title: getReferralShareTitle(nameProject),
text: val,
})
void shareReferralText(val, getReferralShareTitle(nameProject))
}
async function loadEarnMoney() {
@@ -35,7 +35,7 @@
import { useUserStore } from '@/store/userStore'
import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import { message } from 'ant-design-vue'
import { getReferralShareText, getReferralShareTitle } from '@/utils/config'
import { getReferralShareText, getReferralShareTitle, shareReferralText } from '@/utils/referralShare'
const userStore = useUserStore()
@@ -45,7 +45,7 @@ const shareCode = () => {
referralId: userStore.userInfo?.referral_id,
})
navigator.share({ title: getReferralShareTitle(), text })
void shareReferralText(text, getReferralShareTitle())
}
const copyCode = () => {
@@ -40,7 +40,7 @@ import BasicModal from '@/components/BasicPacks/BasicModal.vue'
import BasicButton from '@/components/BasicPacks/BasicButton.vue'
import { message } from 'ant-design-vue'
import { useUserStore } from '@/store/userStore'
import { getReferralShareText, getReferralShareTitle } from '@/utils/config'
import { getReferralShareText, getReferralShareTitle, shareReferralText } from '@/utils/referralShare'
const props = withDefaults(
defineProps<{
@@ -69,7 +69,7 @@ const shareCode = () => {
referralId: props.referralId,
})
navigator.share({ title: getReferralShareTitle(), text })
void shareReferralText(text, getReferralShareTitle())
}
const copyCode = () => {
@@ -15,7 +15,7 @@ import { useConfigStore } from '@/store/configStore'
import { getTradeBuyPrice, lastPrice, stopLastPricePolling } from '@/utils/price'
import { getStoreClosedMessage, isStoreClosed } from '@/utils/storeHours'
import { message, Modal } from 'ant-design-vue'
import { getReferralShareText, getReferralShareTitle } from '@/utils/config'
import { getReferralShareText, getReferralShareTitle, shareReferralText } from '@/utils/referralShare'
import { useBanners } from './useBanners'
import { usePriceChart, type ChartMetalType } from './usePriceChart'
import type { HomeActionItem } from '../layouts/types'
@@ -122,14 +122,7 @@ export function useHomePage() {
referralId: userStore.userInfo?.referral_id,
})
try {
await navigator.share({
title: getReferralShareTitle(configStore.config.name),
text,
})
} catch {
copyCode()
}
await shareReferralText(text, getReferralShareTitle(configStore.config.name))
}
function copyCode() {
+12 -5
View File
@@ -14,7 +14,8 @@ import { updateMe, updatePass } from '@/api/me'
import { useUserStore } from '@/store/userStore'
import { getUserAvatarUrl } from '@/utils/file'
import { useConfigStore } from '@/store/configStore'
import { getConfigApp, getReferralShareText, getReferralShareTitle, isBoursecuProject, getBoursecuActionIconSrc } from '@/utils/config'
import { getConfigApp, isBoursecuProject, getBoursecuActionIconSrc } from '@/utils/config'
import { getReferralShareText, getReferralShareTitle, shareReferralText } from '@/utils/referralShare'
export interface UserMenuAction {
id: string
@@ -199,10 +200,7 @@ export function useUserPage() {
projectName: nameProject,
referralId: userStore.userInfo?.referral_id,
})
navigator.share({
title: getReferralShareTitle(nameProject),
text: val,
})
void shareReferralText(val, getReferralShareTitle(nameProject))
}
function ok() {
@@ -246,6 +244,15 @@ export function useUserPage() {
}
})
watch(
() => userStore.userInfo,
(info) => {
if (!info) return
setForm()
},
{ immediate: true },
)
const context: UserPageContext = {
userStore,
userFormState,