diff --git a/src/api/appBanners.ts b/src/api/appBanners.ts index e974fc2..489633a 100644 --- a/src/api/appBanners.ts +++ b/src/api/appBanners.ts @@ -104,9 +104,7 @@ export async function loadAppBannersConst(): Promise { Object.assign(merged, { homeAsset: themes.homeAsset, piggyCreate: themes.piggyCreate, - productsHero1: themes.productsHero1, - productsHero2: themes.productsHero2, - productsHero3: themes.productsHero3, + productsHero: themes.productsHero?.length ? themes.productsHero : merged.productsHero, referral: themes.referral, share: themes.share, invite: themes.invite, diff --git a/src/composables/useAppBannersAdmin.ts b/src/composables/useAppBannersAdmin.ts index c8556d3..ab26aa4 100644 --- a/src/composables/useAppBannersAdmin.ts +++ b/src/composables/useAppBannersAdmin.ts @@ -27,9 +27,7 @@ function applyLoadedData(data: AppBannersValue) { Object.assign(next, data) next.homeAsset = absolutizePair(next.homeAsset) next.piggyCreate = absolutizePair(next.piggyCreate) - next.productsHero1 = absolutizePair(next.productsHero1) - next.productsHero2 = absolutizePair(next.productsHero2) - next.productsHero3 = absolutizePair(next.productsHero3) + next.productsHero = (next.productsHero ?? []).map(absolutizePair) next.referral = absolutizePair(next.referral) next.share = absolutizePair(next.share) next.invite = absolutizePair(next.invite) @@ -61,9 +59,7 @@ function snapshotForSave(): AppBannersValue { slider: httpsSlider([...state.slider]), homeAsset: httpsPair(state.homeAsset), piggyCreate: httpsPair(state.piggyCreate), - productsHero1: httpsPair(state.productsHero1), - productsHero2: httpsPair(state.productsHero2), - productsHero3: httpsPair(state.productsHero3), + productsHero: (state.productsHero ?? []).map(httpsPair), referral: httpsPair(state.referral), share: httpsPair(state.share), invite: httpsPair(state.invite), diff --git a/src/model/appBanners.ts b/src/model/appBanners.ts index 2cc5cc6..22eda82 100644 --- a/src/model/appBanners.ts +++ b/src/model/appBanners.ts @@ -12,9 +12,6 @@ export const LEGACY_SLIDER_BANNERS_CONST_KEY = 'header_banner' export type AppThemeBannerKey = | 'homeAsset' | 'piggyCreate' - | 'productsHero1' - | 'productsHero2' - | 'productsHero3' | 'referral' | 'share' | 'invite' @@ -31,9 +28,8 @@ export interface AppBannersValue { slider: IBenefits[] homeAsset: ThemeImagePair piggyCreate: ThemeImagePair - productsHero1: ThemeImagePair - productsHero2: ThemeImagePair - productsHero3: ThemeImagePair + /** اسلایدر بنر بالای صفحهٔ محصولات — تعداد آزاد */ + productsHero: ThemeImagePair[] referral: ThemeImagePair share: ThemeImagePair invite: ThemeImagePair @@ -53,9 +49,7 @@ export function emptyAppBanners(): AppBannersValue { slider: [], homeAsset: emptyThemePair(), piggyCreate: emptyThemePair(), - productsHero1: emptyThemePair(), - productsHero2: emptyThemePair(), - productsHero3: emptyThemePair(), + productsHero: [], referral: emptyThemePair(), share: emptyThemePair(), invite: emptyThemePair(), @@ -76,6 +70,21 @@ function normalizePair(raw: unknown): ThemeImagePair { } } +function pairHasImage(pair: ThemeImagePair): boolean { + return Boolean(pair.light || pair.dark) +} + +/** آرایهٔ جدید یا سه اسلات قدیمی productsHero1/2/3 */ +export function normalizeProductsHero(parsed: Record): ThemeImagePair[] { + if (Array.isArray(parsed.productsHero)) { + return parsed.productsHero.map(normalizePair) + } + + return [parsed.productsHero1, parsed.productsHero2, parsed.productsHero3] + .map(normalizePair) + .filter(pairHasImage) +} + function parseSlider(raw: unknown): IBenefits[] { if (!raw) return [] if (Array.isArray(raw)) return raw as IBenefits[] @@ -102,16 +111,15 @@ export function parseAppBanners(value: string | Record | null | return { ...fallback, slider: parsed as IBenefits[] } } + const obj = parsed as Record return { - slider: parseSlider(parsed.slider), - homeAsset: normalizePair(parsed.homeAsset), - piggyCreate: normalizePair(parsed.piggyCreate), - productsHero1: normalizePair(parsed.productsHero1), - productsHero2: normalizePair(parsed.productsHero2), - productsHero3: normalizePair(parsed.productsHero3), - referral: normalizePair(parsed.referral), - share: normalizePair(parsed.share), - invite: normalizePair(parsed.invite), + slider: parseSlider(obj.slider), + homeAsset: normalizePair(obj.homeAsset), + piggyCreate: normalizePair(obj.piggyCreate), + productsHero: normalizeProductsHero(obj), + referral: normalizePair(obj.referral), + share: normalizePair(obj.share), + invite: normalizePair(obj.invite), } } catch { return fallback @@ -128,9 +136,7 @@ export function serializeAppBanners(data: AppBannersValue): string { slider: data.slider ?? [], homeAsset: { ...data.homeAsset }, piggyCreate: { ...data.piggyCreate }, - productsHero1: { ...data.productsHero1 }, - productsHero2: { ...data.productsHero2 }, - productsHero3: { ...data.productsHero3 }, + productsHero: (data.productsHero ?? []).map((pair) => ({ ...pair })), referral: { ...data.referral }, share: { ...data.share }, invite: { ...data.invite }, diff --git a/src/pages/menuPages/banners/components/SettingsProfileBanners.vue b/src/pages/menuPages/banners/components/SettingsProfileBanners.vue index e0804d6..1278101 100644 --- a/src/pages/menuPages/banners/components/SettingsProfileBanners.vue +++ b/src/pages/menuPages/banners/components/SettingsProfileBanners.vue @@ -20,7 +20,7 @@ :bordered="false" class="profile-banners__collapse" > - +