diff --git a/.zed/debug.json b/.zed/debug.json
new file mode 100644
index 0000000..bff52cb
--- /dev/null
+++ b/.zed/debug.json
@@ -0,0 +1,9 @@
+[
+ {
+ "label": "Debug Flutter App",
+ "adapter": "Dart",
+ "type": "flutter",
+ "program": "lib/main.dart",
+ "args": ["--web-port=9090"]
+ }
+]
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index dac0589..2fa143c 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -4,12 +4,20 @@
+
+
+
+
+
+
+
+
70 y", "sex": "male", "value": 900, "ul": 3000 },
- { "age_range": ">70 y", "sex": "female", "value": 700, "ul": 3000 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 750,
- "ul": 2800
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 770,
- "ul": 3000
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 1200,
- "ul": 2800
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 1300,
- "ul": 3000
- }
- ]
- },
- "vitamin_c": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 40, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 50, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 15, "ul": 400 },
- { "age_range": "4-8 y", "sex": "both", "value": 25, "ul": 650 },
- { "age_range": "9-13 y", "sex": "male", "value": 45, "ul": 1200 },
- { "age_range": "9-13 y", "sex": "female", "value": 45, "ul": 1200 },
- { "age_range": "14-18 y", "sex": "male", "value": 75, "ul": 1800 },
- { "age_range": "14-18 y", "sex": "female", "value": 65, "ul": 1800 },
- { "age_range": "19-30 y", "sex": "male", "value": 75, "ul": 1800 },
- { "age_range": "19-30 y", "sex": "female", "value": 90, "ul": 2000 },
- { "age_range": "31-50 y", "sex": "male", "value": 75, "ul": 2000 },
- { "age_range": "31-50 y", "sex": "female", "value": 75, "ul": 2000 },
- { "age_range": "51-70 y", "sex": "both", "value": 75, "ul": 2000 },
- { "age_range": ">70 y", "sex": "both", "value": 75, "ul": 2000 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 80,
- "ul": 1800
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 85,
- "ul": 2000
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 115,
- "ul": 1800
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 120,
- "ul": 2000
- }
- ]
- },
- "vitamin_d": {
- "unit": "µg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 10, "ul": 25 },
- { "age_range": "7-12 mo", "sex": "infant", "value": 15, "ul": 25 },
- { "age_range": "1-3 y", "sex": "both", "value": 15, "ul": 50 },
- { "age_range": "4-8 y", "sex": "both", "value": 15, "ul": 50 },
- { "age_range": "9-13 y", "sex": "both", "value": 15, "ul": 100 },
- { "age_range": "14-18 y", "sex": "both", "value": 15, "ul": 100 },
- { "age_range": "19-30 y", "sex": "both", "value": 15, "ul": 100 },
- { "age_range": "31-50 y", "sex": "both", "value": 15, "ul": 100 },
- { "age_range": "51-70 y", "sex": "both", "value": 20, "ul": 100 },
- { "age_range": ">70 y", "sex": "both", "value": 20, "ul": 100 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 15,
- "ul": 100
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 15,
- "ul": 100
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 15,
- "ul": 100
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 15,
- "ul": 100
- }
- ]
- },
- "vitamin_e": {
- "unit": "mg/day (alpha-tocopherol)",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 4, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 5, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 6, "ul": 200 },
- { "age_range": "4-8 y", "sex": "both", "value": 7, "ul": 300 },
- { "age_range": "9-13 y", "sex": "both", "value": 11, "ul": 600 },
- { "age_range": "14-18 y", "sex": "both", "value": 15, "ul": 800 },
- { "age_range": "19-30 y", "sex": "both", "value": 15, "ul": 800 },
- { "age_range": "31-50 y", "sex": "both", "value": 15, "ul": 800 },
- { "age_range": "51-70 y", "sex": "both", "value": 15, "ul": 800 },
- { "age_range": ">70 y", "sex": "both", "value": 15, "ul": 800 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 19,
- "ul": 800
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 19,
- "ul": 800
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 19,
- "ul": 800
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 19,
- "ul": 800
- }
- ]
- },
- "vitamin_k": {
- "unit": "µg/day",
- "rda_type": "AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 2, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 2.5, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 30, "ul": null },
- { "age_range": "4-8 y", "sex": "both", "value": 55, "ul": null },
- { "age_range": "9-13 y", "sex": "both", "value": 60, "ul": null },
- { "age_range": "14-18 y", "sex": "male", "value": 75, "ul": null },
- { "age_range": "14-18 y", "sex": "female", "value": 75, "ul": null },
- { "age_range": "19-30 y", "sex": "male", "value": 75, "ul": null },
- { "age_range": "19-30 y", "sex": "female", "value": 75, "ul": null },
- { "age_range": "31-50 y", "sex": "male", "value": 75, "ul": null },
- { "age_range": "31-50 y", "sex": "female", "value": 75, "ul": null },
- { "age_range": "51-70 y", "sex": "male", "value": 75, "ul": null },
- { "age_range": "51-70 y", "sex": "female", "value": 75, "ul": null },
- { "age_range": ">70 y", "sex": "male", "value": 75, "ul": null },
- { "age_range": ">70 y", "sex": "female", "value": 75, "ul": null },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 75,
- "ul": null
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 75,
- "ul": null
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 75,
- "ul": null
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 75,
- "ul": null
- }
- ]
- },
- "vitamin_b1": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.2, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 0.3, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 0.5, "ul": null },
- { "age_range": "4-8 y", "sex": "both", "value": 0.6, "ul": null },
- { "age_range": "9-13 y", "sex": "male", "value": 0.9, "ul": null },
- { "age_range": "9-13 y", "sex": "female", "value": 0.9, "ul": null },
- { "age_range": "14-18 y", "sex": "male", "value": 1.2, "ul": null },
- { "age_range": "14-18 y", "sex": "female", "value": 1.0, "ul": null },
- { "age_range": "19-30 y", "sex": "male", "value": 1.2, "ul": null },
- { "age_range": "19-30 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": "31-50 y", "sex": "male", "value": 1.2, "ul": null },
- { "age_range": "31-50 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": "51-70 y", "sex": "male", "value": 1.2, "ul": null },
- { "age_range": "51-70 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": ">70 y", "sex": "male", "value": 1.2, "ul": null },
- { "age_range": ">70 y", "sex": "female", "value": 1.1, "ul": null },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 1.4,
- "ul": null
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 1.4,
- "ul": null
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 1.5,
- "ul": null
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 1.5,
- "ul": null
- }
- ]
- },
- "vitamin_b2": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.3, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 0.4, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 0.5, "ul": null },
- { "age_range": "4-8 y", "sex": "both", "value": 0.6, "ul": null },
- { "age_range": "9-13 y", "sex": "male", "value": 0.9, "ul": null },
- { "age_range": "9-13 y", "sex": "female", "value": 0.9, "ul": null },
- { "age_range": "14-18 y", "sex": "male", "value": 1.3, "ul": null },
- { "age_range": "14-18 y", "sex": "female", "value": 1.0, "ul": null },
- { "age_range": "19-30 y", "sex": "male", "value": 1.3, "ul": null },
- { "age_range": "19-30 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": "31-50 y", "sex": "male", "value": 1.3, "ul": null },
- { "age_range": "31-50 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": "51-70 y", "sex": "male", "value": 1.3, "ul": null },
- { "age_range": "51-70 y", "sex": "female", "value": 1.1, "ul": null },
- { "age_range": ">70 y", "sex": "male", "value": 1.3, "ul": null },
- { "age_range": ">70 y", "sex": "female", "value": 1.1, "ul": null },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 1.4,
- "ul": null
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 1.4,
- "ul": null
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 1.6,
- "ul": null
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 1.6,
- "ul": null
- }
- ]
- },
- "vitamin_b3": {
- "unit": "mg/day (niacin equivalents, NE)",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 2, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 4, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 6, "ul": 10 },
- { "age_range": "4-8 y", "sex": "both", "value": 8, "ul": 15 },
- { "age_range": "9-13 y", "sex": "both", "value": 12, "ul": 20 },
- { "age_range": "14-18 y", "sex": "male", "value": 16, "ul": 30 },
- { "age_range": "14-18 y", "sex": "female", "value": 14, "ul": 30 },
- { "age_range": "19-30 y", "sex": "male", "value": 16, "ul": 35 },
- { "age_range": "19-30 y", "sex": "female", "value": 14, "ul": 35 },
- { "age_range": "31-50 y", "sex": "male", "value": 16, "ul": 35 },
- { "age_range": "31-50 y", "sex": "female", "value": 14, "ul": 35 },
- { "age_range": "51-70 y", "sex": "male", "value": 16, "ul": 35 },
- { "age_range": "51-70 y", "sex": "female", "value": 14, "ul": 35 },
- { "age_range": ">70 y", "sex": "male", "value": 16, "ul": 35 },
- { "age_range": ">70 y", "sex": "female", "value": 14, "ul": 35 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 18,
- "ul": 35
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 18,
- "ul": 35
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 17,
- "ul": 35
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 17,
- "ul": 35
- }
- ]
- },
- "vitamin_b5": {
- "unit": "mg/day",
- "rda_type": "AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 1.7, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 1.8, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 2.0, "ul": null },
- { "age_range": "4-8 y", "sex": "both", "value": 3.0, "ul": null },
- { "age_range": "9-13 y", "sex": "both", "value": 4.0, "ul": null },
- { "age_range": "14-18 y", "sex": "both", "value": 5.0, "ul": null },
- { "age_range": "19-30 y", "sex": "both", "value": 5.0, "ul": null },
- { "age_range": "31-50 y", "sex": "both", "value": 5.0, "ul": null },
- { "age_range": "51-70 y", "sex": "both", "value": 5.0, "ul": null },
- { "age_range": ">70 y", "sex": "both", "value": 5.0, "ul": null },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 6.0,
- "ul": null
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 6.0,
- "ul": null
- },
- {
- "age_range": "pregnancy 31-50 y",
- "sex": "female",
- "value": 6.0,
- "ul": null
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 7.0,
- "ul": null
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 7.0,
- "ul": null
- },
- {
- "age_range": "lactation 31-50 y",
- "sex": "female",
- "value": 7.0,
- "ul": null
- }
- ]
- },
- "vitamin_b6": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.1, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 0.3, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 0.5, "ul": 30 },
- { "age_range": "4-8 y", "sex": "both", "value": 0.6, "ul": 40 },
- { "age_range": "9-13 y", "sex": "both", "value": 1.0, "ul": 60 },
- { "age_range": "14-18 y", "sex": "male", "value": 1.3, "ul": 80 },
- { "age_range": "14-18 y", "sex": "female", "value": 1.2, "ul": 80 },
- { "age_range": "19-50 y", "sex": "male", "value": 1.3, "ul": 100 },
- { "age_range": "19-50 y", "sex": "female", "value": 1.3, "ul": 100 },
- { "age_range": "51-70 y", "sex": "male", "value": 1.7, "ul": 100 },
- { "age_range": "51-70 y", "sex": "female", "value": 1.5, "ul": 100 },
- { "age_range": ">70 y", "sex": "male", "value": 1.7, "ul": 100 },
- { "age_range": ">70 y", "sex": "female", "value": 1.5, "ul": 100 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 1.9,
- "ul": 80
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 1.9,
- "ul": 80
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 2.0,
- "ul": 100
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 2.0,
- "ul": 100
- }
- ]
- },
- "vitamin_b12": {
- "unit": "µg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.4, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 0.5, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 0.9, "ul": null },
- { "age_range": "4-8 y", "sex": "both", "value": 1.2, "ul": null },
- { "age_range": "9-13 y", "sex": "both", "value": 1.8, "ul": null },
- { "age_range": "14-18 y", "sex": "both", "value": 2.4, "ul": null },
- { "age_range": "19-30 y", "sex": "both", "value": 2.4, "ul": null },
- { "age_range": "31-50 y", "sex": "both", "value": 2.4, "ul": null },
- { "age_range": "51-70 y", "sex": "both", "value": 2.4, "ul": null },
- { "age_range": ">70 y", "sex": "both", "value": 2.4, "ul": null },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 2.6,
- "ul": null
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 2.6,
- "ul": null
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 2.8,
- "ul": null
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 2.8,
- "ul": null
- }
- ]
- },
- "iron": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.27, "ul": 40 },
- { "age_range": "7-12 mo", "sex": "infant", "value": 11, "ul": 40 },
- { "age_range": "1-3 y", "sex": "both", "value": 7, "ul": 40 },
- { "age_range": "4-8 y", "sex": "both", "value": 10, "ul": 40 },
- { "age_range": "9-13 y", "sex": "male", "value": 8, "ul": 45 },
- { "age_range": "9-13 y", "sex": "female", "value": 8, "ul": 45 },
- { "age_range": "14-18 y", "sex": "male", "value": 11, "ul": 45 },
- { "age_range": "14-18 y", "sex": "female", "value": 15, "ul": 45 },
- { "age_range": "19-30 y", "sex": "male", "value": 8, "ul": 45 },
- { "age_range": "19-30 y", "sex": "female", "value": 18, "ul": 45 },
- { "age_range": "31-50 y", "sex": "male", "value": 8, "ul": 45 },
- { "age_range": "31-50 y", "sex": "female", "value": 18, "ul": 45 },
- { "age_range": "51-70 y", "sex": "male", "value": 8, "ul": 45 },
- { "age_range": "51-70 y", "sex": "female", "value": 8, "ul": 45 },
- { "age_range": ">70 y", "sex": "male", "value": 8, "ul": 45 },
- { "age_range": ">70 y", "sex": "female", "value": 8, "ul": 45 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 27,
- "ul": 45
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 27,
- "ul": 45
- },
- {
- "age_range": "pregnancy 31-50 y",
- "sex": "female",
- "value": 27,
- "ul": 45
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 10,
- "ul": 45
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 9,
- "ul": 45
- },
- {
- "age_range": "lactation 31-50 y",
- "sex": "female",
- "value": 9,
- "ul": 45
- }
- ]
- },
- "magnesium": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "note": "UL represents intake from pharmacological agents only, not food or water.",
- "life_stages": [
- {
- "age_range": "0-6 mo",
- "sex": "infant",
- "value": 30,
- "rda_type": "AI",
- "ul": 40
- },
- {
- "age_range": "7-12 mo",
- "sex": "infant",
- "value": 75,
- "rda_type": "AI",
- "ul": 40
- },
- {
- "age_range": "1-3 y",
- "sex": "both",
- "value": 80,
- "rda_type": "RDA",
- "ul": 65
- },
- {
- "age_range": "4-8 y",
- "sex": "both",
- "value": 130,
- "rda_type": "RDA",
- "ul": 110
- },
- {
- "age_range": "9-13 y",
- "sex": "male",
- "value": 240,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "9-13 y",
- "sex": "female",
- "value": 240,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "14-18 y",
- "sex": "male",
- "value": 410,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "14-18 y",
- "sex": "female",
- "value": 360,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "19-30 y",
- "sex": "male",
- "value": 400,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "19-30 y",
- "sex": "female",
- "value": 310,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "31-50 y",
- "sex": "male",
- "value": 420,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "31-50 y",
- "sex": "female",
- "value": 320,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "51-70 y",
- "sex": "male",
- "value": 420,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "51-70 y",
- "sex": "female",
- "value": 320,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": ">70 y",
- "sex": "male",
- "value": 420,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": ">70 y",
- "sex": "female",
- "value": 320,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 400,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 350,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "pregnancy 31-50 y",
- "sex": "female",
- "value": 360,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 360,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 320,
- "rda_type": "RDA",
- "ul": 350
- },
- {
- "age_range": "lactation 31-50 y",
- "sex": "female",
- "value": 320,
- "rda_type": "RDA",
- "ul": 350
- }
- ]
- },
- "zinc": {
- "unit": "mg/day",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 2, "ul": 4 },
- { "age_range": "7-12 mo", "sex": "infant", "value": 3, "ul": 5 },
- { "age_range": "1-3 y", "sex": "both", "value": 3, "ul": 7 },
- { "age_range": "4-8 y", "sex": "both", "value": 5, "ul": 12 },
- { "age_range": "9-13 y", "sex": "male", "value": 8, "ul": 23 },
- { "age_range": "9-13 y", "sex": "female", "value": 8, "ul": 23 },
- { "age_range": "14-18 y", "sex": "male", "value": 11, "ul": 34 },
- { "age_range": "14-18 y", "sex": "female", "value": 9, "ul": 34 },
- { "age_range": "19-30 y", "sex": "male", "value": 11, "ul": 40 },
- { "age_range": "19-30 y", "sex": "female", "value": 8, "ul": 40 },
- { "age_range": "31-50 y", "sex": "male", "value": 11, "ul": 40 },
- { "age_range": "31-50 y", "sex": "female", "value": 8, "ul": 40 },
- { "age_range": "51-70 y", "sex": "male", "value": 11, "ul": 40 },
- { "age_range": "51-70 y", "sex": "female", "value": 8, "ul": 40 },
- { "age_range": ">70 y", "sex": "male", "value": 11, "ul": 40 },
- { "age_range": ">70 y", "sex": "female", "value": 8, "ul": 40 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 12,
- "ul": 40
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 11,
- "ul": 40
- },
- {
- "age_range": "pregnancy 31-50 y",
- "sex": "female",
- "value": 11,
- "ul": 40
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 13,
- "ul": 40
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 12,
- "ul": 40
- },
- {
- "age_range": "lactation 31-50 y",
- "sex": "female",
- "value": 12,
- "ul": 40
- }
- ]
- },
- "creatine": {
- "unit": "g/day",
- "rda_type": "Recommended Dosage",
- "note": "Creatine monohydrate supplementation typically involves a loading phase of 20-25 g/day divided into 4-5 g doses for 5-7 days, followed by a maintenance dose of 3-5 g/day. The UL is not a strict daily maximum but based on safe dosages studied for various durations.",
- "life_stages": [
- {
- "age_range": "adult",
- "sex": "both",
- "value_min": 3,
- "value_max": 5,
- "description": "Maintenance dose (typical daily intake)"
- },
- {
- "age_range": "adult",
- "sex": "both",
- "value": 20,
- "description": "Loading phase daily dose (divided into 4-5 g servings for 5-7 days)"
- }
- ],
- "ul": {
- "value": 25,
- "unit": "g/day",
- "duration": "up to 14 days",
- "note": "Doses up to 25 g/day for up to 14 days have been safely used. Long-term doses of 3-5 g/day are considered safe."
- }
- },
- "manganese": {
- "unit": "mg/day",
- "rda_type": "AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 0.003, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 0.6, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 1.2, "ul": 2 },
- { "age_range": "4-8 y", "sex": "both", "value": 1.5, "ul": 3 },
- { "age_range": "9-13 y", "sex": "male", "value": 1.9, "ul": 6 },
- { "age_range": "9-13 y", "sex": "female", "value": 1.6, "ul": 6 },
- { "age_range": "14-18 y", "sex": "male", "value": 2.2, "ul": 9 },
- { "age_range": "14-18 y", "sex": "female", "value": 1.6, "ul": 9 },
- { "age_range": "19-30 y", "sex": "male", "value": 2.3, "ul": 11 },
- { "age_range": "19-30 y", "sex": "female", "value": 1.8, "ul": 11 },
- { "age_range": "31-50 y", "sex": "male", "value": 2.3, "ul": 11 },
- { "age_range": "31-50 y", "sex": "female", "value": 1.8, "ul": 11 },
- { "age_range": "51-70 y", "sex": "male", "value": 2.3, "ul": 11 },
- { "age_range": "51-70 y", "sex": "female", "value": 1.8, "ul": 11 },
- { "age_range": ">70 y", "sex": "male", "value": 2.3, "ul": 11 },
- { "age_range": ">70 y", "sex": "female", "value": 1.8, "ul": 11 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 1.9,
- "ul": 11
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 1.8,
- "ul": 11
- },
- {
- "age_range": "pregnancy 31-50 y",
- "sex": "female",
- "value": 1.8,
- "ul": 11
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 2.6,
- "ul": 11
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 2.3,
- "ul": 11
- },
- {
- "age_range": "lactation 31-50 y",
- "sex": "female",
- "value": 2.3,
- "ul": 11
- }
- ]
- },
- "folate_dfe": {
- "unit": "µg/day (DFE)",
- "rda_type": "RDA/AI",
- "life_stages": [
- { "age_range": "0-6 mo", "sex": "infant", "value": 65, "ul": null },
- { "age_range": "7-12 mo", "sex": "infant", "value": 80, "ul": null },
- { "age_range": "1-3 y", "sex": "both", "value": 150, "ul": 300 },
- { "age_range": "4-8 y", "sex": "both", "value": 200, "ul": 400 },
- { "age_range": "9-13 y", "sex": "male", "value": 300, "ul": 600 },
- { "age_range": "9-13 y", "sex": "female", "value": 300, "ul": 600 },
- { "age_range": "14-18 y", "sex": "both", "value": 400, "ul": 800 },
- { "age_range": "19-30 y", "sex": "female", "value": 400, "ul": 1000 },
- { "age_range": "19-30 y", "sex": "male", "value": 400, "ul": 1000 },
- { "age_range": "31-50 y", "sex": "both", "value": 400, "ul": 1000 },
- { "age_range": "51-70 y", "sex": "both", "value": 400, "ul": 1000 },
- { "age_range": ">70 y", "sex": "both", "value": 400, "ul": 1000 },
- {
- "age_range": "pregnancy ≤18 y",
- "sex": "female",
- "value": 600,
- "ul": 800
- },
- {
- "age_range": "pregnancy 19-30 y",
- "sex": "female",
- "value": 600,
- "ul": 1000
- },
- {
- "age_range": "lactation ≤18 y",
- "sex": "female",
- "value": 500,
- "ul": 800
- },
- {
- "age_range": "lactation 19-30 y",
- "sex": "female",
- "value": 500,
- "ul": 1000
- }
- ]
- }
- }
-}
diff --git a/lib/logging.dart b/lib/logging.dart
new file mode 100644
index 0000000..39b7f5a
--- /dev/null
+++ b/lib/logging.dart
@@ -0,0 +1,8 @@
+// A simple logging function that prints a message to the console if [kDebugMode] is enabled.
+import 'package:flutter/foundation.dart';
+
+void printLog(String message) {
+ if (kDebugMode) {
+ print('SupplementsLog: $message');
+ }
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index befb96f..1207c30 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,12 +1,17 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
+import 'package:supplements/logging.dart';
import 'providers/settings_provider.dart';
import 'providers/simple_sync_provider.dart';
import 'providers/supplement_provider.dart';
import 'screens/home_screen.dart';
import 'screens/profile_setup_screen.dart';
+import 'services/notification_router.dart';
+import 'services/simple_notification_service.dart';
+
+final GlobalKey navigatorKey = GlobalKey();
void main() async {
WidgetsFlutterBinding.ensureInitialized();
@@ -42,15 +47,23 @@ class MyApp extends StatelessWidget {
WidgetsBinding.instance.addPostFrameCallback((_) {
final supplementProvider = context.read();
+ // Initialize notification router with the app's navigator
+ NotificationRouter.instance.initialize(navigatorKey);
+
+ // If the app was launched via a notification, route to the proper dialog
+ SimpleNotificationService.instance.getLaunchDetails().then((details) {
+ NotificationRouter.instance.handleAppLaunchDetails(details);
+ });
+
// Set up sync completion callback
syncProvider.setOnSyncCompleteCallback(() async {
if (kDebugMode) {
- print('SupplementsLog: Sync completed, refreshing UI data...');
+ printLog('Sync completed, refreshing UI data...');
}
await supplementProvider.loadSupplements();
await supplementProvider.loadTodayIntakes();
if (kDebugMode) {
- print('SupplementsLog: UI data refreshed after sync');
+ printLog('UI data refreshed after sync');
}
});
@@ -64,6 +77,7 @@ class MyApp extends StatelessWidget {
});
return MaterialApp(
+ navigatorKey: navigatorKey,
title: 'Supplements Tracker',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
diff --git a/lib/models/nutrient.dart b/lib/models/nutrient.dart
deleted file mode 100644
index 1c0fcc3..0000000
--- a/lib/models/nutrient.dart
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-class Nutrient {
- final String name;
- final String unit;
- final String rdaType;
- final String? note;
- final UpperLimit? ul; // nutrient-level UL (optional)
- final List lifeStages;
-
- Nutrient({
- required this.name,
- required this.unit,
- required this.rdaType,
- this.note,
- this.ul,
- required this.lifeStages,
- });
-
- factory Nutrient.fromJson(String name, Map json) {
- return Nutrient(
- name: name,
- unit: json['unit'],
- rdaType: json['rda_type'],
- note: json['note'],
- ul: (json['ul'] is Map) ? UpperLimit.fromJson(json['ul'] as Map) : null,
- lifeStages: (json['life_stages'] as List)
- .map((stage) => LifeStage.fromJson(stage))
- .toList(),
- );
- }
-}
-
-class LifeStage {
- final String ageRange;
- final String sex;
- final double value;
- final double? valueMin;
- final double? valueMax;
- final double? ul;
- final String? description;
-
- LifeStage({
- required this.ageRange,
- required this.sex,
- required this.value,
- this.valueMin,
- this.valueMax,
- this.ul,
- this.description,
- });
-
- factory LifeStage.fromJson(Map json) {
- return LifeStage(
- ageRange: json['age_range'],
- sex: json['sex'],
- value: (json['value'] as num?)?.toDouble() ?? 0.0,
- valueMin: json['value_min'] != null ? (json['value_min'] as num).toDouble() : null,
- valueMax: json['value_max'] != null ? (json['value_max'] as num).toDouble() : null,
- ul: json['ul'] != null ? (json['ul'] as num).toDouble() : null,
- description: json['description'],
- );
- }
-}
-
-class UpperLimit {
- final double value;
- final String unit;
- final String? duration;
- final String? note;
-
- const UpperLimit({
- required this.value,
- required this.unit,
- this.duration,
- this.note,
- });
-
- factory UpperLimit.fromJson(Map json) {
- return UpperLimit(
- value: (json['value'] as num).toDouble(),
- unit: json['unit'] ?? '',
- duration: json['duration'],
- note: json['note'],
- );
- }
-}
diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart
index f07017c..d5424e4 100644
--- a/lib/providers/settings_provider.dart
+++ b/lib/providers/settings_provider.dart
@@ -24,10 +24,7 @@ class SettingsProvider extends ChangeNotifier {
int _nightStart = 23;
int _nightEnd = 4;
- // Persistent reminder settings
- bool _persistentReminders = true;
- int _reminderRetryInterval = 5; // minutes
- int _maxRetryAttempts = 3;
+
// Auto-sync settings
bool _autoSyncEnabled = false;
@@ -58,10 +55,7 @@ class SettingsProvider extends ChangeNotifier {
int get nightStart => _nightStart;
int get nightEnd => _nightEnd;
- // Persistent reminder getters
- bool get persistentReminders => _persistentReminders;
- int get reminderRetryInterval => _reminderRetryInterval;
- int get maxRetryAttempts => _maxRetryAttempts;
+
// Auto-sync getters
bool get autoSyncEnabled => _autoSyncEnabled;
@@ -110,10 +104,7 @@ class SettingsProvider extends ChangeNotifier {
_nightStart = prefs.getInt('night_start') ?? 23;
_nightEnd = prefs.getInt('night_end') ?? 4;
- // Load persistent reminder settings
- _persistentReminders = prefs.getBool('persistent_reminders') ?? true;
- _reminderRetryInterval = prefs.getInt('reminder_retry_interval') ?? 5;
- _maxRetryAttempts = prefs.getInt('max_retry_attempts') ?? 3;
+
// Load auto-sync settings
_autoSyncEnabled = prefs.getBool('auto_sync_enabled') ?? false;
@@ -278,30 +269,7 @@ class SettingsProvider extends ChangeNotifier {
}
}
- // Persistent reminder setters
- Future setPersistentReminders(bool enabled) async {
- _persistentReminders = enabled;
- notifyListeners();
- final prefs = await SharedPreferences.getInstance();
- await prefs.setBool('persistent_reminders', enabled);
- }
-
- Future setReminderRetryInterval(int minutes) async {
- _reminderRetryInterval = minutes;
- notifyListeners();
-
- final prefs = await SharedPreferences.getInstance();
- await prefs.setInt('reminder_retry_interval', minutes);
- }
-
- Future setMaxRetryAttempts(int attempts) async {
- _maxRetryAttempts = attempts;
- notifyListeners();
-
- final prefs = await SharedPreferences.getInstance();
- await prefs.setInt('max_retry_attempts', attempts);
- }
// Auto-sync setters
Future setAutoSyncEnabled(bool enabled) async {
diff --git a/lib/providers/simple_sync_provider.dart b/lib/providers/simple_sync_provider.dart
index 052a39e..0966330 100644
--- a/lib/providers/simple_sync_provider.dart
+++ b/lib/providers/simple_sync_provider.dart
@@ -1,4 +1,5 @@
import 'package:flutter/foundation.dart';
+import 'package:supplements/logging.dart';
import '../services/database_sync_service.dart';
import '../services/auto_sync_service.dart';
@@ -66,7 +67,7 @@ class SimpleSyncProvider with ChangeNotifier {
);
if (kDebugMode) {
- print('SimpleSyncProvider: Auto-sync service initialized');
+ printLog('SimpleSyncProvider: Auto-sync service initialized');
}
}
@@ -111,7 +112,7 @@ class SimpleSyncProvider with ChangeNotifier {
await _syncService.syncDatabase();
} catch (e) {
if (kDebugMode) {
- print('SupplementsLog: Sync failed in provider: $e');
+ printLog('Sync failed in provider: $e');
}
rethrow;
} finally {
diff --git a/lib/providers/supplement_provider.dart b/lib/providers/supplement_provider.dart
index 5cd23f0..408b4f6 100644
--- a/lib/providers/supplement_provider.dart
+++ b/lib/providers/supplement_provider.dart
@@ -3,22 +3,24 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
+import 'package:supplements/logging.dart';
import '../models/supplement.dart';
import '../models/supplement_intake.dart';
import '../services/database_helper.dart';
import '../services/database_sync_service.dart';
-import '../services/notification_service.dart';
+import '../services/simple_notification_service.dart';
class SupplementProvider with ChangeNotifier, WidgetsBindingObserver {
final DatabaseHelper _databaseHelper = DatabaseHelper.instance;
- final NotificationService _notificationService = NotificationService();
+ final SimpleNotificationService _notificationService = SimpleNotificationService.instance;
+ bool _initialized = false;
List _supplements = [];
List