2 Commits

Author SHA1 Message Date
Unchained
2c8cf68e89 Refactor WooCommerce API to lazy initialization for build compatibility 2026-03-06 16:34:49 +02:00
Unchained
c45aefde6e Add error handling to sitemap.ts for build time 2026-03-06 16:34:00 +02:00
2 changed files with 34 additions and 8 deletions

View File

@@ -4,7 +4,12 @@ import { getProducts } from "@/lib/woocommerce";
export default async function sitemap(): Promise<MetadataRoute.Sitemap> { export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://dev.manoonoils.com"; const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || "https://dev.manoonoils.com";
const products = await getProducts(); let products: any[] = [];
try {
products = await getProducts();
} catch (e) {
console.log('Failed to fetch products for sitemap during build');
}
const productUrls = products const productUrls = products
.filter((p) => p.status === "publish") .filter((p) => p.status === "publish")

View File

@@ -1,11 +1,27 @@
import WooCommerceRestApi from "@woocommerce/woocommerce-rest-api"; import WooCommerceRestApi from "@woocommerce/woocommerce-rest-api";
const api = new WooCommerceRestApi({ // Lazy initialization - only create API client when needed
url: process.env.NEXT_PUBLIC_WOOCOMMERCE_URL || "", let apiInstance: WooCommerceRestApi | null = null;
consumerKey: process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_KEY || "",
consumerSecret: process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_SECRET || "", function getApi(): WooCommerceRestApi {
if (!apiInstance) {
const url = process.env.NEXT_PUBLIC_WOOCOMMERCE_URL;
const consumerKey = process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_KEY;
const consumerSecret = process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_SECRET;
if (!url || !consumerKey || !consumerSecret) {
throw new Error("WooCommerce API credentials not configured");
}
apiInstance = new WooCommerceRestApi({
url,
consumerKey,
consumerSecret,
version: "wc/v3", version: "wc/v3",
}); });
}
return apiInstance;
}
export interface WooProduct { export interface WooProduct {
id: number; id: number;
@@ -34,6 +50,7 @@ export interface WooCategory {
export async function getProducts(perPage = 100): Promise<WooProduct[]> { export async function getProducts(perPage = 100): Promise<WooProduct[]> {
try { try {
const api = getApi();
const response = await api.get("products", { per_page: perPage }); const response = await api.get("products", { per_page: perPage });
return response.data; return response.data;
} catch (error) { } catch (error) {
@@ -44,6 +61,7 @@ export async function getProducts(perPage = 100): Promise<WooProduct[]> {
export async function getProduct(id: number): Promise<WooProduct | null> { export async function getProduct(id: number): Promise<WooProduct | null> {
try { try {
const api = getApi();
const response = await api.get(`products/${id}`); const response = await api.get(`products/${id}`);
return response.data; return response.data;
} catch (error) { } catch (error) {
@@ -54,6 +72,7 @@ export async function getProduct(id: number): Promise<WooProduct | null> {
export async function getProductBySlug(slug: string): Promise<WooProduct | null> { export async function getProductBySlug(slug: string): Promise<WooProduct | null> {
try { try {
const api = getApi();
const response = await api.get("products", { slug }); const response = await api.get("products", { slug });
return response.data[0] || null; return response.data[0] || null;
} catch (error) { } catch (error) {
@@ -64,6 +83,7 @@ export async function getProductBySlug(slug: string): Promise<WooProduct | null>
export async function getCategories(): Promise<WooCategory[]> { export async function getCategories(): Promise<WooCategory[]> {
try { try {
const api = getApi();
const response = await api.get("product-categories", { per_page: 100 }); const response = await api.get("product-categories", { per_page: 100 });
return response.data; return response.data;
} catch (error) { } catch (error) {
@@ -76,6 +96,7 @@ export async function getProductsByCategory(
categoryId: number categoryId: number
): Promise<WooProduct[]> { ): Promise<WooProduct[]> {
try { try {
const api = getApi();
const response = await api.get("products", { const response = await api.get("products", {
category: categoryId, category: categoryId,
per_page: 100, per_page: 100,
@@ -104,4 +125,4 @@ export function getProductImage(product: WooProduct): string {
return "/placeholder-product.jpg"; return "/placeholder-product.jpg";
} }
export default api; export default getApi;