PliWould/lib/product.ts

86 lines
2.2 KiB
TypeScript

import uuid from "react-native-uuid";
import { dimensions_t, area_t } from "./dimensions";
import { matchDimensions } from "./dimensions";
import { Area, Length, Unit } from "convert";
export type Id = string;
export type Currency = "USD";
export type ProductAttributes = {
id?: string,
name?: string,
image?: string,
description?: string,
depth?: string,
currency?: Currency,
[index:string]: any,
}
export function dimensionArea(d: dimensions_t) {
return "w" in d ? d.w * d.l : 0;
}
export const PRODUCT_TYPES = [
"lumber",
"area_rug",
] as const;
export type product_type_t = typeof PRODUCT_TYPES[number];
export type Product = {
id?: Id;
pricePerUnit: number;
dimensions: dimensions_t;
type: product_type_t;
attributes?: ProductAttributes;
};
export type LumberProduct = Product & {
type: "lumber"
}
export type AreaRugProduct = Product & {
type: "lumber"
}
export function productPriceFor(product : Product, dimensions: dimensions_t, damage: number): number {
if (Number.isNaN(damage)) damage = 0;
const dim = matchDimensions(dimensions, product.dimensions);
return (
dim.w ? dimensionArea(dim) / dimensionArea(product.dimensions) * product.pricePerUnit
: (dim.l / product.dimensions.l) * product.pricePerUnit
) * (1.0 - damage);
}
export function priceDisplay(price : number) {
return price.toLocaleString(undefined, {
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})
}
export function pricePerUnitDisplay(product : Product) {
const p = priceDisplay(product.pricePerUnit);
const { l, u } = product.dimensions;
const w = (product.dimensions as area_t).w || null;
const d = w ? `${l}${u} x ${w}${u}` : `${l}${u}`;
return `$${p} per ${d}`
}
export function attributesAsList(attributes : {[key:string]: any}) {
return Object.entries(attributes).map(([key, value]) => {
return { key, value }
})
}
export function removeAttribute(attributes: {[key: string]: any}, key: string) {
return Object.fromEntries(
Object.entries(attributes).filter(
([k, v]) => {
k == key;
}
)
);
}