From 1aea160b616c26e33da0cd06eac348597a527cf7 Mon Sep 17 00:00:00 2001 From: codebymini Date: Fri, 20 Mar 2026 14:28:10 +0100 Subject: [PATCH 1/5] Refactor unit settings management and enhance metrics configuration - Introduced UnitSettingsStore to centralize unit and metric settings management. - Added new enums for glucose display units, time in range modes, glycemic metrics, and variability metrics. - Updated StatsData to calculate and store coefficient of variation. - Refactored Localizer to utilize UnitSettingsStore for unit conversions and formatting. - Enhanced Nightscout and Dexcom settings views to support unit configuration and onboarding. - Created UnitsConfigurationView for reusable unit and metric settings. - Updated AggregatedStatsView and SimpleStatsViewModel to reflect new unit settings. - Modified TIRView and its ViewModel to use UnitSettingsStore for thresholds and display. - Removed legacy storage references for unit settings in favor of the new centralized approach. - Added export functionality for new unit and metric settings in Nightscout settings. --- LoopFollow.xcodeproj/project.pbxproj | 8 + .../Application/Base.lproj/Main.storyboard | 4 +- LoopFollow/Controllers/Graphs.swift | 23 ++- .../MainViewController+updateStats.swift | 17 +- LoopFollow/Controllers/Stats.swift | 25 ++- LoopFollow/Helpers/Localizer.swift | 165 +++++++++++++++--- .../Nightscout/NightscoutSettingsView.swift | 88 ++++++++-- .../NightscoutSettingsViewModel.swift | 9 + LoopFollow/Settings/DexcomSettingsView.swift | 76 +++++--- .../Settings/DexcomSettingsViewModel.swift | 12 +- LoopFollow/Settings/GeneralSettingsView.swift | 2 - .../ImportExport/ExportableSettings.swift | 67 ++++++- LoopFollow/Settings/SettingsMenuView.swift | 18 +- .../Settings/UnitsConfigurationView.swift | 90 ++++++++++ LoopFollow/Settings/UnitsSettingsView.swift | 14 ++ LoopFollow/Stats/AggregatedStatsView.swift | 72 +++++--- LoopFollow/Stats/SimpleStatsViewModel.swift | 7 +- LoopFollow/Stats/TIR/TIRView.swift | 17 +- LoopFollow/Stats/TIR/TIRViewModel.swift | 4 +- LoopFollow/Storage/Storage.swift | 1 + .../ViewControllers/MainViewController.swift | 51 +++++- 21 files changed, 632 insertions(+), 138 deletions(-) create mode 100644 LoopFollow/Settings/UnitsConfigurationView.swift create mode 100644 LoopFollow/Settings/UnitsSettingsView.swift diff --git a/LoopFollow.xcodeproj/project.pbxproj b/LoopFollow.xcodeproj/project.pbxproj index 5bd76cc2a..8bebe1deb 100644 --- a/LoopFollow.xcodeproj/project.pbxproj +++ b/LoopFollow.xcodeproj/project.pbxproj @@ -32,6 +32,8 @@ 6589CC6C2E9E7D1600BB18FE /* GraphSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */; }; 6589CC6D2E9E7D1600BB18FE /* CalendarSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC582E9E7D1600BB18FE /* CalendarSettingsView.swift */; }; 6589CC6E2E9E7D1600BB18FE /* SettingsMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */; }; + 65A100012F5AA00000AA1001 /* UnitsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */; }; + 65A100032F5AA00000AA1002 /* UnitsConfigurationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */; }; 6589CC6F2E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC572E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift */; }; 6589CC712E9E814F00BB18FE /* AlarmSelectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC702E9E814F00BB18FE /* AlarmSelectionView.swift */; }; 6589CC752E9EAFB700BB18FE /* SettingsMigrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6589CC742E9EAFB700BB18FE /* SettingsMigrationManager.swift */; }; @@ -437,6 +439,8 @@ 6589CC5D2E9E7D1600BB18FE /* GeneralSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralSettingsView.swift; sourceTree = ""; }; 6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphSettingsView.swift; sourceTree = ""; }; 6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMenuView.swift; sourceTree = ""; }; + 65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitsSettingsView.swift; sourceTree = ""; }; + 65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnitsConfigurationView.swift; sourceTree = ""; }; 6589CC602E9E7D1600BB18FE /* TabCustomizationModal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabCustomizationModal.swift; sourceTree = ""; }; 6589CC702E9E814F00BB18FE /* AlarmSelectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlarmSelectionView.swift; sourceTree = ""; }; 6589CC742E9EAFB700BB18FE /* SettingsMigrationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsMigrationManager.swift; sourceTree = ""; }; @@ -868,6 +872,8 @@ 6589CC5E2E9E7D1600BB18FE /* GraphSettingsView.swift */, 657F98172F043D8100F732BD /* HomeContentView.swift */, 6589CC5F2E9E7D1600BB18FE /* SettingsMenuView.swift */, + 65A100002F5AA00000AA1001 /* UnitsSettingsView.swift */, + 65A100022F5AA00000AA1002 /* UnitsConfigurationView.swift */, 6589CC602E9E7D1600BB18FE /* TabCustomizationModal.swift */, ); path = Settings; @@ -2077,6 +2083,8 @@ 6589CC6C2E9E7D1600BB18FE /* GraphSettingsView.swift in Sources */, 6589CC6D2E9E7D1600BB18FE /* CalendarSettingsView.swift in Sources */, 6589CC6E2E9E7D1600BB18FE /* SettingsMenuView.swift in Sources */, + 65A100012F5AA00000AA1001 /* UnitsSettingsView.swift in Sources */, + 65A100032F5AA00000AA1002 /* UnitsConfigurationView.swift in Sources */, 657F98182F043D8100F732BD /* HomeContentView.swift in Sources */, 6589CC6F2E9E7D1600BB18FE /* AdvancedSettingsViewModel.swift in Sources */, DD493ADF2ACF22BB009A6922 /* SAge.swift in Sources */, diff --git a/LoopFollow/Application/Base.lproj/Main.storyboard b/LoopFollow/Application/Base.lproj/Main.storyboard index 11e4b1a72..6441edc6c 100644 --- a/LoopFollow/Application/Base.lproj/Main.storyboard +++ b/LoopFollow/Application/Base.lproj/Main.storyboard @@ -223,7 +223,7 @@ -