diff --git a/frontend/src/app/features/shop/product-detail.component.ts b/frontend/src/app/features/shop/product-detail.component.ts index aa84d05..df01226 100644 --- a/frontend/src/app/features/shop/product-detail.component.ts +++ b/frontend/src/app/features/shop/product-detail.component.ts @@ -236,13 +236,14 @@ export class ProductDetailComponent { this.selectedVariantId.set(null); this.setSelectedImageAssetId(null); this.modelFile.set(null); + const isNotFound = error?.status === 404; this.error.set( - error?.status === 404 ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR', + isNotFound ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR', ); - if (error?.status === 404) { - this.setResponseStatus(404); + this.setResponseStatus(isNotFound ? 404 : 503); + if (this.shouldApplyFallbackSeo(error)) { + this.applyFallbackSeo(); } - this.applyFallbackSeo(); return of(null); }), finalize(() => this.loading.set(false)), @@ -598,6 +599,14 @@ export class ProductDetailComponent { }); } + private shouldApplyFallbackSeo(error: { status?: number } | null): boolean { + if (error?.status === 404) { + return true; + } + + return !this.isBrowser; + } + private materialLabelForVariant( variant: ShopProductVariantOption | null, ): string { diff --git a/frontend/src/app/features/shop/shop-page.component.ts b/frontend/src/app/features/shop/shop-page.component.ts index 404611c..9bfb6e5 100644 --- a/frontend/src/app/features/shop/shop-page.component.ts +++ b/frontend/src/app/features/shop/shop-page.component.ts @@ -1,5 +1,6 @@ -import { CommonModule } from '@angular/common'; +import { CommonModule, isPlatformBrowser } from '@angular/common'; import { + PLATFORM_ID, RESPONSE_INIT, afterNextRender, Component, @@ -61,6 +62,7 @@ export class ShopPageComponent { private readonly router = inject(Router); private readonly translate = inject(TranslateService); private readonly seoService = inject(SeoService); + private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID)); private readonly responseInit = inject(RESPONSE_INIT, { optional: true }); readonly languageService = inject(LanguageService); private readonly shopRouteService = inject(ShopRouteService); @@ -113,17 +115,18 @@ export class ShopPageComponent { catalog: this.shopService.getProductCatalog(categorySlug ?? null), }).pipe( catchError((error) => { + const isNotFound = error?.status === 404; this.categories.set([]); this.categoryNodes.set([]); this.selectedCategory.set(null); this.products.set([]); this.error.set( - error?.status === 404 ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR', + isNotFound ? 'SHOP.NOT_FOUND' : 'SHOP.LOAD_ERROR', ); - if (error?.status === 404) { - this.setResponseStatus(404); + this.setResponseStatus(isNotFound ? 404 : 503); + if (this.shouldApplyErrorSeo(error)) { + this.applyErrorSeo(); } - this.applyErrorSeo(); return of(null); }), finalize(() => this.loading.set(false)), @@ -376,6 +379,14 @@ export class ShopPageComponent { }); } + private shouldApplyErrorSeo(error: { status?: number } | null): boolean { + if (error?.status === 404) { + return true; + } + + return !this.isBrowser; + } + private setResponseStatus(status: number): void { if (this.responseInit) { this.responseInit.status = status;