108 lines
2.8 KiB
TypeScript
108 lines
2.8 KiB
TypeScript
import WooCommerceRestApi from "@woocommerce/woocommerce-rest-api";
|
|
|
|
const api = new WooCommerceRestApi({
|
|
url: process.env.NEXT_PUBLIC_WOOCOMMERCE_URL || "",
|
|
consumerKey: process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_KEY || "",
|
|
consumerSecret: process.env.NEXT_PUBLIC_WOOCOMMERCE_CONSUMER_SECRET || "",
|
|
version: "wc/v3",
|
|
});
|
|
|
|
export interface WooProduct {
|
|
id: number;
|
|
name: string;
|
|
slug: string;
|
|
price: string;
|
|
regular_price: string;
|
|
sale_price: string;
|
|
description: string;
|
|
short_description: string;
|
|
status: "publish" | "draft" | "private";
|
|
stock_status: "instock" | "outofstock";
|
|
images: { id: number; src: string; alt: string }[];
|
|
sku: string;
|
|
categories: { id: number; name: string; slug: string }[];
|
|
meta_data: { key: string; value: string }[];
|
|
}
|
|
|
|
export interface WooCategory {
|
|
id: number;
|
|
name: string;
|
|
slug: string;
|
|
description: string;
|
|
image: { src: string } | null;
|
|
}
|
|
|
|
export async function getProducts(perPage = 100): Promise<WooProduct[]> {
|
|
try {
|
|
const response = await api.get("products", { per_page: perPage });
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error("Error fetching products:", error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getProduct(id: number): Promise<WooProduct | null> {
|
|
try {
|
|
const response = await api.get(`products/${id}`);
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error(`Error fetching product ${id}:`, error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function getProductBySlug(slug: string): Promise<WooProduct | null> {
|
|
try {
|
|
const response = await api.get("products", { slug });
|
|
return response.data[0] || null;
|
|
} catch (error) {
|
|
console.error(`Error fetching product by slug ${slug}:`, error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export async function getCategories(): Promise<WooCategory[]> {
|
|
try {
|
|
const response = await api.get("product-categories", { per_page: 100 });
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error("Error fetching categories:", error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export async function getProductsByCategory(
|
|
categoryId: number
|
|
): Promise<WooProduct[]> {
|
|
try {
|
|
const response = await api.get("products", {
|
|
category: categoryId,
|
|
per_page: 100,
|
|
});
|
|
return response.data;
|
|
} catch (error) {
|
|
console.error(`Error fetching products for category ${categoryId}:`, error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
export function formatPrice(price: string, currency = "RSD"): string {
|
|
const num = parseFloat(price);
|
|
if (isNaN(num)) return "0 RSD";
|
|
return new Intl.NumberFormat("sr-RS", {
|
|
style: "currency",
|
|
currency: currency,
|
|
minimumFractionDigits: 0,
|
|
}).format(num);
|
|
}
|
|
|
|
export function getProductImage(product: WooProduct): string {
|
|
if (product.images && product.images.length > 0) {
|
|
return product.images[0].src;
|
|
}
|
|
return "/placeholder-product.jpg";
|
|
}
|
|
|
|
export default api;
|