add screenshots and images for docs. add icon.
This commit is contained in:
14
lib/__tests__/dimensions-test.ts
Normal file
14
lib/__tests__/dimensions-test.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import { diameterToLength, length_t } from '../dimensions';
|
||||
|
||||
describe('diameterToLength', () => {
|
||||
it('should throw an error if the units of the outer and inner diameters do not match', () => {
|
||||
expect(() => diameterToLength({ l: 10, u: 'inch' }, { l: 8, u: 'foot' }, 2)).toThrow('diameter units must match!');
|
||||
});
|
||||
|
||||
it('should return the correct length for multiple rings with different units', () => {
|
||||
const outer : length_t = {l: 25, u: "in"};
|
||||
const inner: length_t = {l : 1, u: "in"};
|
||||
const l = diameterToLength(outer, inner, 12);
|
||||
expect(l.l).toBeCloseTo(490, -1.0);
|
||||
});
|
||||
});
|
52
lib/dimensions.ts
Normal file
52
lib/dimensions.ts
Normal file
@ -0,0 +1,52 @@
|
||||
import convert from "convert";
|
||||
import { Length } from "convert";
|
||||
|
||||
export type length_t = {
|
||||
l: number; u: Length;
|
||||
};
|
||||
|
||||
export type area_t = length_t & {
|
||||
w: number;
|
||||
};
|
||||
|
||||
export type dimensions_t = area_t | length_t;
|
||||
|
||||
export type product_type_t = "area" | "length";
|
||||
|
||||
export const isArea = (d: dimensions_t) => ("width" in d);
|
||||
export const isLength = (d: dimensions_t) => (!("width" in d));
|
||||
export const dimensionType = (d: dimensions_t) => isArea(d) ? "area" : "length"; export function matchDimensions(d1: dimensions_t, d2: dimensions_t) {
|
||||
if (!(
|
||||
(isArea(d1) && isArea(d2)) ||
|
||||
(isLength(d1) && isLength(d2))
|
||||
)) {
|
||||
throw new Error(`Dimension mismatch: ${JSON.stringify(d1)} / ${JSON.stringify(d1)}`);
|
||||
}
|
||||
|
||||
return {
|
||||
l: convert(d1.l, d1.u).to(d2.u),
|
||||
u: d2.u,
|
||||
...(
|
||||
"w" in d1 ?
|
||||
{ w: convert(d1.w, d1.u).to(d2.u), }
|
||||
: {}
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the total length of a carpet roll based on a diameter
|
||||
* @param outerDiameter Outer diameter of the carpet roll
|
||||
* @param innerDiameter Inner diameter of the carpet roll (the "hole")
|
||||
* @param numRings Number of "rings" or "layers,"" just like a tree 🙂 🌲
|
||||
*/
|
||||
export function diameterToLength(outerDiameter: length_t, innerDiameter: length_t, numRings: number) {
|
||||
if (outerDiameter.u !== innerDiameter.u) {
|
||||
throw new Error("diameter units must match!")
|
||||
}
|
||||
const thickness = (((outerDiameter.l - innerDiameter.l) / 2) / numRings);
|
||||
return {
|
||||
l: Math.PI * (Math.pow(outerDiameter.l, 2) / 4) - (Math.pow(innerDiameter.l, 2) / 4) / thickness,
|
||||
u: innerDiameter.u,
|
||||
};
|
||||
}
|
@ -1,6 +1,8 @@
|
||||
import uuid from "react-native-uuid";
|
||||
import convert, { Area, Length } from "convert";
|
||||
import { Area } from "convert";
|
||||
import { Transform } from "class-transformer";
|
||||
import { dimensions_t, area_t } from "./dimensions";
|
||||
import { matchDimensions } from "./dimensions";
|
||||
|
||||
export type Id = string;
|
||||
|
||||
@ -15,55 +17,18 @@ export type ProductAttributes = {
|
||||
currency?: Currency,
|
||||
// [index:string]: any,
|
||||
}
|
||||
export type length_t = {
|
||||
l: number, u: Length
|
||||
}
|
||||
|
||||
export type area_t = length_t & {
|
||||
w: number,
|
||||
}
|
||||
|
||||
export type dimensions_t = area_t | length_t;
|
||||
|
||||
export type ProductData = {
|
||||
id?: Id,
|
||||
pricePerUnit: number,
|
||||
dimensions: dimensions_t,
|
||||
attributes?: ProductAttributes,
|
||||
};
|
||||
|
||||
|
||||
export type product_type_t = "area" | "length";
|
||||
|
||||
export const isArea = (d: dimensions_t) => ("width" in d);
|
||||
export const isLength = (d: dimensions_t) => (!("width" in d));
|
||||
export const dimensionType = (d: dimensions_t) => isArea(d) ? "area" : "length"
|
||||
|
||||
export function matchDimensions(d1: dimensions_t, d2: dimensions_t) {
|
||||
if (!
|
||||
(
|
||||
(isArea(d1) && isArea(d2)) ||
|
||||
(isLength(d1) && isLength(d2))
|
||||
)
|
||||
) {
|
||||
throw new Error(`Dimension mismatch: ${JSON.stringify(d1)} / ${JSON.stringify(d1)}`);
|
||||
}
|
||||
|
||||
return {
|
||||
l: convert(d1.l, d1.u).to(d2.u),
|
||||
u: d2.u,
|
||||
...(
|
||||
"w" in d1 ?
|
||||
{ w: convert(d1.w, d1.u).to(d2.u), }
|
||||
: {}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
export function dimensionArea(d: dimensions_t) {
|
||||
return "w" in d ? d.w * d.l : 0;
|
||||
}
|
||||
|
||||
export type ProductData = {
|
||||
id?: Id;
|
||||
pricePerUnit: number;
|
||||
dimensions: dimensions_t;
|
||||
attributes?: ProductAttributes;
|
||||
};
|
||||
|
||||
|
||||
export class Product {
|
||||
|
||||
public id?: Id;
|
||||
|
@ -2,7 +2,8 @@ import { RenderOptions, render } from "@testing-library/react-native";
|
||||
import { PropsWithChildren, ReactElement } from "react";
|
||||
import { Provider } from "react-redux";
|
||||
import { setupStore, RootState } from "@/app/store";
|
||||
import { Product, ProductData } from "@/lib/product";
|
||||
import { Product } from "@/lib/product";
|
||||
import { ProductData } from "./product";
|
||||
|
||||
export interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> {
|
||||
preloadedState?: Partial<RootState>;
|
||||
|
Reference in New Issue
Block a user