From b3f8c40e630c9d4dd0aaf0d4d53e7edb762f10bf Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 13:17:15 +0000 Subject: [PATCH] Fix unit conversion logic --- .../admin/editors/CoasterStatsEditor.tsx | 41 +++++++++++-------- .../admin/editors/TechnicalSpecsEditor.tsx | 34 ++++++++------- src/lib/units.ts | 18 ++++++++ 3 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/components/admin/editors/CoasterStatsEditor.tsx b/src/components/admin/editors/CoasterStatsEditor.tsx index 97c99765..9d4ca5bf 100644 --- a/src/components/admin/editors/CoasterStatsEditor.tsx +++ b/src/components/admin/editors/CoasterStatsEditor.tsx @@ -10,7 +10,8 @@ import { convertValueToMetric, convertValueFromMetric, detectUnitType, - getMetricUnit + getMetricUnit, + getDisplayUnit } from "@/lib/units"; interface CoasterStat { @@ -86,7 +87,7 @@ export function CoasterStatsEditor({ onChange(newStats); }; - // Get display value (convert from metric if needed) + // Get display value (convert from metric to user's preferred units) const getDisplayValue = (stat: CoasterStat): string => { if (!stat.stat_value || !stat.unit) return String(stat.stat_value || ''); @@ -96,9 +97,12 @@ export function CoasterStatsEditor({ const unitType = detectUnitType(stat.unit); if (unitType === 'unknown') return String(stat.stat_value); - // Assume stored value is in metric, convert to user's preferred units - const metricUnit = getMetricUnit(stat.unit); - const displayValue = convertValueFromMetric(numValue, stat.unit, metricUnit); + // stat.unit is the metric unit (e.g., "km/h") + // Get the display unit based on user preference (e.g., "mph" for imperial) + const displayUnit = getDisplayUnit(stat.unit, preferences.measurement_system); + + // Convert from metric to display unit + const displayValue = convertValueFromMetric(numValue, displayUnit, stat.unit); return String(displayValue); }; @@ -157,24 +161,25 @@ export function CoasterStatsEditor({ value={getDisplayValue(stat)} onChange={(e) => { const inputValue = e.target.value; - // If unit is recognized, convert to metric for storage - if (stat.unit) { - const numValue = parseFloat(inputValue); - if (!isNaN(numValue)) { - const metricValue = convertValueToMetric(numValue, stat.unit); - updateStat(index, 'stat_value', metricValue); - } else { - updateStat(index, 'stat_value', 0); - } + const numValue = parseFloat(inputValue); + + if (!isNaN(numValue) && stat.unit) { + // Determine what unit the user is entering (based on their preference) + const displayUnit = getDisplayUnit(stat.unit, preferences.measurement_system); + // Convert from user's input unit to metric for storage + const metricValue = convertValueToMetric(numValue, displayUnit); + updateStat(index, 'stat_value', metricValue); } else { - updateStat(index, 'stat_value', parseFloat(inputValue) || 0); + updateStat(index, 'stat_value', numValue || 0); } }} placeholder="0" /> -

- Using {preferences.measurement_system} units -

+ {stat.unit && detectUnitType(stat.unit) !== 'unknown' && ( +

+ Enter in {getDisplayUnit(stat.unit, preferences.measurement_system)} +

+ )}
diff --git a/src/components/admin/editors/TechnicalSpecsEditor.tsx b/src/components/admin/editors/TechnicalSpecsEditor.tsx index c754fcd8..bd3930c8 100644 --- a/src/components/admin/editors/TechnicalSpecsEditor.tsx +++ b/src/components/admin/editors/TechnicalSpecsEditor.tsx @@ -9,7 +9,8 @@ import { convertValueToMetric, convertValueFromMetric, detectUnitType, - getMetricUnit + getMetricUnit, + getDisplayUnit } from "@/lib/units"; interface TechnicalSpec { @@ -65,7 +66,7 @@ export function TechnicalSpecsEditor({ onChange(newSpecs); }; - // Get display value (convert from metric if needed) + // Get display value (convert from metric to user's preferred units) const getDisplayValue = (spec: TechnicalSpec): string => { if (!spec.spec_value || !spec.unit || spec.spec_type !== 'number') return spec.spec_value; @@ -75,9 +76,12 @@ export function TechnicalSpecsEditor({ const unitType = detectUnitType(spec.unit); if (unitType === 'unknown') return spec.spec_value; - // Assume stored value is in metric, convert to user's preferred units - const metricUnit = getMetricUnit(spec.unit); - const displayValue = convertValueFromMetric(numValue, spec.unit, metricUnit); + // spec.unit is the metric unit (e.g., "km/h") + // Get the display unit based on user preference (e.g., "mph" for imperial) + const displayUnit = getDisplayUnit(spec.unit, preferences.measurement_system); + + // Convert from metric to display unit + const displayValue = convertValueFromMetric(numValue, displayUnit, spec.unit); return String(displayValue); }; @@ -135,15 +139,15 @@ export function TechnicalSpecsEditor({ value={getDisplayValue(spec)} onChange={(e) => { const inputValue = e.target.value; + const numValue = parseFloat(inputValue); + // If type is number and unit is recognized, convert to metric for storage - if (spec.spec_type === 'number' && spec.unit) { - const numValue = parseFloat(inputValue); - if (!isNaN(numValue)) { - const metricValue = convertValueToMetric(numValue, spec.unit); - updateSpec(index, 'spec_value', String(metricValue)); - } else { - updateSpec(index, 'spec_value', inputValue); - } + if (spec.spec_type === 'number' && spec.unit && !isNaN(numValue)) { + // Determine what unit the user is entering (based on their preference) + const displayUnit = getDisplayUnit(spec.unit, preferences.measurement_system); + // Convert from user's input unit to metric for storage + const metricValue = convertValueToMetric(numValue, displayUnit); + updateSpec(index, 'spec_value', String(metricValue)); } else { updateSpec(index, 'spec_value', inputValue); } @@ -151,9 +155,9 @@ export function TechnicalSpecsEditor({ placeholder="Value" type={spec.spec_type === 'number' ? 'number' : 'text'} /> - {spec.spec_type === 'number' && spec.unit && ( + {spec.spec_type === 'number' && spec.unit && detectUnitType(spec.unit) !== 'unknown' && (

- Using {preferences.measurement_system} units + Enter in {getDisplayUnit(spec.unit, preferences.measurement_system)}

)}
diff --git a/src/lib/units.ts b/src/lib/units.ts index dfa52122..a28465fd 100644 --- a/src/lib/units.ts +++ b/src/lib/units.ts @@ -204,4 +204,22 @@ export function getMetricUnit(unit: string): string { default: return unit; } +} + +// Get display unit based on unit type and measurement system +export function getDisplayUnit(metricUnit: string, system: MeasurementSystem): string { + const unitType = detectUnitType(metricUnit); + + switch (unitType) { + case 'speed': + return system === 'imperial' ? 'mph' : 'km/h'; + case 'distance': + return system === 'imperial' ? 'ft' : 'm'; + case 'height': + return system === 'imperial' ? 'in' : 'cm'; + case 'weight': + return system === 'imperial' ? 'lbs' : 'kg'; + default: + return metricUnit; + } } \ No newline at end of file