73 lines
2.2 KiB
TypeScript
73 lines
2.2 KiB
TypeScript
export const useMeasurementConversion = () => {
|
|
// Convert feet to meters (NocoDB uses this formula: imperial * 0.3048)
|
|
const feetToMeters = (feet: number): number => {
|
|
return feet * 0.3048;
|
|
};
|
|
|
|
// Convert meters to feet (reverse conversion for editing)
|
|
const metersToFeet = (meters: number): number => {
|
|
return meters / 0.3048;
|
|
};
|
|
|
|
// Format measurement for display (show both units)
|
|
const formatMeasurement = (imperial: number, unit: 'ft' | 'in' = 'ft') => {
|
|
const metric = feetToMeters(imperial);
|
|
return {
|
|
imperial: `${imperial}${unit}`,
|
|
metric: `${metric.toFixed(2)}m`,
|
|
display: `${metric.toFixed(2)}m / ${imperial}${unit}`,
|
|
imperialValue: imperial,
|
|
metricValue: parseFloat(metric.toFixed(2))
|
|
};
|
|
};
|
|
|
|
// Format just metric value with precision
|
|
const formatMetric = (meters: number): string => {
|
|
return `${meters.toFixed(2)}m`;
|
|
};
|
|
|
|
// Format just imperial value
|
|
const formatImperial = (feet: number, unit: 'ft' | 'in' = 'ft'): string => {
|
|
return `${feet}${unit}`;
|
|
};
|
|
|
|
// Parse user input and convert to imperial for database storage
|
|
const parseUserInput = (input: string): { imperial: number; metric: number } | null => {
|
|
// Remove any non-numeric characters except decimal points
|
|
const cleanInput = input.replace(/[^\d.]/g, '');
|
|
const numericValue = parseFloat(cleanInput);
|
|
|
|
if (isNaN(numericValue)) {
|
|
return null;
|
|
}
|
|
|
|
// Determine if input is likely metric (contains 'm') or imperial (contains 'ft' or just a number)
|
|
const isMetric = input.toLowerCase().includes('m') && !input.toLowerCase().includes('ft');
|
|
|
|
if (isMetric) {
|
|
// Convert metric to imperial for storage
|
|
const imperial = metersToFeet(numericValue);
|
|
return {
|
|
imperial: parseFloat(imperial.toFixed(2)),
|
|
metric: numericValue
|
|
};
|
|
} else {
|
|
// Assume imperial, convert to metric for display
|
|
const metric = feetToMeters(numericValue);
|
|
return {
|
|
imperial: numericValue,
|
|
metric: parseFloat(metric.toFixed(2))
|
|
};
|
|
}
|
|
};
|
|
|
|
return {
|
|
feetToMeters,
|
|
metersToFeet,
|
|
formatMeasurement,
|
|
formatMetric,
|
|
formatImperial,
|
|
parseUserInput
|
|
};
|
|
};
|