feat: implement product detail page and define catalog interfaces
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
export interface Product {
|
||||
id: number;
|
||||
tenant_codigo: string;
|
||||
category_id: number;
|
||||
brand_id: number | null;
|
||||
slug: string;
|
||||
@@ -17,7 +16,7 @@ export interface ProductAttributeOption {
|
||||
value: string;
|
||||
label: string;
|
||||
sort_order: number;
|
||||
metadata: Record<string, any> | null;
|
||||
metadata: Record<string, unknown> | null;
|
||||
}
|
||||
|
||||
export interface ProductAttribute {
|
||||
@@ -25,19 +24,27 @@ export interface ProductAttribute {
|
||||
codigo: string;
|
||||
nombre: string;
|
||||
is_required: boolean;
|
||||
metadata_schema: Record<string, any> | null;
|
||||
metadata_schema: Record<string, unknown> | null;
|
||||
type: string;
|
||||
options: ProductAttributeOption[];
|
||||
}
|
||||
|
||||
export interface ProductVariant {
|
||||
variant_id: number;
|
||||
id: number;
|
||||
stock: number;
|
||||
definitions: Record<string, string>;
|
||||
images: string[];
|
||||
}
|
||||
|
||||
export interface ProductVariantMap {
|
||||
variant_id: number;
|
||||
stock: number;
|
||||
attributes: Record<string, string>;
|
||||
}
|
||||
|
||||
export interface ProductDetail extends Product {
|
||||
attributes: ProductAttribute[];
|
||||
default_variant: ProductVariant | null;
|
||||
variants_map: ProductVariantMap[];
|
||||
variant: ProductVariant | null;
|
||||
}
|
||||
|
||||
|
||||
@@ -49,8 +49,8 @@ export class ProductDetailPageComponent implements OnInit, OnDestroy {
|
||||
protected readonly carouselImages = computed(() => {
|
||||
const prod = this.product();
|
||||
if (!prod) return [];
|
||||
if (prod.default_variant?.images && prod.default_variant.images.length > 0) {
|
||||
return prod.default_variant.images;
|
||||
if (prod.variant?.images && prod.variant.images.length > 0) {
|
||||
return prod.variant.images;
|
||||
}
|
||||
if (prod.images && prod.images.length > 0) {
|
||||
return prod.images;
|
||||
@@ -181,7 +181,7 @@ export class ProductDetailPageComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
private initializeSelections(product: ProductDetail): void {
|
||||
const defaultVariant = product.default_variant;
|
||||
const defaultVariant = product.variant;
|
||||
const selections: Record<number, number> = {};
|
||||
|
||||
for (const attribute of product.attributes) {
|
||||
@@ -202,7 +202,7 @@ export class ProductDetailPageComponent implements OnInit, OnDestroy {
|
||||
return null;
|
||||
}
|
||||
|
||||
const defaultValue = this.getDefaultVariantAttributeValue(attribute, variant.attributes);
|
||||
const defaultValue = this.getDefaultVariantAttributeValue(attribute, variant.definitions);
|
||||
if (!defaultValue) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user