diff --git a/components.d.ts b/components.d.ts index 7258346..e69de29 100644 --- a/components.d.ts +++ b/components.d.ts @@ -1,74 +0,0 @@ -/* eslint-disable */ -/* prettier-ignore */ -// @ts-nocheck -// Generated by unplugin-vue-components -// Read more: https://github.com/vuejs/core/pull/3399 -export {} - -declare module 'vue' { - export interface GlobalComponents { - ABadge: typeof import('ant-design-vue/es')['Badge'] - AButton: typeof import('ant-design-vue/es')['Button'] - AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] - ADivider: typeof import('ant-design-vue/es')['Divider'] - AForm: typeof import('ant-design-vue/es')['Form'] - AFormItem: typeof import('ant-design-vue/es')['FormItem'] - AInput: typeof import('ant-design-vue/es')['Input'] - AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] - AModal: typeof import('ant-design-vue/es')['Modal'] - ARadio: typeof import('ant-design-vue/es')['Radio'] - ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] - 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'] - Basic: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/basic.vue')['default'] - BasicActionSheet: typeof import('./src/components/BasicPacks/BasicActionSheet.vue')['default'] - BasicButton: typeof import('./src/components/BasicPacks/BasicButton.vue')['default'] - BasicDraggableFileUpload: typeof import('./src/components/BasicPacks/BasicUploads/BasicDraggableFileUpload.vue')['default'] - BasicIcon: typeof import('./src/components/BasicPacks/BasicIcon.vue')['default'] - BasicInfoItem: typeof import('./src/components/BasicPacks/BasicInfoItem.vue')['default'] - BasicInput: typeof import('./src/components/BasicPacks/BasicInput.vue')['default'] - BasicModal: typeof import('./src/components/BasicPacks/BasicModal.vue')['default'] - BasicPriceInput: typeof import('./src/components/BasicPacks/BasicPriceInput/src/BasicPriceInput.vue')['default'] - BasicSelect: typeof import('./src/components/BasicPacks/BasicSelect.vue')['default'] - BasicTags: typeof import('./src/components/BasicPacks/BasicTags/index.vue')['default'] - BasicTextArea: typeof import('./src/components/BasicPacks/BasicTextArea.vue')['default'] - BasicToggleTwoItem: typeof import('./src/components/BasicPacks/BasicToggleTwoItem.vue')['default'] - Bg_main: typeof import('./src/components/bg_main.vue')['default'] - Bordered: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/bordered.vue')['default'] - DateRender: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/date-render.vue')['default'] - Demo: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/index.vue')['default'] - DialogVant: typeof import('./src/components/DialogVant.vue')['default'] - DialogVantOneButton: typeof import('./src/components/DialogVantOneButton.vue')['default'] - Disabled: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled.vue')['default'] - DisabledDate: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/disabled-date.vue')['default'] - Empty: typeof import('./src/components/empty.vue')['default'] - ExtraFooter: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/extra-footer.vue')['default'] - Format: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/format.vue')['default'] - GoldLoading: typeof import('./src/components/GoldLoading.vue')['default'] - ListAnim: typeof import('./src/components/ListAnim.vue')['default'] - Mode: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/mode.vue')['default'] - PresettedRanges: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/presetted-ranges.vue')['default'] - RangePicker: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/range-picker.vue')['default'] - RouterLink: typeof import('vue-router')['RouterLink'] - RouterView: typeof import('vue-router')['RouterView'] - SelectInRange: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/select-in-range.vue')['default'] - Size: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/size.vue')['default'] - StartEnd: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/start-end.vue')['default'] - Suffix: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/suffix.vue')['default'] - Switchable: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/switchable.vue')['default'] - Text: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/text.vue')['default'] - Time: typeof import('./src/components/BasicPacks/BaseDatePicker/src/datePick/demo/time.vue')['default'] - 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'] - } -} diff --git a/src/api/categories.ts b/src/api/categories.ts new file mode 100644 index 0000000..9c1008a --- /dev/null +++ b/src/api/categories.ts @@ -0,0 +1,10 @@ +import useAxios from '@/utils/useAxios' + +export interface StoreCategory { + id: number + name: string + sort_order?: number +} + +export const getStoreCategories = async (): Promise => + await useAxios.get('/customer/categories') diff --git a/src/components/ProductImage.vue b/src/components/ProductImage.vue new file mode 100644 index 0000000..b4fd15f --- /dev/null +++ b/src/components/ProductImage.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/utils/productImage.ts b/src/utils/productImage.ts new file mode 100644 index 0000000..b953b29 --- /dev/null +++ b/src/utils/productImage.ts @@ -0,0 +1,51 @@ +import defaultImg from '@/assets/img/defaultAbshodeh.svg' +import goyImg from '@/assets/img/goyImg.svg' +import mokaabImg from '@/assets/img/mokaabImg.svg' +import sekkeImg from '@/assets/img/sekkeImg.svg' +import parsianImg from '@/assets/img/parsianImg.svg' +import venusImg from '@/assets/img/venousImg.svg' + +export type ProductImageSource = { + file?: { src?: string | null } | null + group_type?: string | null +} | null | undefined + +function isUsableImageSrc(src?: string | null): boolean { + if (!src) return false + const value = src.trim() + return value !== '' && value !== 'null' && value !== 'undefined' +} + +export function getProductFallbackImage(product?: ProductImageSource): string { + const type = (product?.group_type ?? '').trim() + if (!type) return defaultImg + + const exactMap: Record = { + گوی: goyImg, + مکعب: mokaabImg, + سکه: sekkeImg, + 'شمش ونوس': venusImg, + 'سکه پارسیان': parsianImg, + شمش: defaultImg, + آبشده: defaultImg, + } + + if (exactMap[type]) return exactMap[type] + + if (type.includes('پارسیان')) return parsianImg + if (type.includes('ونوس')) return venusImg + if (type.includes('گوی')) return goyImg + if (type.includes('مکعب')) return mokaabImg + if (type.includes('سکه')) return sekkeImg + if (type.includes('شمش')) return defaultImg + + return defaultImg +} + +export function resolveProductImageSrc(product?: ProductImageSource): string { + const remoteSrc = product?.file?.src + if (isUsableImageSrc(remoteSrc)) { + return remoteSrc!.trim() + } + return getProductFallbackImage(product) +} diff --git a/src/views/base/cart/index.vue b/src/views/base/cart/index.vue index 95395bd..c66d1c9 100644 --- a/src/views/base/cart/index.vue +++ b/src/views/base/cart/index.vue @@ -39,10 +39,9 @@
-
@@ -151,16 +150,10 @@ import {useFundUserStore} from '@/store/fundStore' import type {Price} from '@/models/home' import type {Order} from '@/models/order' -// Image imports -import defaultImg from '@/assets/img/defaultAbshodeh.svg' -import goyImg from '@/assets/img/goyImg.svg' -import mokaabImg from '@/assets/img/mokaabImg.svg' -import sekkeImg from '@/assets/img/sekkeImg.svg' -import parsianImg from '@/assets/img/parsianImg.svg' -import venusImg from '@/assets/img/venousImg.svg' import {loading, getToken} from '@/utils' import GoldLoading from '@/components/GoldLoading.vue' import TransactionSkeleton from '@/components/TransactionSkeleton.vue' +import ProductImage from '@/components/ProductImage.vue' import {registerCodeDiscount} from "@/api/giftCard"; const cartStore = useCartStore() @@ -208,30 +201,6 @@ async function submitDiscount() { } } -function getProductImage(product: any) { - // Check if product has file field from server with src property - if (product?.file?.src) { - return product.file.src - } - - // Fallback to local images based on group_type if file is empty or doesn't exist - const type = product?.group_type - switch (type) { - case 'گوی': - return goyImg - case 'مکعب': - return mokaabImg - case 'سکه': - return sekkeImg - case 'شمش ونوس': - return venusImg - case 'سکه پارسیان': - return parsianImg - default: - return defaultImg - } -} - function getProductAmount(amount?: number) { if (!amount) return '' if (amount < 1) { diff --git a/src/views/base/products/components/ProductItem.vue b/src/views/base/products/components/ProductItem.vue index 44a4eec..e221e5b 100644 --- a/src/views/base/products/components/ProductItem.vue +++ b/src/views/base/products/components/ProductItem.vue @@ -64,23 +64,27 @@