Initial commit for Start9 packaging
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
import { ClassValue, clsx } from "clsx";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import { SetLog } from "@prisma/client";
|
||||
|
||||
/**
|
||||
* Merge classnames using clsx and tailwind-merge
|
||||
*/
|
||||
export function cn(...inputs: ClassValue[]): string {
|
||||
return twMerge(clsx(inputs));
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a date to a readable string (e.g., "Feb 16, 2026")
|
||||
*/
|
||||
export function formatDate(date: Date | string): string {
|
||||
const dateObj = typeof date === "string" ? new Date(date) : date;
|
||||
return dateObj.toLocaleDateString("en-US", {
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric",
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Format weight with unit (e.g., "150 lbs")
|
||||
*/
|
||||
export function formatWeight(weight: number, unit: string): string {
|
||||
return `${weight} ${unit}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate total volume (sets * reps * weight)
|
||||
*/
|
||||
export function calculateVolume(sets: SetLog[]): number {
|
||||
return sets.reduce((total, set) => {
|
||||
const reps = set.reps || 0;
|
||||
const weight = set.weight || 0;
|
||||
return total + reps * weight;
|
||||
}, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate estimated 1-rep max using Epley formula
|
||||
* 1RM = weight * (1 + reps / 30)
|
||||
*/
|
||||
export function calculateE1RM(weight: number, reps: number): number {
|
||||
if (reps === 1) return weight;
|
||||
return Math.round(weight * (1 + reps / 30) * 100) / 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the start and end of a week for a given date
|
||||
*/
|
||||
export function getWeekRange(date: Date): { start: Date; end: Date } {
|
||||
const d = new Date(date);
|
||||
const day = d.getDay();
|
||||
const diff = d.getDate() - day + (day === 0 ? -6 : 1); // Adjust to Monday
|
||||
|
||||
const start = new Date(d.setDate(diff));
|
||||
start.setHours(0, 0, 0, 0);
|
||||
|
||||
const end = new Date(start);
|
||||
end.setDate(end.getDate() + 6);
|
||||
end.setHours(23, 59, 59, 999);
|
||||
|
||||
return { start, end };
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random UUID
|
||||
*/
|
||||
export function generateId(): string {
|
||||
return crypto.randomUUID();
|
||||
}
|
||||
Reference in New Issue
Block a user