From 7626453defbc3eb59167de2cdd8ab89313004de8 Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Tue, 20 Oct 2026 09:10:03 +0330 Subject: [PATCH] feat(user): identity gate for wallet/gift card and custom nav icons --- .../abshode-domain-lookup/learned-notes.md | 2 + components.d.ts | 1 + .../img/boursecu-price-trigger-icon.png | Bin 0 -> 4376 bytes src/assets/img/boursecu-rules-icon.png | Bin 0 -> 3799 bytes src/assets/img/boursecu-support-icon.png | Bin 0 -> 2438 bytes src/components/IdentityRequiredDialog.vue | 46 ++++++++++++++++++ src/layouts/config/navigation.ts | 16 +++++- src/utils/config.ts | 6 +++ src/utils/customerIdentity.ts | 4 ++ .../giftCard/composables/useGiftCardPage.ts | 10 ++++ src/views/base/giftCard/index.vue | 4 +- .../base/user/composables/useUserPage.ts | 2 + .../base/wallet/composables/useWalletPage.ts | 12 +++++ src/views/base/wallet/index.vue | 4 ++ 14 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 src/assets/img/boursecu-price-trigger-icon.png create mode 100644 src/assets/img/boursecu-rules-icon.png create mode 100644 src/assets/img/boursecu-support-icon.png create mode 100644 src/components/IdentityRequiredDialog.vue create mode 100644 src/utils/customerIdentity.ts diff --git a/.cursor/skills/abshode-domain-lookup/learned-notes.md b/.cursor/skills/abshode-domain-lookup/learned-notes.md index 9c88df0..2f690f6 100644 --- a/.cursor/skills/abshode-domain-lookup/learned-notes.md +++ b/.cursor/skills/abshode-domain-lookup/learned-notes.md @@ -3,6 +3,8 @@ فرمت هر خط: - YYYY-MM-DD | موضوع | مسیر فایل(ها) | نکتهٔ ۱ خطی +- 2026-10-19 | قفل احراز واریز/هدیه | `useWalletPage` + `useGiftCardPage` + `assertCustomerIdentityVerified` روی withdraw و giftcard/use | is_legal=0 دیالوگ می‌دهد و API هم رد می‌کند +- 2026-10-19 | آیکون پشتیبانی/هشدار/قوانین | `assets/img/boursecu-support-icon.png` + `price-trigger` + `rules` و `navigation.ts` / `useUserPage.ts` | آدمک=پشتیبانی، زنگ دلار=هشدار قیمت سایدبار، برگه=قوانین - 2026-09-08 | لیست کارت هدیه کاربر | `views/base/giftCard/` + `api/giftCard.ts` + سرور `GiftCardController::mine` / `GET customer/giftcard/mine` | زیر فرم: available (اختصاصی + عمومی use_once=0 تک‌کد) و history؛ تخفیف فقط نمایش/سبد نه giftcard/use - 2026-09-08 | تب کارت هدیه/تخفیف در تراکنش‌ها | `transactions/config/boursecuTabs.ts` + `useTransactionsPageData.ts` + `Item.vue` | fetchMode giftcard/discount از historyِ mine؛ واحد تخفیف٪/طلا در Item - 2026-09-08 | گیر کردن در لاگین بعد رفرش | `app/authBoot.ts` + `setupRouter.ts` | finger unlock در sessionStorage؛ بعد ۳دقیقه fingerprintChecked ریست؛ لاگین بدون userInfo نرود home diff --git a/components.d.ts b/components.d.ts index 99e0757..d4a22b5 100644 --- a/components.d.ts +++ b/components.d.ts @@ -56,6 +56,7 @@ declare module 'vue' { Format: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue')['default'] GoldDayCalculatorModal: typeof import('./src/components/GoldDayCalculatorModal.vue')['default'] GoldLoading: typeof import('./src/components/GoldLoading.vue')['default'] + IdentityRequiredDialog: typeof import('./src/components/IdentityRequiredDialog.vue')['default'] InstallButton: typeof import('./src/components/InstallButton.vue')['default'] ListAnim: typeof import('./src/components/ListAnim.vue')['default'] Mode: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue')['default'] diff --git a/src/assets/img/boursecu-price-trigger-icon.png b/src/assets/img/boursecu-price-trigger-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..aeaca9003d6e44aaa54962403ae59a445e649245 GIT binary patch literal 4376 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 + +
+ +
{{ message }}
+
+
+ + + diff --git a/src/layouts/config/navigation.ts b/src/layouts/config/navigation.ts index b5b7a35..b8fb80c 100644 --- a/src/layouts/config/navigation.ts +++ b/src/layouts/config/navigation.ts @@ -57,9 +57,21 @@ const BOURSECU_PRIMARY_NAV: AppNavItem[] = [ ] export const SECONDARY_NAV: AppNavItem[] = [ - { id: 'notifyTrigger', routeName: 'notifyTrigger', label: 'هشدار قیمت', icon: 'vuesax-linear:bill' }, + { + id: 'notifyTrigger', + routeName: 'notifyTrigger', + label: 'هشدار قیمت', + icon: 'vuesax-linear:bill', + iconSrc: getBoursecuActionIconSrc('priceTrigger'), + }, { id: 'about', routeName: 'about', label: 'درباره ما', icon: 'vuesax-linear:info-circle' }, - { id: 'rules', routeName: 'rules', label: 'قوانین و مقررات', icon: 'vuesax-linear:task' }, + { + id: 'rules', + routeName: 'rules', + label: 'قوانین و مقررات', + icon: 'vuesax-linear:task', + iconSrc: getBoursecuActionIconSrc('rules'), + }, ] export function getPrimaryNavItems(): AppNavItem[] { diff --git a/src/utils/config.ts b/src/utils/config.ts index 2272a6a..5177e54 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -9,6 +9,9 @@ import boursecuBuySellIcon from '@/assets/img/boursecu-buy-sell-icon.png' import boursecuAssetsIcon from '@/assets/img/boursecu-assets-icon.png' import boursecuHomeIcon from '@/assets/img/boursecu-home-icon.png' import boursecuSettingsIcon from '@/assets/img/boursecu-settings-icon.png' +import boursecuSupportIcon from '@/assets/img/boursecu-support-icon.png' +import boursecuPriceTriggerIcon from '@/assets/img/boursecu-price-trigger-icon.png' +import boursecuRulesIcon from '@/assets/img/boursecu-rules-icon.png' export function getConfigApp(key: string) { const config = window.__APP_CONFIG__ ? window.__APP_CONFIG__.user : {} @@ -77,6 +80,9 @@ export function getBoursecuActionIconSrc(actionId: string): string | undefined { convert: boursecuConvertIcon, home: boursecuHomeIcon, settings: boursecuSettingsIcon, + support: boursecuSupportIcon, + priceTrigger: boursecuPriceTriggerIcon, + rules: boursecuRulesIcon, } return icons[actionId] diff --git a/src/utils/customerIdentity.ts b/src/utils/customerIdentity.ts new file mode 100644 index 0000000..c397755 --- /dev/null +++ b/src/utils/customerIdentity.ts @@ -0,0 +1,4 @@ +/** احراز نشده = is_legal صفر. ۱ و ۲ یعنی اطلاعات ثبت شده و معامله مجاز است. */ +export function isCustomerIdentityVerified(isLegal: unknown): boolean { + return Number(isLegal ?? 0) !== 0 +} diff --git a/src/views/base/giftCard/composables/useGiftCardPage.ts b/src/views/base/giftCard/composables/useGiftCardPage.ts index d551202..817ce34 100644 --- a/src/views/base/giftCard/composables/useGiftCardPage.ts +++ b/src/views/base/giftCard/composables/useGiftCardPage.ts @@ -6,6 +6,8 @@ import { type CustomerGiftCardItem, } from '@/api/giftCard' import { message } from 'ant-design-vue' +import { useUserStore } from '@/store/userStore' +import { isCustomerIdentityVerified } from '@/utils/customerIdentity' export interface GiftCardPageContext { form: Ref<{ code: string }> @@ -17,6 +19,7 @@ export interface GiftCardPageContext { listLoading: Ref loadMyGiftCards: () => Promise fillCode: (code: string) => void + identityRequiredVisible: Ref } export const GIFT_CARD_PAGE_CONTEXT_KEY: InjectionKey = @@ -29,6 +32,8 @@ export function useGiftCardPage() { const available = ref([]) const history = ref([]) const listLoading = ref(false) + const identityRequiredVisible = ref(false) + const userStore = useUserStore() const disableButton = computed(() => { if (!loading.value) { @@ -56,6 +61,10 @@ export function useGiftCardPage() { } async function registerGiftCard() { + if (!isCustomerIdentityVerified(userStore.userInfo?.is_legal)) { + identityRequiredVisible.value = true + return + } const code = form.value.code.trim() if (!code) return @@ -94,6 +103,7 @@ export function useGiftCardPage() { listLoading, loadMyGiftCards, fillCode, + identityRequiredVisible, } provide(GIFT_CARD_PAGE_CONTEXT_KEY, context) diff --git a/src/views/base/giftCard/index.vue b/src/views/base/giftCard/index.vue index 25adcf0..fe99a48 100644 --- a/src/views/base/giftCard/index.vue +++ b/src/views/base/giftCard/index.vue @@ -2,6 +2,7 @@
+
@@ -10,10 +11,11 @@ import { useDesktopBreakpoint } from '@/layouts/composables/useAppLayout' import { useGiftCardPage } from './composables/useGiftCardPage' import DesktopGiftCardView from './desktop/DesktopGiftCardView.vue' import MobileGiftCardView from './mobile/MobileGiftCardView.vue' +import IdentityRequiredDialog from '@/components/IdentityRequiredDialog.vue' const isDesktop = useDesktopBreakpoint() -useGiftCardPage() +const { identityRequiredVisible } = useGiftCardPage()