diff --git a/assets/icons/logo_2.svg b/assets/icons/logo_2.svg
new file mode 100644
index 00000000..e37bf02f
--- /dev/null
+++ b/assets/icons/logo_2.svg
@@ -0,0 +1,9 @@
+
diff --git a/assets/images/logo_bg.png b/assets/images/logo_bg.png
new file mode 100644
index 00000000..e9d377c9
Binary files /dev/null and b/assets/images/logo_bg.png differ
diff --git a/coverage/lcov.info b/coverage/lcov.info
index 5db74652..60de6156 100644
--- a/coverage/lcov.info
+++ b/coverage/lcov.info
@@ -4,22 +4,22 @@ DA:23,18
DA:24,0
DA:25,0
DA:30,18
-DA:34,11
-DA:36,33
+DA:34,14
+DA:36,42
DA:37,0
DA:38,0
-DA:43,33
-DA:44,11
-DA:45,11
-DA:48,11
-DA:60,11
-DA:61,11
-DA:63,11
-DA:64,11
-DA:67,11
-DA:68,11
+DA:43,42
+DA:44,14
+DA:45,14
+DA:48,14
+DA:60,14
+DA:61,14
+DA:63,14
+DA:64,14
+DA:67,14
+DA:68,14
DA:81,12
-DA:84,22
+DA:84,28
DA:102,0
DA:104,5
DA:106,1
@@ -75,382 +75,249 @@ DA:213,0
LF:73
LH:31
end_of_record
-SF:lib\features\create_diet\presentation\cubit\create_diet_cubit.dart
-DA:28,9
-DA:30,1
-DA:32,4
-DA:33,2
-DA:34,3
-DA:35,1
-DA:36,1
-DA:38,1
-DA:39,0
-DA:40,0
-DA:41,0
-DA:46,2
-DA:47,3
-DA:48,3
-DA:49,3
-DA:50,3
-DA:51,2
-DA:52,1
-DA:53,4
-DA:55,1
-DA:56,1
-DA:57,1
-DA:58,1
-DA:61,2
-DA:64,7
-DA:65,4
-DA:68,0
-DA:69,0
-DA:72,0
-DA:73,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:79,0
-DA:82,0
-DA:84,0
-DA:85,0
-DA:86,0
-DA:87,0
-DA:89,0
-DA:90,0
-DA:91,0
-DA:92,0
-DA:95,0
-DA:97,0
-DA:99,0
-DA:101,0
-DA:102,0
-DA:104,0
-DA:110,0
-DA:111,0
-DA:114,0
-DA:115,0
-DA:116,0
-DA:117,0
-DA:123,0
-DA:124,0
-DA:127,0
-DA:128,0
-DA:129,0
-DA:130,0
-DA:137,0
-DA:138,0
-DA:139,0
-DA:140,0
-DA:143,0
-DA:144,0
-DA:146,0
-DA:147,0
-DA:149,0
-DA:150,0
-DA:151,0
-DA:155,0
-DA:156,0
-DA:158,0
-DA:159,0
-DA:161,0
-DA:162,0
-DA:166,0
-DA:167,0
-DA:169,0
-DA:170,0
-DA:172,0
-DA:173,0
-DA:177,0
-DA:178,0
-DA:180,0
-DA:181,0
-DA:182,0
-DA:186,0
-DA:187,0
-DA:188,0
-DA:190,0
-DA:191,0
-DA:192,0
-DA:193,0
-DA:194,0
-DA:198,0
-DA:199,0
-DA:200,0
-DA:201,0
-DA:202,0
-DA:203,0
-DA:204,0
-DA:205,0
-DA:206,0
-DA:207,0
-DA:210,0
-DA:212,0
-DA:213,0
-DA:214,0
-DA:215,0
-DA:216,0
-DA:219,0
-DA:221,0
-DA:222,0
-DA:223,0
-DA:224,0
-DA:225,0
-DA:228,0
-DA:230,0
-DA:231,0
-DA:232,0
-DA:233,0
-DA:234,0
-DA:237,0
-DA:238,0
-DA:240,0
-DA:241,0
-DA:244,0
-DA:246,0
-DA:247,0
-DA:248,0
-DA:249,0
-DA:250,0
-DA:251,0
-DA:253,0
-DA:255,0
-DA:258,0
-DA:260,0
-DA:263,0
-DA:264,0
-DA:265,0
-DA:266,0
-DA:267,0
-DA:268,0
-DA:269,0
-DA:271,0
-DA:273,0
-DA:274,0
-DA:275,0
-DA:276,0
-DA:290,0
-DA:291,0
-DA:293,0
-DA:294,0
-DA:295,0
-DA:296,0
-DA:297,0
-DA:299,0
-DA:303,0
-DA:304,0
-DA:305,0
-DA:308,0
-DA:309,0
-DA:312,0
-DA:313,0
-DA:315,0
-DA:316,0
-DA:317,0
-DA:318,0
-DA:319,0
-DA:322,0
-DA:323,0
-DA:324,0
-DA:325,0
-DA:326,0
-DA:327,0
-DA:330,0
-DA:332,0
-DA:333,0
-DA:335,0
-DA:339,0
-DA:340,0
-DA:343,0
-DA:344,0
-DA:346,0
-DA:348,0
-DA:349,0
-DA:350,0
-DA:352,0
-DA:353,0
-DA:354,0
-DA:355,0
-DA:356,0
-DA:357,0
-DA:361,0
-DA:366,0
-DA:368,0
-DA:370,0
-DA:372,0
-DA:374,0
-DA:376,0
-DA:378,0
-DA:380,0
-DA:382,0
-DA:384,0
-DA:386,0
-DA:388,0
-DA:390,0
-DA:392,0
-DA:394,0
-DA:396,0
-DA:400,0
-DA:401,0
-DA:406,0
-DA:407,0
-DA:408,0
-DA:410,0
-DA:413,0
-DA:418,0
-DA:419,0
-DA:424,0
-DA:425,0
-DA:426,0
-DA:428,0
-DA:430,0
-DA:432,0
-LF:228
-LH:23
-end_of_record
-SF:lib\features\create_diet\presentation\widgets\diet_duration_drop_down_widget.dart
-DA:15,4
-DA:17,2
+SF:lib\features\blog_post_create\bloc\blog_post_create_cubit\blog_post_create_cubit.dart
+DA:9,6
+DA:11,2
+DA:13,2
+DA:14,4
+DA:15,2
DA:18,2
+DA:19,6
DA:24,2
DA:26,2
DA:27,4
-DA:28,4
-DA:29,4
-DA:30,8
-DA:35,2
-DA:37,2
-DA:38,2
-DA:39,2
-DA:40,2
-DA:42,2
-DA:43,2
-DA:44,2
-DA:45,2
-DA:46,2
-DA:47,6
-DA:49,0
-DA:51,0
-DA:54,2
-DA:55,2
-DA:56,4
-DA:57,4
-DA:58,2
-DA:59,4
-DA:60,6
-DA:64,2
-DA:65,5
-DA:67,2
-DA:71,0
-LF:33
-LH:30
-end_of_record
-SF:lib\features\create_diet\presentation\widgets\diet_type_choice_widget.dart
-DA:12,4
-DA:14,2
-DA:15,2
-DA:20,2
-DA:22,2
-DA:23,4
-DA:24,4
-DA:25,4
DA:28,2
-DA:31,4
-DA:34,2
-DA:37,4
-DA:40,2
-DA:43,4
-DA:46,2
-DA:52,2
-DA:54,2
-DA:55,2
-DA:56,2
-DA:57,2
-DA:58,4
-DA:59,2
-DA:60,2
-DA:61,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:66,2
-DA:67,4
-DA:68,2
-DA:69,2
-DA:70,16
-DA:71,2
-DA:73,16
-DA:77,2
-DA:78,2
-DA:80,2
-DA:81,4
-DA:85,2
-DA:86,4
-DA:88,6
-LF:41
-LH:37
+DA:31,0
+DA:32,0
+DA:37,2
+DA:39,4
+DA:42,0
+LF:16
+LH:13
end_of_record
-SF:lib\features\create_diet\presentation\widgets\status_drop_down_widget.dart
-DA:16,2
-DA:18,2
-DA:19,2
-DA:27,2
-DA:29,2
-DA:30,4
-DA:31,4
-DA:32,6
-DA:33,6
-DA:45,4
-DA:46,3
-DA:47,3
-DA:48,0
-DA:49,0
-DA:54,2
-DA:56,2
-DA:57,2
-DA:58,2
-DA:59,2
-DA:61,2
-DA:62,2
-DA:63,2
-DA:64,2
-DA:65,2
-DA:66,6
-DA:68,0
-DA:70,0
-DA:71,0
-DA:73,0
-DA:79,2
-DA:80,2
-DA:81,4
-DA:82,4
-DA:83,2
-DA:84,4
-DA:85,6
-DA:89,2
-DA:90,2
-DA:92,2
-DA:96,0
-LF:40
-LH:33
-end_of_record
-SF:lib\features\create_diet\repositories\create_diet_repository.dart
-DA:8,0
-DA:10,0
-DA:22,0
-DA:23,0
-DA:24,0
+SF:lib\features\blog_post_create\repositories\blog_post_repository.dart
+DA:15,0
+DA:19,0
DA:25,0
DA:26,0
DA:27,0
DA:28,0
DA:29,0
-DA:30,0
-DA:31,0
+DA:32,0
DA:37,0
+DA:40,0
+DA:42,0
+DA:44,0
+DA:46,0
+DA:47,0
+DA:49,0
+DA:52,0
+DA:54,0
+DA:58,0
+DA:63,0
+DA:71,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:82,0
+DA:88,0
+LF:25
+LH:0
+end_of_record
+SF:lib\features\blog_post_create\services\blog_post_service.g.dart
+DA:14,0
+DA:22,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:35,0
+DA:36,0
+DA:41,0
+DA:43,0
+DA:46,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:55,0
+DA:56,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:68,0
+DA:70,0
+DA:73,0
+DA:75,0
+DA:76,0
+DA:77,0
+DA:79,0
+DA:80,0
+DA:81,0
+DA:82,0
+DA:83,0
+DA:87,0
+DA:89,0
+DA:92,0
+DA:93,0
+DA:94,0
+DA:95,0
+DA:96,0
+DA:97,0
+DA:99,0
+DA:105,0
+DA:106,0
+DA:110,0
+DA:112,0
+DA:113,0
+DA:116,0
+LF:46
+LH:0
+end_of_record
+SF:lib\core\app_config.dart
+DA:18,1
+DA:19,2
+DA:20,1
+DA:21,2
+DA:22,0
+DA:28,0
+DA:30,1
+DA:31,1
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:46,0
+DA:54,0
+LF:18
+LH:6
+end_of_record
+SF:lib\core\app_initializer.dart
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:34,0
+DA:35,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:47,0
+DA:48,0
+DA:52,0
+DA:54,0
+DA:59,0
+DA:60,0
+DA:61,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+LF:28
+LH:0
+end_of_record
+SF:lib\core\env_config.dart
+DA:4,0
+DA:5,4
+DA:8,0
+DA:11,0
+DA:14,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:20,0
+DA:21,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:29,0
+DA:30,0
+DA:33,0
+DA:34,0
+DA:37,0
+DA:38,0
+DA:41,0
+DA:44,0
+DA:45,0
+DA:48,0
+DA:49,0
+DA:52,0
+DA:53,0
+DA:54,0
+LF:27
+LH:1
+end_of_record
+SF:lib\core\internet_connection_cubit\internet_connection_cubit.dart
+DA:14,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:22,0
+DA:23,0
+DA:31,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:41,0
+DA:44,0
DA:45,0
DA:46,0
DA:47,0
+DA:50,0
DA:51,0
+DA:55,0
+DA:56,0
+DA:58,0
+DA:59,0
+DA:67,0
+DA:69,0
+DA:70,0
+DA:71,0
+LF:28
+LH:0
+end_of_record
+SF:lib\core\locator_service.dart
+DA:11,12
+DA:14,0
+DA:16,0
+DA:19,0
+DA:22,0
+DA:25,0
+DA:28,0
+DA:31,0
+LF:8
+LH:1
+end_of_record
+SF:lib\core\views\cubit\views_cubit.dart
+DA:11,0
+DA:12,0
+DA:36,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:49,0
+DA:51,0
+DA:52,0
DA:53,0
DA:54,0
DA:55,0
@@ -458,105 +325,359 @@ DA:56,0
DA:57,0
DA:58,0
DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:73,0
+DA:75,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:79,0
+DA:80,0
+DA:83,0
+DA:84,0
+DA:88,0
+DA:89,0
+DA:90,0
+DA:94,0
+DA:95,0
+DA:96,0
+DA:99,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:108,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:115,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:121,0
+DA:123,0
+DA:124,0
+DA:125,0
+DA:126,0
+LF:62
+LH:0
+end_of_record
+SF:lib\features\bottom_navigation_bar\presentation\bloc\new_messages_cubit\new_messages_cubit.dart
+DA:7,0
+DA:9,0
+DA:10,0
+DA:11,0
+LF:4
+LH:0
+end_of_record
+SF:lib\features\notifications\presentation\notifications_cubit\notifications_cubit.dart
+DA:16,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:25,0
+DA:27,0
+DA:28,0
+DA:31,0
+DA:37,0
+DA:43,0
+DA:49,0
+DA:55,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:69,0
+DA:75,0
+DA:81,0
+DA:87,0
+DA:93,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:105,0
+DA:106,0
+DA:107,0
+DA:108,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:113,0
+DA:115,0
+DA:116,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:126,0
+DA:132,0
+DA:138,0
+DA:139,0
+DA:145,0
+DA:151,0
+DA:157,0
+DA:163,0
+DA:169,0
+DA:175,0
+DA:181,0
+DA:187,0
+DA:193,0
+DA:199,0
+DA:205,0
+DA:211,0
+DA:217,0
+DA:223,0
+DA:229,0
+DA:235,0
+DA:236,0
+DA:237,0
+DA:238,0
+DA:239,0
+DA:240,0
+DA:246,0
+DA:252,0
+DA:253,0
+DA:254,0
+DA:255,0
+DA:256,0
+DA:257,0
+DA:263,0
+DA:264,0
+DA:267,0
+DA:271,0
+DA:272,0
+DA:278,0
+DA:279,0
+DA:280,0
+DA:283,0
+DA:284,0
+DA:285,0
+DA:288,0
+DA:289,0
+DA:290,0
+DA:291,0
+DA:292,0
+DA:293,0
+DA:294,0
+DA:295,0
+DA:300,0
+DA:301,0
+DA:303,0
+DA:304,0
+DA:306,0
+DA:307,0
+DA:308,0
+DA:312,0
+DA:314,0
+DA:316,0
+DA:317,0
+DA:319,0
+DA:320,0
+DA:322,0
+DA:323,0
+DA:324,0
+DA:326,0
+DA:327,0
+DA:328,0
+DA:329,0
+DA:330,0
+DA:337,0
+DA:341,0
+DA:342,0
+DA:343,0
+DA:345,0
+DA:347,0
+DA:348,0
+DA:351,0
+DA:352,0
+DA:354,0
+DA:356,0
+DA:357,0
+DA:358,0
+DA:360,0
+DA:361,0
+DA:362,0
+DA:363,0
+DA:370,0
+DA:373,0
+DA:374,0
+DA:379,0
+DA:380,0
+DA:381,0
+DA:383,0
+DA:384,0
+DA:385,0
+DA:386,0
+DA:388,0
+DA:389,0
+LF:141
+LH:0
+end_of_record
+SF:lib\features\bottom_navigation_bar\presentation\bloc\profile_avatar_cubit\profile_avatar_cubit.dart
+DA:12,0
+DA:14,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:22,0
+DA:23,0
+DA:25,0
+DA:26,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:48,0
+DA:49,0
+DA:51,0
+DA:52,0
+DA:54,0
+DA:55,0
+LF:27
+LH:0
+end_of_record
+SF:lib\features\chat\presentation\bloc\chats_cubit\chats_cubit.dart
+DA:20,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:48,0
+DA:49,0
+DA:50,0
+DA:55,0
+DA:57,0
+DA:58,0
+DA:63,0
DA:64,0
DA:65,0
-DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
-DA:73,0
-DA:85,0
-DA:98,0
+DA:77,0
+DA:79,0
+DA:80,0
+DA:81,0
+DA:86,0
+DA:88,0
+DA:89,0
+DA:90,0
+DA:91,0
+DA:92,0
+DA:93,0
+DA:94,0
DA:100,0
-DA:101,0
DA:102,0
DA:103,0
DA:104,0
DA:105,0
-DA:106,0
-DA:107,0
-DA:108,0
+DA:113,0
DA:115,0
+DA:116,0
+DA:117,0
DA:118,0
-DA:121,0
-DA:124,0
-DA:127,0
-DA:130,0
-DA:133,0
-DA:136,0
-DA:137,0
-DA:138,0
-DA:139,0
-DA:144,0
-DA:146,0
-DA:147,0
-DA:148,0
-DA:149,0
-DA:150,0
-DA:151,0
-LF:63
-LH:0
-end_of_record
-SF:lib\features\glossary\repositories\glossary_repository.dart
-DA:7,0
-DA:11,0
-DA:13,0
-LF:3
-LH:0
-end_of_record
-SF:lib\features\profile\repositories\profile_repository.dart
-DA:16,0
-DA:18,0
-DA:20,0
-DA:26,0
-DA:28,0
-DA:34,0
-DA:36,0
-DA:42,0
-DA:44,0
-DA:50,0
-DA:52,0
-DA:62,0
-DA:64,0
-DA:70,0
-DA:72,0
-DA:78,0
-DA:81,0
-DA:83,0
-DA:90,0
-DA:93,0
-DA:95,0
-DA:102,0
-DA:104,0
-DA:110,0
-DA:112,0
-DA:118,0
-DA:120,0
+DA:122,0
+DA:125,0
DA:126,0
-DA:128,0
+DA:127,0
+DA:129,0
DA:134,0
+DA:135,0
DA:136,0
+DA:138,0
DA:142,0
-DA:144,0
-DA:150,0
-DA:152,0
-DA:158,0
+DA:143,0
+DA:145,0
+DA:148,0
+DA:151,0
+DA:153,0
+DA:154,0
+DA:156,0
+DA:157,0
DA:159,0
-DA:160,0
-DA:161,0
-DA:164,0
DA:165,0
+DA:166,0
+DA:167,0
DA:168,0
-DA:170,0
-DA:172,0
+DA:171,0
+DA:173,0
DA:176,0
DA:178,0
-DA:185,0
-DA:187,0
-LF:48
+DA:179,0
+LF:80
+LH:0
+end_of_record
+SF:lib\features\feed\presentation\bloc\feed_cubit\feed_cubit.dart
+DA:15,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:29,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:38,0
+DA:39,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:48,0
+DA:49,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:62,0
+DA:63,0
+DA:69,0
+DA:71,0
+DA:73,0
+DA:77,0
+DA:79,0
+DA:80,0
+DA:81,0
+DA:82,0
+LF:39
LH:0
end_of_record
SF:lib\generated\l10n.dart
@@ -1703,2123 +1824,6 @@ DA:3523,15
LF:1140
LH:128
end_of_record
-SF:lib\features\create_diet\services\create_diet_service.g.dart
-DA:14,0
-DA:22,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:28,0
-DA:29,0
-DA:35,0
-DA:36,0
-DA:41,0
-DA:43,0
-DA:46,0
-DA:48,0
-DA:54,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:60,0
-DA:61,0
-DA:67,0
-DA:68,0
-DA:73,0
-DA:75,0
-DA:78,0
-DA:80,0
-DA:86,0
-DA:88,0
-DA:89,0
-DA:90,0
-DA:92,0
-DA:93,0
-DA:99,0
-DA:100,0
-DA:105,0
-DA:107,0
-DA:110,0
-DA:112,0
-DA:118,0
-DA:123,0
-DA:124,0
-DA:125,0
-DA:127,0
-DA:128,0
-DA:134,0
-DA:135,0
-DA:136,0
-DA:140,0
-DA:142,0
-DA:145,0
-DA:150,0
-DA:151,0
-DA:152,0
-DA:154,0
-DA:155,0
-DA:161,0
-DA:162,0
-DA:163,0
-DA:167,0
-DA:169,0
-DA:172,0
-DA:177,0
-DA:178,0
-DA:179,0
-DA:181,0
-DA:182,0
-DA:188,0
-DA:189,0
-DA:190,0
-DA:194,0
-DA:196,0
-DA:199,0
-DA:203,0
-DA:204,0
-DA:205,0
-DA:207,0
-DA:208,0
-DA:209,0
-DA:210,0
-DA:211,0
-DA:215,0
-DA:217,0
-DA:218,0
-DA:219,0
-DA:223,0
-DA:224,0
-DA:225,0
-DA:226,0
-DA:227,0
-DA:228,0
-DA:230,0
-DA:236,0
-DA:237,0
-DA:241,0
-DA:243,0
-DA:244,0
-DA:247,0
-LF:96
-LH:0
-end_of_record
-SF:lib\features\feed\models\diets_pagination_model.dart
-DA:16,0
-DA:40,0
-DA:51,0
-DA:54,0
-DA:56,0
-DA:58,0
-DA:70,0
-DA:73,0
-DA:74,0
-DA:75,0
-DA:92,0
-DA:105,0
-DA:108,0
-DA:109,0
-DA:110,0
-DA:124,0
-DA:126,0
-DA:128,0
-DA:130,0
-DA:137,0
-DA:138,0
-DA:139,0
-DA:140,0
-DA:146,1
-DA:154,0
-DA:156,0
-DA:157,0
-DA:165,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:182,0
-LF:32
-LH:1
-end_of_record
-SF:lib\features\feed\models\diets_pagination_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:50,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:61,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:70,0
-DA:71,0
-DA:72,0
-DA:73,0
-DA:74,0
-DA:75,0
-DA:79,0
-DA:80,0
-DA:81,0
-DA:82,0
-DA:83,0
-DA:84,0
-DA:85,0
-DA:94,0
-DA:95,0
-DA:97,0
-DA:98,0
-DA:100,0
-DA:101,0
-DA:102,0
-DA:103,0
-DA:104,0
-DA:105,0
-DA:106,0
-DA:109,0
-DA:110,0
-DA:111,0
-DA:112,0
-DA:113,0
-DA:114,0
-DA:115,0
-DA:118,0
-DA:119,0
-DA:120,0
-DA:121,0
-DA:122,0
-DA:123,0
-DA:125,0
-DA:128,0
-DA:129,0
-DA:130,0
-DA:131,0
-DA:132,0
-DA:133,0
-DA:142,0
-DA:143,0
-DA:144,0
-DA:145,0
-DA:146,0
-DA:149,0
-DA:150,0
-DA:151,0
-DA:152,0
-DA:153,0
-DA:156,0
-DA:157,0
-DA:158,0
-DA:159,0
-DA:160,0
-DA:161,0
-DA:164,0
-DA:165,0
-DA:166,0
-DA:167,0
-DA:168,0
-DA:169,0
-LF:115
-LH:0
-end_of_record
-SF:lib\features\feed\models\feed_blog_post_model.dart
-DA:25,0
-DA:28,0
-LF:2
-LH:0
-end_of_record
-SF:lib\features\feed\models\feed_blog_post_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-LF:30
-LH:0
-end_of_record
-SF:lib\features\glossary\models\glossary_model.dart
-DA:12,0
-DA:21,0
-DA:40,0
-LF:3
-LH:0
-end_of_record
-SF:lib\features\glossary\models\glossary_model.g.dart
-DA:9,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:17,0
-DA:19,0
-DA:21,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:29,0
-DA:31,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:59,0
-DA:60,0
-DA:61,0
-LF:40
-LH:0
-end_of_record
-SF:lib\features\glossary\services\glossary_service.g.dart
-DA:14,0
-DA:22,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:38,0
-DA:40,0
-DA:43,0
-DA:45,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:58,0
-DA:64,0
-DA:65,0
-DA:69,0
-DA:71,0
-DA:72,0
-DA:75,0
-LF:26
-LH:0
-end_of_record
-SF:lib\features\profile\models\chosen_diets_pagination_model.dart
-DA:13,0
-DA:26,0
-DA:29,0
-DA:31,0
-LF:4
-LH:0
-end_of_record
-SF:lib\features\profile\models\chosen_diets_pagination_model.g.dart
-DA:9,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:17,0
-DA:19,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-LF:21
-LH:0
-end_of_record
-SF:lib\features\profile\models\circumference_model.dart
-DA:19,0
-LF:1
-LH:0
-end_of_record
-SF:lib\features\profile\models\circumference_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-LF:18
-LH:0
-end_of_record
-SF:lib\features\profile\models\profile_model.dart
-DA:35,0
-DA:45,0
-DA:61,0
-DA:71,0
-DA:106,0
-DA:115,0
-LF:6
-LH:0
-end_of_record
-SF:lib\features\profile\models\profile_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:21,0
-DA:22,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:46,0
-DA:47,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:55,0
-DA:58,0
-DA:59,0
-DA:60,0
-DA:61,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:70,0
-DA:71,0
-DA:72,0
-DA:73,0
-DA:74,0
-DA:75,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:79,0
-DA:80,0
-DA:83,0
-DA:85,0
-DA:86,0
-DA:87,0
-DA:90,0
-DA:92,0
-DA:94,0
-DA:95,0
-DA:96,0
-DA:97,0
-DA:98,0
-DA:99,0
-DA:100,0
-DA:102,0
-DA:106,0
-DA:107,0
-DA:108,0
-DA:109,0
-DA:110,0
-DA:111,0
-DA:112,0
-DA:114,0
-DA:118,0
-DA:119,0
-DA:120,0
-DA:121,0
-DA:122,0
-DA:123,0
-DA:124,0
-DA:125,0
-DA:126,0
-DA:127,0
-DA:136,0
-DA:138,0
-DA:139,0
-DA:140,0
-DA:143,0
-DA:145,0
-DA:147,0
-DA:148,0
-DA:149,0
-DA:150,0
-DA:151,0
-DA:152,0
-DA:153,0
-DA:154,0
-DA:155,0
-DA:156,0
-DA:157,0
-DA:158,0
-DA:159,0
-DA:160,0
-DA:161,0
-DA:162,0
-DA:163,0
-DA:164,0
-DA:165,0
-DA:166,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:170,0
-DA:171,0
-DA:173,0
-DA:174,0
-DA:176,0
-DA:177,0
-DA:178,0
-DA:179,0
-DA:182,0
-DA:184,0
-DA:185,0
-DA:186,0
-DA:187,0
-DA:188,0
-DA:189,0
-DA:190,0
-DA:191,0
-DA:192,0
-DA:193,0
-DA:194,0
-DA:195,0
-DA:196,0
-DA:197,0
-DA:198,0
-DA:199,0
-DA:200,0
-DA:201,0
-DA:202,0
-DA:203,0
-DA:204,0
-DA:205,0
-DA:206,0
-DA:207,0
-DA:208,0
-DA:209,0
-DA:210,0
-DA:211,0
-DA:214,0
-DA:215,0
-DA:217,0
-DA:219,0
-LF:163
-LH:0
-end_of_record
-SF:lib\features\profile\models\sub_model.dart
-DA:16,0
-DA:31,0
-LF:2
-LH:0
-end_of_record
-SF:lib\features\profile\models\sub_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-LF:28
-LH:0
-end_of_record
-SF:lib\features\profile\models\weight_model.dart
-DA:18,0
-LF:1
-LH:0
-end_of_record
-SF:lib\features\profile\models\weight_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:25,0
-LF:15
-LH:0
-end_of_record
-SF:lib\features\profile\services\profile_service.g.dart
-DA:14,0
-DA:22,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:36,0
-DA:38,0
-DA:41,0
-DA:43,0
-DA:49,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:63,0
-DA:65,0
-DA:68,0
-DA:70,0
-DA:76,0
-DA:78,0
-DA:79,0
-DA:80,0
-DA:82,0
-DA:83,0
-DA:84,0
-DA:85,0
-DA:90,0
-DA:92,0
-DA:95,0
-DA:97,0
-DA:103,0
-DA:107,0
-DA:108,0
-DA:109,0
-DA:111,0
-DA:112,0
-DA:113,0
-DA:114,0
-DA:115,0
-DA:119,0
-DA:121,0
-DA:124,0
-DA:126,0
-DA:132,0
-DA:138,0
-DA:139,0
-DA:140,0
-DA:141,0
-DA:142,0
-DA:143,0
-DA:145,0
-DA:146,0
-DA:148,0
-DA:149,0
-DA:151,0
-DA:152,0
-DA:153,0
-DA:154,0
-DA:159,0
-DA:161,0
-DA:164,0
-DA:166,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:170,0
-DA:171,0
-DA:172,0
-DA:173,0
-DA:174,0
-DA:179,0
-DA:181,0
-DA:184,0
-DA:188,0
-DA:189,0
-DA:190,0
-DA:192,0
-DA:193,0
-DA:194,0
-DA:195,0
-DA:196,0
-DA:200,0
-DA:202,0
-DA:205,0
-DA:206,0
-DA:207,0
-DA:208,0
-DA:210,0
-DA:212,0
-DA:218,0
-DA:220,0
-DA:221,0
-DA:222,0
-DA:224,0
-DA:225,0
-DA:226,0
-DA:227,0
-DA:228,0
-DA:232,0
-DA:234,0
-DA:237,0
-DA:238,0
-DA:239,0
-DA:241,0
-DA:247,0
-DA:252,0
-DA:253,0
-DA:254,0
-DA:256,0
-DA:257,0
-DA:258,0
-DA:259,0
-DA:260,0
-DA:264,0
-DA:266,0
-DA:269,0
-DA:270,0
-DA:271,0
-DA:273,0
-DA:279,0
-DA:283,0
-DA:284,0
-DA:285,0
-DA:287,0
-DA:288,0
-DA:289,0
-DA:290,0
-DA:291,0
-DA:295,0
-DA:297,0
-DA:300,0
-DA:301,0
-DA:302,0
-DA:303,0
-DA:305,0
-DA:307,0
-DA:313,0
-DA:318,0
-DA:319,0
-DA:320,0
-DA:322,0
-DA:323,0
-DA:324,0
-DA:325,0
-DA:326,0
-DA:330,0
-DA:332,0
-DA:335,0
-DA:336,0
-DA:337,0
-DA:338,0
-DA:340,0
-DA:342,0
-DA:348,0
-DA:353,0
-DA:354,0
-DA:357,0
-DA:358,0
-DA:360,0
-DA:361,0
-DA:362,0
-DA:363,0
-DA:364,0
-DA:368,0
-DA:370,0
-DA:373,0
-DA:375,0
-DA:381,0
-DA:386,0
-DA:387,0
-DA:390,0
-DA:391,0
-DA:393,0
-DA:394,0
-DA:395,0
-DA:396,0
-DA:397,0
-DA:401,0
-DA:403,0
-DA:406,0
-DA:408,0
-DA:414,0
-DA:416,0
-DA:417,0
-DA:418,0
-DA:420,0
-DA:421,0
-DA:422,0
-DA:423,0
-DA:424,0
-DA:428,0
-DA:430,0
-DA:433,0
-DA:435,0
-DA:436,0
-DA:437,0
-DA:439,0
-DA:440,0
-DA:441,0
-DA:442,0
-DA:443,0
-DA:447,0
-DA:449,0
-DA:452,0
-DA:454,0
-DA:455,0
-DA:456,0
-DA:457,0
-DA:458,0
-DA:459,0
-DA:461,0
-DA:462,0
-DA:463,0
-DA:467,0
-DA:468,0
-DA:474,0
-DA:475,0
-DA:480,0
-DA:482,0
-DA:485,0
-DA:487,0
-DA:488,0
-DA:489,0
-DA:491,0
-DA:492,0
-DA:493,0
-DA:494,0
-DA:499,0
-DA:501,0
-DA:504,0
-DA:506,0
-DA:507,0
-DA:508,0
-DA:510,0
-DA:511,0
-DA:512,0
-DA:513,0
-DA:518,0
-DA:520,0
-DA:523,0
-DA:525,0
-DA:531,0
-DA:535,0
-DA:536,0
-DA:537,0
-DA:539,0
-DA:540,0
-DA:541,0
-DA:542,0
-DA:547,0
-DA:549,0
-DA:550,0
-DA:551,0
-DA:555,0
-DA:557,0
-DA:558,0
-DA:559,0
-DA:561,0
-DA:562,0
-DA:563,0
-DA:564,0
-DA:569,0
-DA:571,0
-DA:574,0
-DA:576,0
-DA:582,0
-DA:584,0
-DA:585,0
-DA:586,0
-DA:587,0
-DA:588,0
-DA:589,0
-DA:590,0
-DA:591,0
-DA:592,0
-DA:597,0
-DA:599,0
-DA:602,0
-DA:604,0
-DA:605,0
-DA:606,0
-DA:608,0
-DA:609,0
-DA:610,0
-DA:611,0
-DA:616,0
-DA:618,0
-DA:621,0
-DA:623,0
-DA:624,0
-DA:625,0
-DA:627,0
-DA:628,0
-DA:629,0
-DA:630,0
-DA:635,0
-DA:637,0
-DA:640,0
-DA:641,0
-DA:642,0
-DA:643,0
-DA:644,0
-DA:645,0
-DA:647,0
-DA:653,0
-DA:654,0
-DA:658,0
-DA:660,0
-DA:661,0
-DA:664,0
-LF:318
-LH:0
-end_of_record
-SF:lib\core\const.dart
-DA:1,0
-LF:1
-LH:0
-end_of_record
-SF:lib\core\image_compressing\image_compress_utility.dart
-DA:7,0
-DA:8,0
-DA:9,0
-DA:10,0
-DA:11,0
-DA:13,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:40,0
-DA:41,0
-DA:46,0
-DA:47,0
-DA:49,0
-DA:50,0
-DA:57,0
-LF:28
-LH:0
-end_of_record
-SF:lib\core\models\pagination_model.dart
-DA:15,0
-DA:33,0
-DA:44,0
-LF:3
-LH:0
-end_of_record
-SF:lib\core\models\pagination_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:47,0
-DA:48,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:57,0
-DA:58,0
-DA:59,0
-DA:60,0
-LF:42
-LH:0
-end_of_record
-SF:lib\features\consultant\become_consultant\models\consultation_request_model.dart
-DA:17,0
-DA:26,0
-DA:43,0
-LF:3
-LH:0
-end_of_record
-SF:lib\features\consultant\become_consultant\models\consultation_request_model.g.dart
-DA:9,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:21,0
-DA:22,0
-DA:26,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:35,0
-DA:36,0
-DA:38,0
-DA:39,0
-DA:41,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:47,0
-DA:48,0
-DA:51,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-LF:33
-LH:0
-end_of_record
-SF:lib\features\create_plan\models\create_plan_model.dart
-DA:9,3
-LF:1
-LH:1
-end_of_record
-SF:lib\features\feed\models\plan_pagination_model.dart
-DA:18,0
-DA:46,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:56,0
-DA:57,0
-DA:60,0
-DA:72,0
-DA:74,12
-DA:77,0
-DA:78,0
-DA:79,0
-DA:81,0
-DA:86,5
-DA:94,0
-DA:96,0
-DA:97,0
-LF:18
-LH:2
-end_of_record
-SF:lib\features\feed\models\plan_pagination_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:18,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:59,0
-DA:60,0
-DA:61,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:70,0
-DA:73,0
-DA:74,0
-DA:75,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:81,0
-DA:82,0
-DA:83,0
-DA:84,0
-DA:85,0
-DA:86,0
-DA:89,0
-DA:90,0
-DA:91,0
-DA:92,0
-DA:93,0
-DA:96,0
-DA:97,0
-DA:98,0
-DA:99,0
-DA:100,0
-LF:77
-LH:0
-end_of_record
-SF:lib\features\create_plan\presentation\cubit\create_plan_cubit.dart
-DA:14,9
-DA:16,0
-DA:17,0
-DA:18,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:48,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:52,0
-DA:54,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:61,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:70,0
-DA:71,0
-DA:72,0
-DA:74,0
-DA:75,0
-DA:79,0
-DA:82,0
-DA:83,0
-DA:84,0
-DA:87,0
-DA:88,0
-DA:91,0
-DA:92,0
-DA:93,0
-DA:94,0
-DA:98,0
-DA:99,0
-DA:102,0
-DA:103,0
-DA:104,0
-DA:105,0
-DA:108,0
-DA:112,0
-DA:113,0
-DA:114,0
-DA:115,0
-DA:118,0
-DA:122,0
-DA:123,0
-DA:124,0
-DA:127,0
-DA:131,0
-DA:132,0
-DA:133,0
-DA:134,0
-DA:137,0
-DA:141,0
-DA:142,0
-DA:143,0
-DA:146,0
-DA:150,0
-DA:151,0
-DA:152,0
-DA:153,0
-DA:154,0
-DA:155,0
-DA:158,0
-DA:159,0
-DA:163,0
-DA:164,0
-DA:165,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:172,0
-DA:173,0
-DA:176,0
-DA:177,0
-DA:178,0
-DA:181,0
-DA:182,0
-DA:185,0
-DA:186,0
-DA:187,0
-DA:190,0
-DA:191,0
-DA:196,0
-DA:197,0
-DA:198,0
-DA:200,0
-DA:201,0
-DA:202,0
-DA:205,0
-DA:206,0
-DA:207,0
-DA:208,0
-DA:209,0
-DA:212,0
-DA:215,0
-DA:216,0
-DA:220,0
-DA:221,0
-DA:222,0
-DA:225,0
-DA:226,0
-DA:229,0
-DA:232,0
-DA:233,0
-DA:234,0
-DA:235,0
-DA:238,0
-DA:242,0
-DA:243,0
-DA:244,0
-DA:247,0
-DA:248,0
-DA:251,0
-DA:254,0
-DA:255,0
-DA:256,0
-DA:257,0
-DA:260,0
-DA:264,0
-DA:266,0
-DA:267,0
-DA:270,0
-DA:273,0
-DA:274,0
-DA:275,0
-DA:276,0
-DA:279,0
-DA:282,0
-DA:283,0
-DA:287,0
-DA:288,0
-DA:289,0
-DA:290,0
-DA:291,0
-DA:292,0
-DA:295,0
-DA:296,0
-DA:300,0
-DA:301,0
-DA:302,0
-DA:304,0
-DA:305,0
-DA:306,0
-DA:309,0
-DA:310,0
-DA:312,0
-DA:314,0
-DA:315,0
-DA:316,0
-DA:319,0
-DA:320,0
-DA:323,0
-DA:324,0
-DA:325,0
-DA:328,0
-DA:329,0
-DA:334,0
-DA:335,0
-DA:336,0
-DA:337,0
-DA:338,0
-DA:339,0
-DA:342,0
-DA:343,0
-DA:347,0
-DA:348,0
-DA:349,0
-DA:352,0
-DA:353,0
-DA:354,0
-DA:357,0
-DA:358,0
-DA:360,0
-DA:361,0
-DA:362,0
-DA:363,0
-DA:366,0
-DA:367,0
-DA:370,0
-DA:371,0
-DA:372,0
-DA:375,0
-DA:376,0
-DA:381,0
-DA:382,0
-DA:383,0
-DA:384,0
-DA:385,0
-DA:386,0
-DA:387,0
-DA:388,0
-DA:389,0
-DA:393,0
-DA:395,0
-DA:396,0
-DA:397,0
-DA:399,0
-DA:400,0
-DA:401,0
-DA:403,0
-DA:404,0
-DA:405,0
-DA:406,0
-DA:407,0
-DA:408,0
-DA:409,0
-DA:410,0
-DA:413,0
-DA:414,0
-DA:416,0
-DA:417,0
-DA:418,0
-DA:419,0
-DA:420,0
-DA:422,0
-DA:423,0
-DA:424,0
-DA:425,0
-DA:426,0
-DA:428,0
-DA:429,0
-DA:430,0
-DA:431,0
-DA:432,0
-DA:436,0
-DA:438,0
-DA:439,0
-DA:440,0
-DA:441,0
-DA:442,0
-DA:446,0
-DA:447,0
-DA:450,0
-DA:451,0
-LF:257
-LH:1
-end_of_record
-SF:lib\features\create_plan\presentation\cubit\create_plan_state.dart
-DA:19,6
-DA:23,3
-DA:24,3
-DA:25,3
-DA:26,12
-DA:42,6
-DA:48,3
-DA:49,3
-DA:50,3
-DA:51,3
-DA:66,6
-DA:71,3
-LF:12
-LH:12
-end_of_record
-SF:lib\features\create_plan\repositories\create_plan_repository.dart
-DA:7,0
-DA:9,0
-DA:12,0
-DA:13,0
-LF:4
-LH:0
-end_of_record
-SF:lib\features\create_plan\services\create_plan_service.g.dart
-DA:14,0
-DA:22,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:28,0
-DA:29,0
-DA:35,0
-DA:36,0
-DA:41,0
-DA:43,0
-DA:46,0
-DA:47,0
-DA:48,0
-DA:49,0
-DA:50,0
-DA:51,0
-DA:53,0
-DA:59,0
-DA:60,0
-DA:64,0
-DA:66,0
-DA:67,0
-DA:70,0
-LF:24
-LH:0
-end_of_record
-SF:lib\features\my_finance\models\card_model.dart
-DA:14,0
-DA:17,0
-DA:18,0
-LF:3
-LH:0
-end_of_record
-SF:lib\features\my_finance\models\card_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-LF:9
-LH:0
-end_of_record
-SF:lib\features\profile\models\badge_model.dart
-DA:17,0
-LF:1
-LH:0
-end_of_record
-SF:lib\features\profile\models\badge_model.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:13,0
-DA:14,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-LF:13
-LH:0
-end_of_record
-SF:lib\features\profile\models\pass_key_params.dart
-DA:14,0
-LF:1
-LH:0
-end_of_record
-SF:lib\features\profile\models\pass_key_params.g.dart
-DA:9,0
-DA:10,0
-DA:11,0
-DA:12,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:18,0
-LF:8
-LH:0
-end_of_record
-SF:lib\core\app_config.dart
-DA:18,1
-DA:19,2
-DA:20,1
-DA:21,2
-DA:22,0
-DA:28,0
-DA:30,1
-DA:31,1
-DA:35,0
-DA:36,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:46,0
-DA:54,0
-LF:18
-LH:6
-end_of_record
-SF:lib\core\app_initializer.dart
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:28,0
-DA:29,0
-DA:30,0
-DA:34,0
-DA:35,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:47,0
-DA:48,0
-DA:52,0
-DA:54,0
-DA:59,0
-DA:60,0
-DA:61,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:68,0
-DA:69,0
-LF:28
-LH:0
-end_of_record
-SF:lib\core\env_config.dart
-DA:4,0
-DA:5,4
-DA:8,0
-DA:11,0
-DA:14,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:20,0
-DA:21,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:29,0
-DA:30,0
-DA:33,0
-DA:34,0
-DA:37,0
-DA:38,0
-DA:41,0
-DA:44,0
-DA:45,0
-DA:48,0
-DA:49,0
-DA:52,0
-DA:53,0
-DA:54,0
-LF:27
-LH:1
-end_of_record
-SF:lib\core\internet_connection_cubit\internet_connection_cubit.dart
-DA:14,0
-DA:15,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:22,0
-DA:23,0
-DA:31,0
-DA:35,0
-DA:36,0
-DA:37,0
-DA:41,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:47,0
-DA:50,0
-DA:51,0
-DA:55,0
-DA:56,0
-DA:58,0
-DA:59,0
-DA:67,0
-DA:69,0
-DA:70,0
-DA:71,0
-LF:28
-LH:0
-end_of_record
-SF:lib\core\locator_service.dart
-DA:11,12
-DA:14,0
-DA:16,0
-DA:19,0
-DA:22,0
-DA:25,0
-DA:28,0
-DA:31,0
-LF:8
-LH:1
-end_of_record
-SF:lib\core\views\cubit\views_cubit.dart
-DA:11,0
-DA:12,0
-DA:36,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:49,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:73,0
-DA:75,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:79,0
-DA:80,0
-DA:83,0
-DA:84,0
-DA:88,0
-DA:89,0
-DA:90,0
-DA:94,0
-DA:95,0
-DA:96,0
-DA:99,0
-DA:100,0
-DA:101,0
-DA:102,0
-DA:103,0
-DA:104,0
-DA:108,0
-DA:109,0
-DA:110,0
-DA:111,0
-DA:112,0
-DA:115,0
-DA:117,0
-DA:118,0
-DA:119,0
-DA:121,0
-DA:123,0
-DA:124,0
-DA:125,0
-DA:126,0
-LF:62
-LH:0
-end_of_record
-SF:lib\features\bottom_navigation_bar\presentation\bloc\new_messages_cubit\new_messages_cubit.dart
-DA:7,0
-DA:9,0
-DA:10,0
-DA:11,0
-LF:4
-LH:0
-end_of_record
-SF:lib\features\notifications\presentation\notifications_cubit\notifications_cubit.dart
-DA:16,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:25,0
-DA:27,0
-DA:28,0
-DA:31,0
-DA:37,0
-DA:43,0
-DA:49,0
-DA:55,0
-DA:61,0
-DA:62,0
-DA:63,0
-DA:69,0
-DA:75,0
-DA:81,0
-DA:87,0
-DA:93,0
-DA:100,0
-DA:101,0
-DA:102,0
-DA:103,0
-DA:105,0
-DA:106,0
-DA:107,0
-DA:108,0
-DA:109,0
-DA:110,0
-DA:111,0
-DA:112,0
-DA:113,0
-DA:115,0
-DA:116,0
-DA:117,0
-DA:118,0
-DA:119,0
-DA:120,0
-DA:126,0
-DA:132,0
-DA:138,0
-DA:139,0
-DA:145,0
-DA:151,0
-DA:157,0
-DA:163,0
-DA:169,0
-DA:175,0
-DA:181,0
-DA:187,0
-DA:193,0
-DA:199,0
-DA:205,0
-DA:211,0
-DA:217,0
-DA:223,0
-DA:229,0
-DA:235,0
-DA:236,0
-DA:237,0
-DA:238,0
-DA:239,0
-DA:240,0
-DA:246,0
-DA:252,0
-DA:253,0
-DA:254,0
-DA:255,0
-DA:256,0
-DA:257,0
-DA:263,0
-DA:264,0
-DA:267,0
-DA:271,0
-DA:272,0
-DA:278,0
-DA:279,0
-DA:280,0
-DA:283,0
-DA:284,0
-DA:285,0
-DA:288,0
-DA:289,0
-DA:290,0
-DA:291,0
-DA:292,0
-DA:293,0
-DA:294,0
-DA:295,0
-DA:300,0
-DA:301,0
-DA:303,0
-DA:304,0
-DA:306,0
-DA:307,0
-DA:308,0
-DA:312,0
-DA:314,0
-DA:316,0
-DA:317,0
-DA:319,0
-DA:320,0
-DA:322,0
-DA:323,0
-DA:324,0
-DA:326,0
-DA:327,0
-DA:328,0
-DA:329,0
-DA:330,0
-DA:337,0
-DA:341,0
-DA:342,0
-DA:343,0
-DA:345,0
-DA:347,0
-DA:348,0
-DA:351,0
-DA:352,0
-DA:354,0
-DA:356,0
-DA:357,0
-DA:358,0
-DA:360,0
-DA:361,0
-DA:362,0
-DA:363,0
-DA:370,0
-DA:373,0
-DA:374,0
-DA:379,0
-DA:380,0
-DA:381,0
-DA:383,0
-DA:384,0
-DA:385,0
-DA:386,0
-DA:388,0
-DA:389,0
-LF:141
-LH:0
-end_of_record
-SF:lib\features\bottom_navigation_bar\presentation\bloc\profile_avatar_cubit\profile_avatar_cubit.dart
-DA:12,0
-DA:14,0
-DA:16,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:22,0
-DA:23,0
-DA:25,0
-DA:26,0
-DA:37,0
-DA:38,0
-DA:39,0
-DA:40,0
-DA:42,0
-DA:43,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:47,0
-DA:48,0
-DA:49,0
-DA:51,0
-DA:52,0
-DA:54,0
-DA:55,0
-LF:27
-LH:0
-end_of_record
-SF:lib\features\chat\presentation\bloc\chats_cubit\chats_cubit.dart
-DA:20,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:36,0
-DA:40,0
-DA:41,0
-DA:42,0
-DA:43,0
-DA:45,0
-DA:46,0
-DA:47,0
-DA:48,0
-DA:49,0
-DA:50,0
-DA:55,0
-DA:57,0
-DA:58,0
-DA:63,0
-DA:64,0
-DA:65,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:70,0
-DA:71,0
-DA:72,0
-DA:77,0
-DA:79,0
-DA:80,0
-DA:81,0
-DA:86,0
-DA:88,0
-DA:89,0
-DA:90,0
-DA:91,0
-DA:92,0
-DA:93,0
-DA:94,0
-DA:100,0
-DA:102,0
-DA:103,0
-DA:104,0
-DA:105,0
-DA:113,0
-DA:115,0
-DA:116,0
-DA:117,0
-DA:118,0
-DA:122,0
-DA:125,0
-DA:126,0
-DA:127,0
-DA:129,0
-DA:134,0
-DA:135,0
-DA:136,0
-DA:138,0
-DA:142,0
-DA:143,0
-DA:145,0
-DA:148,0
-DA:151,0
-DA:153,0
-DA:154,0
-DA:156,0
-DA:157,0
-DA:159,0
-DA:165,0
-DA:166,0
-DA:167,0
-DA:168,0
-DA:171,0
-DA:173,0
-DA:176,0
-DA:178,0
-DA:179,0
-LF:80
-LH:0
-end_of_record
-SF:lib\features\feed\presentation\bloc\feed_cubit\feed_cubit.dart
-DA:15,0
-DA:17,0
-DA:18,0
-DA:19,0
-DA:20,0
-DA:21,0
-DA:22,0
-DA:23,0
-DA:24,0
-DA:25,0
-DA:29,0
-DA:31,0
-DA:32,0
-DA:33,0
-DA:34,0
-DA:35,0
-DA:38,0
-DA:39,0
-DA:44,0
-DA:45,0
-DA:46,0
-DA:48,0
-DA:49,0
-DA:53,0
-DA:54,0
-DA:55,0
-DA:56,0
-DA:57,0
-DA:58,0
-DA:62,0
-DA:63,0
-DA:69,0
-DA:71,0
-DA:73,0
-DA:77,0
-DA:79,0
-DA:80,0
-DA:81,0
-DA:82,0
-LF:39
-LH:0
-end_of_record
SF:lib\firebase_options.dart
DA:18,0
DA:20,0
@@ -4517,10 +2521,15 @@ DA:84,0
LF:36
LH:0
end_of_record
+SF:lib\core\const.dart
+DA:1,0
+LF:1
+LH:0
+end_of_record
SF:lib\core\cubit\base_cubit.dart
-DA:6,0
-DA:9,0
-DA:10,0
+DA:6,3
+DA:9,2
+DA:10,6
DA:15,0
DA:17,0
DA:19,0
@@ -4531,7 +2540,7 @@ DA:34,0
DA:37,0
DA:38,0
LF:12
-LH:0
+LH:3
end_of_record
SF:lib\core\di\app_config_registration.dart
DA:6,6
@@ -4696,26 +2705,6 @@ DA:40,0
LF:16
LH:0
end_of_record
-SF:lib\features\blog_post_create\bloc\blog_post_create_cubit\blog_post_create_cubit.dart
-DA:9,0
-DA:11,0
-DA:13,0
-DA:14,0
-DA:15,0
-DA:18,0
-DA:19,0
-DA:24,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:31,0
-DA:32,0
-DA:37,0
-DA:39,0
-DA:42,0
-LF:16
-LH:0
-end_of_record
SF:lib\features\calendar\presentation\bloc\calendar_cubit.dart
DA:8,0
DA:10,0
@@ -5027,6 +3016,499 @@ DA:18,0
LF:6
LH:0
end_of_record
+SF:lib\features\create_diet\presentation\cubit\create_diet_cubit.dart
+DA:28,9
+DA:30,1
+DA:32,4
+DA:33,2
+DA:34,3
+DA:35,1
+DA:36,1
+DA:38,1
+DA:39,0
+DA:40,0
+DA:41,0
+DA:46,2
+DA:47,3
+DA:48,3
+DA:49,3
+DA:50,3
+DA:51,2
+DA:52,1
+DA:53,4
+DA:55,1
+DA:56,1
+DA:57,1
+DA:58,1
+DA:61,2
+DA:64,7
+DA:65,4
+DA:68,0
+DA:69,0
+DA:72,0
+DA:73,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:79,0
+DA:82,0
+DA:84,0
+DA:85,0
+DA:86,0
+DA:87,0
+DA:89,0
+DA:90,0
+DA:91,0
+DA:92,0
+DA:95,0
+DA:97,0
+DA:99,0
+DA:101,0
+DA:102,0
+DA:104,0
+DA:110,0
+DA:111,0
+DA:114,0
+DA:115,0
+DA:116,0
+DA:117,0
+DA:123,0
+DA:124,0
+DA:127,0
+DA:128,0
+DA:129,0
+DA:130,0
+DA:137,0
+DA:138,0
+DA:139,0
+DA:140,0
+DA:143,0
+DA:144,0
+DA:146,0
+DA:147,0
+DA:149,0
+DA:150,0
+DA:151,0
+DA:155,0
+DA:156,0
+DA:158,0
+DA:159,0
+DA:161,0
+DA:162,0
+DA:166,0
+DA:167,0
+DA:169,0
+DA:170,0
+DA:172,0
+DA:173,0
+DA:177,0
+DA:178,0
+DA:180,0
+DA:181,0
+DA:182,0
+DA:186,0
+DA:187,0
+DA:188,0
+DA:190,0
+DA:191,0
+DA:192,0
+DA:193,0
+DA:194,0
+DA:198,0
+DA:199,0
+DA:200,0
+DA:201,0
+DA:202,0
+DA:203,0
+DA:204,0
+DA:205,0
+DA:206,0
+DA:207,0
+DA:210,0
+DA:212,0
+DA:213,0
+DA:214,0
+DA:215,0
+DA:216,0
+DA:219,0
+DA:221,0
+DA:222,0
+DA:223,0
+DA:224,0
+DA:225,0
+DA:228,0
+DA:230,0
+DA:231,0
+DA:232,0
+DA:233,0
+DA:234,0
+DA:237,0
+DA:238,0
+DA:240,0
+DA:241,0
+DA:244,0
+DA:246,0
+DA:247,0
+DA:248,0
+DA:249,0
+DA:250,0
+DA:251,0
+DA:253,0
+DA:255,0
+DA:258,0
+DA:260,0
+DA:263,0
+DA:264,0
+DA:265,0
+DA:266,0
+DA:267,0
+DA:268,0
+DA:269,0
+DA:271,0
+DA:273,0
+DA:274,0
+DA:275,0
+DA:276,0
+DA:290,0
+DA:291,0
+DA:293,0
+DA:294,0
+DA:295,0
+DA:296,0
+DA:297,0
+DA:299,0
+DA:303,0
+DA:304,0
+DA:305,0
+DA:308,0
+DA:309,0
+DA:312,0
+DA:313,0
+DA:315,0
+DA:316,0
+DA:317,0
+DA:318,0
+DA:319,0
+DA:322,0
+DA:323,0
+DA:324,0
+DA:325,0
+DA:326,0
+DA:327,0
+DA:330,0
+DA:332,0
+DA:333,0
+DA:335,0
+DA:339,0
+DA:340,0
+DA:343,0
+DA:344,0
+DA:346,0
+DA:348,0
+DA:349,0
+DA:350,0
+DA:352,0
+DA:353,0
+DA:354,0
+DA:355,0
+DA:356,0
+DA:357,0
+DA:361,0
+DA:366,0
+DA:368,0
+DA:370,0
+DA:372,0
+DA:374,0
+DA:376,0
+DA:378,0
+DA:380,0
+DA:382,0
+DA:384,0
+DA:386,0
+DA:388,0
+DA:390,0
+DA:392,0
+DA:394,0
+DA:396,0
+DA:400,0
+DA:401,0
+DA:406,0
+DA:407,0
+DA:408,0
+DA:410,0
+DA:413,0
+DA:418,0
+DA:419,0
+DA:424,0
+DA:425,0
+DA:426,0
+DA:428,0
+DA:430,0
+DA:432,0
+LF:228
+LH:23
+end_of_record
+SF:lib\features\create_plan\presentation\cubit\create_plan_cubit.dart
+DA:14,9
+DA:16,0
+DA:17,0
+DA:18,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:48,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:54,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:74,0
+DA:75,0
+DA:79,0
+DA:82,0
+DA:83,0
+DA:84,0
+DA:87,0
+DA:88,0
+DA:91,0
+DA:92,0
+DA:93,0
+DA:94,0
+DA:98,0
+DA:99,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:108,0
+DA:112,0
+DA:113,0
+DA:114,0
+DA:115,0
+DA:118,0
+DA:122,0
+DA:123,0
+DA:124,0
+DA:127,0
+DA:131,0
+DA:132,0
+DA:133,0
+DA:134,0
+DA:137,0
+DA:141,0
+DA:142,0
+DA:143,0
+DA:146,0
+DA:150,0
+DA:151,0
+DA:152,0
+DA:153,0
+DA:154,0
+DA:155,0
+DA:158,0
+DA:159,0
+DA:163,0
+DA:164,0
+DA:165,0
+DA:167,0
+DA:168,0
+DA:169,0
+DA:172,0
+DA:173,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:181,0
+DA:182,0
+DA:185,0
+DA:186,0
+DA:187,0
+DA:190,0
+DA:191,0
+DA:196,0
+DA:197,0
+DA:198,0
+DA:200,0
+DA:201,0
+DA:202,0
+DA:205,0
+DA:206,0
+DA:207,0
+DA:208,0
+DA:209,0
+DA:212,0
+DA:215,0
+DA:216,0
+DA:220,0
+DA:221,0
+DA:222,0
+DA:225,0
+DA:226,0
+DA:229,0
+DA:232,0
+DA:233,0
+DA:234,0
+DA:235,0
+DA:238,0
+DA:242,0
+DA:243,0
+DA:244,0
+DA:247,0
+DA:248,0
+DA:251,0
+DA:254,0
+DA:255,0
+DA:256,0
+DA:257,0
+DA:260,0
+DA:264,0
+DA:266,0
+DA:267,0
+DA:270,0
+DA:273,0
+DA:274,0
+DA:275,0
+DA:276,0
+DA:279,0
+DA:282,0
+DA:283,0
+DA:287,0
+DA:288,0
+DA:289,0
+DA:290,0
+DA:291,0
+DA:292,0
+DA:295,0
+DA:296,0
+DA:300,0
+DA:301,0
+DA:302,0
+DA:304,0
+DA:305,0
+DA:306,0
+DA:309,0
+DA:310,0
+DA:312,0
+DA:314,0
+DA:315,0
+DA:316,0
+DA:319,0
+DA:320,0
+DA:323,0
+DA:324,0
+DA:325,0
+DA:328,0
+DA:329,0
+DA:334,0
+DA:335,0
+DA:336,0
+DA:337,0
+DA:338,0
+DA:339,0
+DA:342,0
+DA:343,0
+DA:347,0
+DA:348,0
+DA:349,0
+DA:352,0
+DA:353,0
+DA:354,0
+DA:357,0
+DA:358,0
+DA:360,0
+DA:361,0
+DA:362,0
+DA:363,0
+DA:366,0
+DA:367,0
+DA:370,0
+DA:371,0
+DA:372,0
+DA:375,0
+DA:376,0
+DA:381,0
+DA:382,0
+DA:383,0
+DA:384,0
+DA:385,0
+DA:386,0
+DA:387,0
+DA:388,0
+DA:389,0
+DA:393,0
+DA:395,0
+DA:396,0
+DA:397,0
+DA:399,0
+DA:400,0
+DA:401,0
+DA:403,0
+DA:404,0
+DA:405,0
+DA:406,0
+DA:407,0
+DA:408,0
+DA:409,0
+DA:410,0
+DA:413,0
+DA:414,0
+DA:416,0
+DA:417,0
+DA:418,0
+DA:419,0
+DA:420,0
+DA:422,0
+DA:423,0
+DA:424,0
+DA:425,0
+DA:426,0
+DA:428,0
+DA:429,0
+DA:430,0
+DA:431,0
+DA:432,0
+DA:436,0
+DA:438,0
+DA:439,0
+DA:440,0
+DA:441,0
+DA:442,0
+DA:446,0
+DA:447,0
+DA:450,0
+DA:451,0
+LF:257
+LH:1
+end_of_record
SF:lib\features\create_recipe\presentation\bloc\create_recipe_cubit\create_recipe_cubit.dart
DA:21,3
DA:24,3
@@ -6885,35 +5367,6 @@ DA:44,0
LF:11
LH:0
end_of_record
-SF:lib\features\blog_post_create\repositories\blog_post_repository.dart
-DA:15,0
-DA:19,0
-DA:25,0
-DA:26,0
-DA:27,0
-DA:28,0
-DA:29,0
-DA:32,0
-DA:37,0
-DA:40,0
-DA:42,0
-DA:44,0
-DA:46,0
-DA:47,0
-DA:49,0
-DA:52,0
-DA:54,0
-DA:58,0
-DA:63,0
-DA:71,0
-DA:76,0
-DA:77,0
-DA:78,0
-DA:82,0
-DA:88,0
-LF:25
-LH:0
-end_of_record
SF:lib\features\calendar\repositories\calendar_repository.dart
DA:7,0
DA:9,0
@@ -7042,6 +5495,81 @@ DA:58,0
LF:13
LH:0
end_of_record
+SF:lib\features\create_diet\repositories\create_diet_repository.dart
+DA:8,0
+DA:10,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:37,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:51,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:62,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:85,0
+DA:98,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:106,0
+DA:107,0
+DA:108,0
+DA:115,0
+DA:118,0
+DA:121,0
+DA:124,0
+DA:127,0
+DA:130,0
+DA:133,0
+DA:136,0
+DA:137,0
+DA:138,0
+DA:139,0
+DA:144,0
+DA:146,0
+DA:147,0
+DA:148,0
+DA:149,0
+DA:150,0
+DA:151,0
+LF:63
+LH:0
+end_of_record
+SF:lib\features\create_plan\repositories\create_plan_repository.dart
+DA:7,0
+DA:9,0
+DA:12,0
+DA:13,0
+LF:4
+LH:0
+end_of_record
SF:lib\features\create_recipe\reporitories\recipe_repository.dart
DA:14,0
DA:16,0
@@ -7282,6 +5810,13 @@ DA:137,0
LF:39
LH:0
end_of_record
+SF:lib\features\glossary\repositories\glossary_repository.dart
+DA:7,0
+DA:11,0
+DA:13,0
+LF:3
+LH:0
+end_of_record
SF:lib\features\menu\presentation\repositories\blocked_users_repository.dart
DA:9,0
DA:13,0
@@ -7380,6 +5915,58 @@ DA:11,0
LF:3
LH:0
end_of_record
+SF:lib\features\profile\repositories\profile_repository.dart
+DA:16,0
+DA:18,0
+DA:20,0
+DA:26,0
+DA:28,0
+DA:34,0
+DA:36,0
+DA:42,0
+DA:44,0
+DA:50,0
+DA:52,0
+DA:62,0
+DA:64,0
+DA:70,0
+DA:72,0
+DA:78,0
+DA:81,0
+DA:83,0
+DA:90,0
+DA:93,0
+DA:95,0
+DA:102,0
+DA:104,0
+DA:110,0
+DA:112,0
+DA:118,0
+DA:120,0
+DA:126,0
+DA:128,0
+DA:134,0
+DA:136,0
+DA:142,0
+DA:144,0
+DA:150,0
+DA:152,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:164,0
+DA:165,0
+DA:168,0
+DA:170,0
+DA:172,0
+DA:176,0
+DA:178,0
+DA:185,0
+DA:187,0
+LF:48
+LH:0
+end_of_record
SF:lib\features\recipe\repositories\about_recipe_repository.dart
DA:12,0
DA:13,0
@@ -7704,56 +6291,6 @@ DA:96,0
LF:42
LH:0
end_of_record
-SF:lib\features\blog_post_create\services\blog_post_service.g.dart
-DA:14,0
-DA:22,0
-DA:24,0
-DA:25,0
-DA:26,0
-DA:28,0
-DA:29,0
-DA:35,0
-DA:36,0
-DA:41,0
-DA:43,0
-DA:46,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:55,0
-DA:56,0
-DA:62,0
-DA:63,0
-DA:64,0
-DA:68,0
-DA:70,0
-DA:73,0
-DA:75,0
-DA:76,0
-DA:77,0
-DA:79,0
-DA:80,0
-DA:81,0
-DA:82,0
-DA:83,0
-DA:87,0
-DA:89,0
-DA:92,0
-DA:93,0
-DA:94,0
-DA:95,0
-DA:96,0
-DA:97,0
-DA:99,0
-DA:105,0
-DA:106,0
-DA:110,0
-DA:112,0
-DA:113,0
-DA:116,0
-LF:46
-LH:0
-end_of_record
SF:lib\features\calendar\services\calendar_service.g.dart
DA:14,0
DA:22,0
@@ -8243,6 +6780,134 @@ DA:107,0
LF:32
LH:0
end_of_record
+SF:lib\features\create_diet\services\create_diet_service.g.dart
+DA:14,0
+DA:22,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:35,0
+DA:36,0
+DA:41,0
+DA:43,0
+DA:46,0
+DA:48,0
+DA:54,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:60,0
+DA:61,0
+DA:67,0
+DA:68,0
+DA:73,0
+DA:75,0
+DA:78,0
+DA:80,0
+DA:86,0
+DA:88,0
+DA:89,0
+DA:90,0
+DA:92,0
+DA:93,0
+DA:99,0
+DA:100,0
+DA:105,0
+DA:107,0
+DA:110,0
+DA:112,0
+DA:118,0
+DA:123,0
+DA:124,0
+DA:125,0
+DA:127,0
+DA:128,0
+DA:134,0
+DA:135,0
+DA:136,0
+DA:140,0
+DA:142,0
+DA:145,0
+DA:150,0
+DA:151,0
+DA:152,0
+DA:154,0
+DA:155,0
+DA:161,0
+DA:162,0
+DA:163,0
+DA:167,0
+DA:169,0
+DA:172,0
+DA:177,0
+DA:178,0
+DA:179,0
+DA:181,0
+DA:182,0
+DA:188,0
+DA:189,0
+DA:190,0
+DA:194,0
+DA:196,0
+DA:199,0
+DA:203,0
+DA:204,0
+DA:205,0
+DA:207,0
+DA:208,0
+DA:209,0
+DA:210,0
+DA:211,0
+DA:215,0
+DA:217,0
+DA:218,0
+DA:219,0
+DA:223,0
+DA:224,0
+DA:225,0
+DA:226,0
+DA:227,0
+DA:228,0
+DA:230,0
+DA:236,0
+DA:237,0
+DA:241,0
+DA:243,0
+DA:244,0
+DA:247,0
+LF:96
+LH:0
+end_of_record
+SF:lib\features\create_plan\services\create_plan_service.g.dart
+DA:14,0
+DA:22,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:35,0
+DA:36,0
+DA:41,0
+DA:43,0
+DA:46,0
+DA:47,0
+DA:48,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:53,0
+DA:59,0
+DA:60,0
+DA:64,0
+DA:66,0
+DA:67,0
+DA:70,0
+LF:24
+LH:0
+end_of_record
SF:lib\features\create_recipe\services\recipe_service.g.dart
DA:14,0
DA:22,0
@@ -9087,6 +7752,36 @@ DA:608,0
LF:280
LH:0
end_of_record
+SF:lib\features\glossary\services\glossary_service.g.dart
+DA:14,0
+DA:22,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:38,0
+DA:40,0
+DA:43,0
+DA:45,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:58,0
+DA:64,0
+DA:65,0
+DA:69,0
+DA:71,0
+DA:72,0
+DA:75,0
+LF:26
+LH:0
+end_of_record
SF:lib\features\menu\services\blocked_users_service.g.dart
DA:14,0
DA:22,0
@@ -9626,6 +8321,328 @@ DA:73,0
LF:27
LH:0
end_of_record
+SF:lib\features\profile\services\profile_service.g.dart
+DA:14,0
+DA:22,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:36,0
+DA:38,0
+DA:41,0
+DA:43,0
+DA:49,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:63,0
+DA:65,0
+DA:68,0
+DA:70,0
+DA:76,0
+DA:78,0
+DA:79,0
+DA:80,0
+DA:82,0
+DA:83,0
+DA:84,0
+DA:85,0
+DA:90,0
+DA:92,0
+DA:95,0
+DA:97,0
+DA:103,0
+DA:107,0
+DA:108,0
+DA:109,0
+DA:111,0
+DA:112,0
+DA:113,0
+DA:114,0
+DA:115,0
+DA:119,0
+DA:121,0
+DA:124,0
+DA:126,0
+DA:132,0
+DA:138,0
+DA:139,0
+DA:140,0
+DA:141,0
+DA:142,0
+DA:143,0
+DA:145,0
+DA:146,0
+DA:148,0
+DA:149,0
+DA:151,0
+DA:152,0
+DA:153,0
+DA:154,0
+DA:159,0
+DA:161,0
+DA:164,0
+DA:166,0
+DA:167,0
+DA:168,0
+DA:169,0
+DA:170,0
+DA:171,0
+DA:172,0
+DA:173,0
+DA:174,0
+DA:179,0
+DA:181,0
+DA:184,0
+DA:188,0
+DA:189,0
+DA:190,0
+DA:192,0
+DA:193,0
+DA:194,0
+DA:195,0
+DA:196,0
+DA:200,0
+DA:202,0
+DA:205,0
+DA:206,0
+DA:207,0
+DA:208,0
+DA:210,0
+DA:212,0
+DA:218,0
+DA:220,0
+DA:221,0
+DA:222,0
+DA:224,0
+DA:225,0
+DA:226,0
+DA:227,0
+DA:228,0
+DA:232,0
+DA:234,0
+DA:237,0
+DA:238,0
+DA:239,0
+DA:241,0
+DA:247,0
+DA:252,0
+DA:253,0
+DA:254,0
+DA:256,0
+DA:257,0
+DA:258,0
+DA:259,0
+DA:260,0
+DA:264,0
+DA:266,0
+DA:269,0
+DA:270,0
+DA:271,0
+DA:273,0
+DA:279,0
+DA:283,0
+DA:284,0
+DA:285,0
+DA:287,0
+DA:288,0
+DA:289,0
+DA:290,0
+DA:291,0
+DA:295,0
+DA:297,0
+DA:300,0
+DA:301,0
+DA:302,0
+DA:303,0
+DA:305,0
+DA:307,0
+DA:313,0
+DA:318,0
+DA:319,0
+DA:320,0
+DA:322,0
+DA:323,0
+DA:324,0
+DA:325,0
+DA:326,0
+DA:330,0
+DA:332,0
+DA:335,0
+DA:336,0
+DA:337,0
+DA:338,0
+DA:340,0
+DA:342,0
+DA:348,0
+DA:353,0
+DA:354,0
+DA:357,0
+DA:358,0
+DA:360,0
+DA:361,0
+DA:362,0
+DA:363,0
+DA:364,0
+DA:368,0
+DA:370,0
+DA:373,0
+DA:375,0
+DA:381,0
+DA:386,0
+DA:387,0
+DA:390,0
+DA:391,0
+DA:393,0
+DA:394,0
+DA:395,0
+DA:396,0
+DA:397,0
+DA:401,0
+DA:403,0
+DA:406,0
+DA:408,0
+DA:414,0
+DA:416,0
+DA:417,0
+DA:418,0
+DA:420,0
+DA:421,0
+DA:422,0
+DA:423,0
+DA:424,0
+DA:428,0
+DA:430,0
+DA:433,0
+DA:435,0
+DA:436,0
+DA:437,0
+DA:439,0
+DA:440,0
+DA:441,0
+DA:442,0
+DA:443,0
+DA:447,0
+DA:449,0
+DA:452,0
+DA:454,0
+DA:455,0
+DA:456,0
+DA:457,0
+DA:458,0
+DA:459,0
+DA:461,0
+DA:462,0
+DA:463,0
+DA:467,0
+DA:468,0
+DA:474,0
+DA:475,0
+DA:480,0
+DA:482,0
+DA:485,0
+DA:487,0
+DA:488,0
+DA:489,0
+DA:491,0
+DA:492,0
+DA:493,0
+DA:494,0
+DA:499,0
+DA:501,0
+DA:504,0
+DA:506,0
+DA:507,0
+DA:508,0
+DA:510,0
+DA:511,0
+DA:512,0
+DA:513,0
+DA:518,0
+DA:520,0
+DA:523,0
+DA:525,0
+DA:531,0
+DA:535,0
+DA:536,0
+DA:537,0
+DA:539,0
+DA:540,0
+DA:541,0
+DA:542,0
+DA:547,0
+DA:549,0
+DA:550,0
+DA:551,0
+DA:555,0
+DA:557,0
+DA:558,0
+DA:559,0
+DA:561,0
+DA:562,0
+DA:563,0
+DA:564,0
+DA:569,0
+DA:571,0
+DA:574,0
+DA:576,0
+DA:582,0
+DA:584,0
+DA:585,0
+DA:586,0
+DA:587,0
+DA:588,0
+DA:589,0
+DA:590,0
+DA:591,0
+DA:592,0
+DA:597,0
+DA:599,0
+DA:602,0
+DA:604,0
+DA:605,0
+DA:606,0
+DA:608,0
+DA:609,0
+DA:610,0
+DA:611,0
+DA:616,0
+DA:618,0
+DA:621,0
+DA:623,0
+DA:624,0
+DA:625,0
+DA:627,0
+DA:628,0
+DA:629,0
+DA:630,0
+DA:635,0
+DA:637,0
+DA:640,0
+DA:641,0
+DA:642,0
+DA:643,0
+DA:644,0
+DA:645,0
+DA:647,0
+DA:653,0
+DA:654,0
+DA:658,0
+DA:660,0
+DA:661,0
+DA:664,0
+LF:318
+LH:0
+end_of_record
SF:lib\features\recipe\services\about_recipe_service.g.dart
DA:14,0
DA:22,0
@@ -9891,6 +8908,38 @@ DA:59,0
LF:24
LH:0
end_of_record
+SF:lib\core\image_compressing\image_compress_utility.dart
+DA:7,0
+DA:8,0
+DA:9,0
+DA:10,0
+DA:11,0
+DA:13,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:40,0
+DA:41,0
+DA:46,0
+DA:47,0
+DA:49,0
+DA:50,0
+DA:57,0
+LF:28
+LH:0
+end_of_record
SF:lib\core\widgets\show_error_dialog.dart
DA:9,0
DA:10,0
@@ -10007,6 +9056,59 @@ DA:176,0
LF:81
LH:0
end_of_record
+SF:lib\core\models\pagination_model.dart
+DA:15,0
+DA:33,0
+DA:44,0
+LF:3
+LH:0
+end_of_record
+SF:lib\core\models\pagination_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:48,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:54,0
+DA:57,0
+DA:58,0
+DA:59,0
+DA:60,0
+LF:42
+LH:0
+end_of_record
SF:lib\core\permission_handler\permission_handler.dart
DA:9,0
DA:16,0
@@ -10901,14 +10003,13 @@ LF:98
LH:1
end_of_record
SF:lib\features\blog_post\presentation\pages\blog_post_screen.dart
-DA:25,0
-DA:27,0
+DA:26,0
DA:28,0
-DA:36,0
-DA:38,0
+DA:29,0
+DA:37,0
DA:39,0
-DA:42,0
-DA:44,0
+DA:40,0
+DA:43,0
DA:45,0
DA:46,0
DA:47,0
@@ -10919,7 +10020,7 @@ DA:51,0
DA:52,0
DA:53,0
DA:54,0
-DA:58,0
+DA:55,0
DA:59,0
DA:60,0
DA:61,0
@@ -10927,16 +10028,16 @@ DA:62,0
DA:63,0
DA:64,0
DA:65,0
-DA:68,0
-DA:75,0
+DA:66,0
+DA:69,0
DA:76,0
DA:77,0
-DA:79,0
+DA:78,0
DA:80,0
DA:81,0
-DA:83,0
-DA:85,0
-DA:87,0
+DA:82,0
+DA:84,0
+DA:86,0
DA:88,0
DA:89,0
DA:90,0
@@ -10944,25 +10045,25 @@ DA:91,0
DA:92,0
DA:93,0
DA:94,0
-DA:96,0
-DA:98,0
+DA:95,0
+DA:97,0
DA:99,0
-DA:105,0
+DA:100,0
DA:106,0
DA:107,0
DA:108,0
-DA:110,0
-DA:112,0
+DA:109,0
+DA:111,0
DA:113,0
-DA:115,0
-DA:120,0
-DA:128,0
+DA:114,0
+DA:116,0
+DA:121,0
DA:129,0
-DA:132,0
+DA:130,0
DA:133,0
-DA:136,0
+DA:134,0
DA:137,0
-DA:144,0
+DA:138,0
DA:145,0
DA:146,0
DA:147,0
@@ -10970,100 +10071,121 @@ DA:148,0
DA:149,0
DA:150,0
DA:151,0
-DA:154,0
+DA:152,0
DA:155,0
DA:156,0
DA:157,0
-DA:159,0
-DA:162,0
+DA:158,0
+DA:160,0
DA:163,0
-DA:172,0
+DA:164,0
DA:173,0
DA:174,0
DA:175,0
DA:176,0
DA:177,0
-DA:180,0
-DA:183,0
+DA:178,0
+DA:181,0
DA:184,0
DA:185,0
-DA:187,0
+DA:186,0
DA:188,0
DA:189,0
DA:190,0
-DA:195,0
-DA:198,0
+DA:191,0
+DA:196,0
DA:199,0
DA:200,0
DA:201,0
DA:202,0
-DA:204,0
-DA:207,0
+DA:203,0
+DA:205,0
DA:208,0
-DA:210,0
-DA:214,0
-DA:216,0
+DA:209,0
+DA:211,0
+DA:215,0
DA:217,0
DA:218,0
-DA:222,0
+DA:219,0
DA:223,0
DA:224,0
-DA:232,0
+DA:225,0
DA:233,0
-DA:235,0
+DA:234,0
DA:236,0
DA:237,0
+DA:238,0
+DA:239,0
DA:240,0
DA:241,0
DA:242,0
DA:243,0
+DA:244,0
DA:245,0
DA:246,0
DA:247,0
+DA:248,0
DA:249,0
DA:250,0
DA:251,0
-DA:252,0
-DA:253,0
DA:254,0
+DA:255,0
DA:256,0
+DA:257,0
DA:259,0
-DA:264,0
+DA:261,0
+DA:262,0
DA:266,0
DA:267,0
DA:268,0
DA:269,0
-DA:270,0
DA:271,0
+DA:272,0
+DA:273,0
+DA:275,0
+DA:276,0
DA:277,0
+DA:278,0
DA:279,0
DA:280,0
-DA:281,0
-DA:286,0
-DA:287,0
-DA:289,0
-DA:291,0
+DA:282,0
+DA:285,0
+DA:290,0
DA:292,0
+DA:293,0
+DA:294,0
DA:295,0
DA:296,0
DA:297,0
-DA:300,0
-DA:301,0
-DA:302,0
DA:303,0
-DA:316,0
+DA:305,0
+DA:306,0
+DA:307,0
+DA:312,0
+DA:313,0
+DA:315,0
DA:317,0
DA:318,0
-DA:319,0
-DA:320,0
+DA:321,0
DA:322,0
-DA:324,0
+DA:323,0
DA:326,0
DA:327,0
DA:328,0
-DA:330,0
-DA:332,0
-LF:162
+DA:329,0
+DA:342,0
+DA:343,0
+DA:344,0
+DA:345,0
+DA:346,0
+DA:348,0
+DA:350,0
+DA:352,0
+DA:353,0
+DA:354,0
+DA:356,0
+DA:358,0
+LF:182
LH:0
end_of_record
SF:lib\features\blog_post_create\presentation\pages\blog_post_create_screen.dart
@@ -11516,6 +10638,46 @@ DA:669,0
LF:299
LH:0
end_of_record
+SF:lib\features\feed\models\feed_blog_post_model.dart
+DA:25,0
+DA:28,0
+LF:2
+LH:0
+end_of_record
+SF:lib\features\feed\models\feed_blog_post_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+LF:30
+LH:0
+end_of_record
SF:lib\features\plans\presentation\pages\about_plan_screen.dart
DA:37,0
DA:41,0
@@ -13789,7 +12951,7 @@ LF:38
LH:2
end_of_record
SF:lib\features\create_diet\presentation\create_diet_screen.dart
-DA:31,1
+DA:31,0
DA:35,1
DA:37,1
DA:38,5
@@ -13913,7 +13075,7 @@ DA:262,3
DA:263,1
DA:265,3
LF:123
-LH:80
+LH:79
end_of_record
SF:lib\features\create_diet\presentation\diet_preview_screen.dart
DA:29,0
@@ -15024,6 +14186,183 @@ DA:189,0
LF:93
LH:0
end_of_record
+SF:lib\features\profile\models\profile_model.dart
+DA:35,0
+DA:45,0
+DA:61,0
+DA:71,0
+DA:106,0
+DA:115,0
+LF:6
+LH:0
+end_of_record
+SF:lib\features\profile\models\profile_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:21,0
+DA:22,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:46,0
+DA:47,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:55,0
+DA:58,0
+DA:59,0
+DA:60,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:74,0
+DA:75,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:79,0
+DA:80,0
+DA:83,0
+DA:85,0
+DA:86,0
+DA:87,0
+DA:90,0
+DA:92,0
+DA:94,0
+DA:95,0
+DA:96,0
+DA:97,0
+DA:98,0
+DA:99,0
+DA:100,0
+DA:102,0
+DA:106,0
+DA:107,0
+DA:108,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:114,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:124,0
+DA:125,0
+DA:126,0
+DA:127,0
+DA:136,0
+DA:138,0
+DA:139,0
+DA:140,0
+DA:143,0
+DA:145,0
+DA:147,0
+DA:148,0
+DA:149,0
+DA:150,0
+DA:151,0
+DA:152,0
+DA:153,0
+DA:154,0
+DA:155,0
+DA:156,0
+DA:157,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:162,0
+DA:163,0
+DA:164,0
+DA:165,0
+DA:166,0
+DA:167,0
+DA:168,0
+DA:169,0
+DA:170,0
+DA:171,0
+DA:173,0
+DA:174,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:179,0
+DA:182,0
+DA:184,0
+DA:185,0
+DA:186,0
+DA:187,0
+DA:188,0
+DA:189,0
+DA:190,0
+DA:191,0
+DA:192,0
+DA:193,0
+DA:194,0
+DA:195,0
+DA:196,0
+DA:197,0
+DA:198,0
+DA:199,0
+DA:200,0
+DA:201,0
+DA:202,0
+DA:203,0
+DA:204,0
+DA:205,0
+DA:206,0
+DA:207,0
+DA:208,0
+DA:209,0
+DA:210,0
+DA:211,0
+DA:214,0
+DA:215,0
+DA:217,0
+DA:219,0
+LF:163
+LH:0
+end_of_record
SF:lib\features\profile\presentation\pages\subs_screen.dart
DA:17,0
DA:23,0
@@ -15640,6 +14979,161 @@ DA:152,0
LF:66
LH:1
end_of_record
+SF:lib\features\feed\models\diets_pagination_model.dart
+DA:16,0
+DA:40,0
+DA:51,0
+DA:54,0
+DA:56,0
+DA:58,0
+DA:70,0
+DA:73,0
+DA:74,0
+DA:75,0
+DA:92,0
+DA:105,0
+DA:108,0
+DA:109,0
+DA:110,0
+DA:124,0
+DA:126,0
+DA:128,0
+DA:130,0
+DA:137,0
+DA:138,0
+DA:139,0
+DA:140,0
+DA:146,0
+DA:154,0
+DA:156,0
+DA:157,0
+DA:165,0
+DA:167,0
+DA:168,0
+DA:169,0
+DA:182,0
+LF:32
+LH:0
+end_of_record
+SF:lib\features\feed\models\diets_pagination_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:71,0
+DA:72,0
+DA:73,0
+DA:74,0
+DA:75,0
+DA:79,0
+DA:80,0
+DA:81,0
+DA:82,0
+DA:83,0
+DA:84,0
+DA:85,0
+DA:94,0
+DA:95,0
+DA:97,0
+DA:98,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:106,0
+DA:109,0
+DA:110,0
+DA:111,0
+DA:112,0
+DA:113,0
+DA:114,0
+DA:115,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:125,0
+DA:128,0
+DA:129,0
+DA:130,0
+DA:131,0
+DA:132,0
+DA:133,0
+DA:142,0
+DA:143,0
+DA:144,0
+DA:145,0
+DA:146,0
+DA:149,0
+DA:150,0
+DA:151,0
+DA:152,0
+DA:153,0
+DA:156,0
+DA:157,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:164,0
+DA:165,0
+DA:166,0
+DA:167,0
+DA:168,0
+DA:169,0
+LF:115
+LH:0
+end_of_record
SF:lib\features\settings\entities\settings_entity.dart
DA:10,0
LF:1
@@ -17451,6 +16945,109 @@ DA:301,0
LF:122
LH:0
end_of_record
+SF:lib\features\feed\models\plan_pagination_model.dart
+DA:18,0
+DA:46,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:56,0
+DA:57,0
+DA:60,0
+DA:72,0
+DA:74,12
+DA:77,0
+DA:78,0
+DA:79,0
+DA:81,0
+DA:86,4
+DA:94,0
+DA:96,0
+DA:97,0
+LF:18
+LH:2
+end_of_record
+SF:lib\features\feed\models\plan_pagination_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:18,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:59,0
+DA:60,0
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
+DA:67,0
+DA:68,0
+DA:69,0
+DA:70,0
+DA:73,0
+DA:74,0
+DA:75,0
+DA:76,0
+DA:77,0
+DA:78,0
+DA:81,0
+DA:82,0
+DA:83,0
+DA:84,0
+DA:85,0
+DA:86,0
+DA:89,0
+DA:90,0
+DA:91,0
+DA:92,0
+DA:93,0
+DA:96,0
+DA:97,0
+DA:98,0
+DA:99,0
+DA:100,0
+LF:77
+LH:0
+end_of_record
SF:lib\core\widgets\item_widget.dart
DA:7,0
DA:11,0
@@ -17477,7 +17074,7 @@ LF:21
LH:0
end_of_record
SF:lib\core\widgets\main_background_bouble.dart
-DA:5,5
+DA:5,7
DA:18,3
DA:20,3
DA:21,3
@@ -18288,6 +17885,26 @@ DA:13,0
LF:4
LH:0
end_of_record
+SF:lib\features\my_finance\models\card_model.dart
+DA:14,0
+DA:17,0
+DA:18,0
+LF:3
+LH:0
+end_of_record
+SF:lib\features\my_finance\models\card_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+LF:9
+LH:0
+end_of_record
SF:lib\features\chat\presentation\widgets\about_order_button.dart
DA:8,0
DA:10,0
@@ -18891,6 +18508,50 @@ DA:58,0
LF:37
LH:0
end_of_record
+SF:lib\features\consultant\become_consultant\models\consultation_request_model.dart
+DA:17,0
+DA:26,0
+DA:43,0
+LF:3
+LH:0
+end_of_record
+SF:lib\features\consultant\become_consultant\models\consultation_request_model.g.dart
+DA:9,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:16,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:21,0
+DA:22,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:35,0
+DA:36,0
+DA:38,0
+DA:39,0
+DA:41,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:47,0
+DA:48,0
+DA:51,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+LF:33
+LH:0
+end_of_record
SF:lib\features\consultant\become_consultant\presentation\pages\additional_settings_screen.dart
DA:8,4
DA:10,0
@@ -19914,6 +19575,43 @@ DA:332,0
LF:147
LH:0
end_of_record
+SF:lib\features\create_diet\presentation\widgets\diet_duration_drop_down_widget.dart
+DA:15,4
+DA:17,2
+DA:18,2
+DA:24,2
+DA:26,2
+DA:27,4
+DA:28,4
+DA:29,4
+DA:30,8
+DA:35,2
+DA:37,2
+DA:38,2
+DA:39,2
+DA:40,2
+DA:42,2
+DA:43,2
+DA:44,2
+DA:45,2
+DA:46,2
+DA:47,6
+DA:49,0
+DA:51,0
+DA:54,2
+DA:55,2
+DA:56,4
+DA:57,4
+DA:58,2
+DA:59,4
+DA:60,6
+DA:64,2
+DA:65,5
+DA:67,2
+DA:71,0
+LF:33
+LH:30
+end_of_record
SF:lib\features\create_diet\presentation\widgets\diet_image_picker_widget.dart
DA:21,4
DA:23,1
@@ -19995,6 +19693,146 @@ DA:177,1
LF:77
LH:30
end_of_record
+SF:lib\features\create_diet\presentation\widgets\status_drop_down_widget.dart
+DA:16,2
+DA:18,2
+DA:19,2
+DA:27,2
+DA:29,2
+DA:30,4
+DA:31,4
+DA:32,6
+DA:33,6
+DA:45,4
+DA:46,3
+DA:47,3
+DA:48,0
+DA:49,0
+DA:54,2
+DA:56,2
+DA:57,2
+DA:58,2
+DA:59,2
+DA:61,2
+DA:62,2
+DA:63,2
+DA:64,2
+DA:65,2
+DA:66,6
+DA:68,0
+DA:70,0
+DA:71,0
+DA:73,0
+DA:79,2
+DA:80,2
+DA:81,4
+DA:82,4
+DA:83,2
+DA:84,4
+DA:85,6
+DA:89,2
+DA:90,2
+DA:92,2
+DA:96,0
+LF:40
+LH:33
+end_of_record
+SF:lib\features\create_diet\presentation\widgets\diet_type_choice_widget.dart
+DA:12,4
+DA:14,2
+DA:15,2
+DA:20,2
+DA:22,2
+DA:23,4
+DA:24,4
+DA:25,4
+DA:28,2
+DA:31,4
+DA:34,2
+DA:37,4
+DA:40,2
+DA:43,4
+DA:46,2
+DA:52,2
+DA:54,2
+DA:55,2
+DA:56,2
+DA:57,2
+DA:58,4
+DA:59,2
+DA:60,2
+DA:61,0
+DA:62,0
+DA:63,0
+DA:64,0
+DA:66,2
+DA:67,4
+DA:68,2
+DA:69,2
+DA:70,16
+DA:71,2
+DA:73,16
+DA:77,2
+DA:78,2
+DA:80,2
+DA:81,4
+DA:85,2
+DA:86,4
+DA:88,6
+LF:41
+LH:37
+end_of_record
+SF:lib\features\glossary\models\glossary_model.dart
+DA:12,0
+DA:21,0
+DA:40,0
+LF:3
+LH:0
+end_of_record
+SF:lib\features\glossary\models\glossary_model.g.dart
+DA:9,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:17,0
+DA:19,0
+DA:21,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:29,0
+DA:31,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+DA:43,0
+DA:44,0
+DA:45,0
+DA:46,0
+DA:49,0
+DA:50,0
+DA:51,0
+DA:52,0
+DA:53,0
+DA:54,0
+DA:55,0
+DA:56,0
+DA:57,0
+DA:58,0
+DA:59,0
+DA:60,0
+DA:61,0
+LF:40
+LH:0
+end_of_record
SF:lib\features\diets\presentation\widgets\author_card.dart
DA:12,0
DA:18,0
@@ -20312,6 +20150,27 @@ DA:45,0
LF:15
LH:0
end_of_record
+SF:lib\features\create_plan\models\create_plan_model.dart
+DA:9,3
+LF:1
+LH:1
+end_of_record
+SF:lib\features\create_plan\presentation\cubit\create_plan_state.dart
+DA:19,6
+DA:23,3
+DA:24,3
+DA:25,3
+DA:26,12
+DA:42,6
+DA:48,3
+DA:49,3
+DA:50,3
+DA:51,3
+DA:66,6
+DA:71,3
+LF:12
+LH:12
+end_of_record
SF:lib\features\create_plan\presentation\widgets\option_widget.dart
DA:17,4
DA:19,2
@@ -23573,6 +23432,28 @@ DA:49,0
LF:32
LH:0
end_of_record
+SF:lib\features\profile\models\badge_model.dart
+DA:17,0
+LF:1
+LH:0
+end_of_record
+SF:lib\features\profile\models\badge_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:17,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+LF:13
+LH:0
+end_of_record
SF:lib\features\feed\models\recipes_pagination_model.dart
DA:25,0
LF:1
@@ -23799,11 +23680,10 @@ LF:27
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\blog_post_widget.dart
-DA:24,0
-DA:26,0
+DA:25,0
DA:27,0
-DA:35,0
-DA:37,0
+DA:28,0
+DA:36,0
DA:38,0
DA:39,0
DA:40,0
@@ -23813,104 +23693,124 @@ DA:43,0
DA:44,0
DA:45,0
DA:46,0
-DA:48,0
-DA:51,0
-DA:53,0
-DA:55,0
-DA:57,0
+DA:47,0
+DA:49,0
+DA:52,0
+DA:54,0
+DA:56,0
DA:58,0
DA:59,0
DA:60,0
-DA:62,0
-DA:65,0
+DA:61,0
+DA:63,0
+DA:66,0
+DA:67,0
DA:68,0
DA:69,0
-DA:70,0
-DA:71,0
-DA:78,0
+DA:76,0
+DA:77,0
DA:79,0
+DA:80,0
DA:81,0
-DA:82,0
-DA:83,0
-DA:88,0
-DA:89,0
+DA:86,0
+DA:87,0
+DA:94,0
+DA:95,0
DA:96,0
-DA:97,0
DA:98,0
-DA:100,0
-DA:103,0
+DA:101,0
+DA:102,0
DA:104,0
+DA:105,0
DA:106,0
DA:107,0
-DA:108,0
-DA:109,0
+DA:112,0
DA:114,0
DA:116,0
-DA:118,0
-DA:119,0
+DA:117,0
+DA:122,0
+DA:123,0
DA:124,0
DA:125,0
DA:126,0
-DA:127,0
DA:128,0
+DA:129,0
DA:130,0
+DA:131,0
DA:132,0
-DA:133,0
DA:134,0
DA:135,0
DA:136,0
+DA:137,0
+DA:138,0
DA:139,0
DA:140,0
+DA:141,0
+DA:142,0
+DA:143,0
+DA:144,0
+DA:145,0
+DA:146,0
DA:147,0
-DA:148,0
-DA:149,0
DA:150,0
DA:151,0
+DA:152,0
DA:153,0
-DA:156,0
+DA:155,0
DA:157,0
DA:158,0
-DA:160,0
-DA:161,0
DA:162,0
-DA:166,0
-DA:167,0
-DA:169,0
+DA:163,0
DA:170,0
DA:171,0
DA:172,0
DA:173,0
DA:174,0
-DA:175,0
DA:176,0
-DA:177,0
-DA:178,0
DA:179,0
DA:180,0
+DA:181,0
DA:183,0
+DA:184,0
DA:185,0
-DA:186,0
-DA:188,0
+DA:189,0
+DA:190,0
+DA:192,0
DA:193,0
DA:194,0
+DA:195,0
+DA:196,0
+DA:197,0
DA:198,0
+DA:199,0
DA:200,0
DA:201,0
-DA:204,0
-DA:205,0
+DA:202,0
+DA:203,0
+DA:206,0
+DA:208,0
DA:209,0
DA:211,0
-DA:212,0
-DA:213,0
-DA:214,0
-DA:215,0
DA:216,0
-DA:222,0
+DA:217,0
+DA:221,0
+DA:223,0
DA:224,0
-DA:225,0
-DA:226,0
-DA:231,0
-LF:111
+DA:227,0
+DA:228,0
+DA:232,0
+DA:234,0
+DA:235,0
+DA:236,0
+DA:237,0
+DA:238,0
+DA:239,0
+DA:245,0
+DA:247,0
+DA:248,0
+DA:249,0
+DA:254,0
+LF:130
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\subscribe_button_widget.dart
@@ -24237,70 +24137,82 @@ LF:84
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\diets_widget.dart
-DA:24,0
-DA:30,0
-DA:31,0
+DA:25,0
+DA:27,0
+DA:28,0
+DA:34,0
+DA:36,0
DA:37,0
+DA:38,0
DA:39,0
-DA:40,0
-DA:42,0
-DA:43,0
+DA:41,0
DA:44,0
-DA:48,0
+DA:45,0
+DA:46,0
+DA:47,0
DA:49,0
-DA:51,0
-DA:54,0
+DA:50,0
+DA:52,0
DA:55,0
-DA:56,0
DA:57,0
+DA:58,0
DA:59,0
DA:60,0
DA:62,0
DA:65,0
-DA:67,0
-DA:68,0
-DA:69,0
-DA:70,0
-DA:72,0
-DA:75,0
+DA:66,0
+DA:73,0
DA:76,0
+DA:79,0
+DA:81,0
+DA:82,0
DA:83,0
-DA:86,0
-DA:89,0
-DA:91,0
-DA:92,0
+DA:84,0
+DA:85,0
+DA:87,0
+DA:88,0
DA:93,0
-DA:94,0
DA:95,0
+DA:96,0
DA:97,0
-DA:98,0
DA:103,0
DA:105,0
DA:106,0
-DA:107,0
DA:108,0
-DA:109,0
+DA:110,0
+DA:112,0
+DA:114,0
+DA:115,0
+DA:116,0
+DA:117,0
DA:118,0
DA:120,0
DA:121,0
+DA:122,0
DA:123,0
DA:124,0
-DA:125,0
+DA:127,0
DA:128,0
+DA:129,0
+DA:130,0
+DA:131,0
DA:132,0
+DA:133,0
DA:134,0
DA:135,0
DA:136,0
DA:137,0
DA:138,0
-DA:139,0
-DA:140,0
DA:141,0
-DA:147,0
+DA:142,0
+DA:143,0
+DA:144,0
+DA:146,0
DA:148,0
-DA:162,0
+DA:149,0
+DA:154,0
+DA:155,0
DA:164,0
-DA:165,0
DA:166,0
DA:167,0
DA:168,0
@@ -24308,26 +24220,28 @@ DA:169,0
DA:170,0
DA:171,0
DA:172,0
+DA:173,0
+DA:174,0
DA:178,0
DA:180,0
DA:181,0
DA:182,0
+DA:185,0
+DA:186,0
DA:187,0
DA:188,0
DA:189,0
DA:190,0
DA:191,0
DA:192,0
-DA:193,0
-DA:194,0
+DA:195,0
+DA:196,0
DA:197,0
DA:198,0
-DA:199,0
-DA:200,0
+DA:203,0
+DA:204,0
DA:205,0
-DA:206,0
-DA:207,0
-LF:90
+LF:104
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\filter_badge.dart
@@ -24346,97 +24260,113 @@ LF:11
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\plan_widget.dart
-DA:27,0
-DA:33,0
-DA:34,0
+DA:28,0
+DA:30,0
+DA:31,0
+DA:37,0
+DA:39,0
DA:40,0
+DA:41,0
DA:42,0
DA:43,0
-DA:44,0
-DA:46,0
-DA:47,0
+DA:45,0
DA:48,0
-DA:52,0
+DA:49,0
+DA:50,0
+DA:51,0
DA:53,0
-DA:55,0
-DA:58,0
-DA:59,0
+DA:54,0
+DA:56,0
DA:60,0
-DA:61,0
+DA:62,0
DA:63,0
DA:64,0
-DA:66,0
+DA:65,0
+DA:67,0
DA:70,0
-DA:72,0
-DA:73,0
-DA:74,0
-DA:75,0
-DA:77,0
-DA:80,0
+DA:71,0
+DA:78,0
DA:81,0
+DA:84,0
+DA:86,0
+DA:87,0
DA:88,0
+DA:89,0
+DA:90,0
DA:91,0
-DA:94,0
-DA:96,0
-DA:97,0
+DA:93,0
DA:98,0
-DA:99,0
DA:100,0
DA:101,0
-DA:103,0
+DA:102,0
DA:108,0
DA:110,0
DA:111,0
-DA:112,0
DA:113,0
-DA:114,0
+DA:115,0
+DA:117,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
DA:123,0
DA:125,0
DA:126,0
+DA:127,0
DA:128,0
DA:129,0
DA:130,0
+DA:131,0
+DA:132,0
DA:133,0
+DA:134,0
+DA:135,0
+DA:136,0
DA:137,0
-DA:139,0
-DA:140,0
+DA:138,0
DA:141,0
DA:142,0
DA:143,0
DA:144,0
-DA:145,0
DA:146,0
-DA:151,0
-DA:152,0
-DA:168,0
+DA:148,0
+DA:149,0
+DA:153,0
+DA:154,0
+DA:165,0
+DA:166,0
+DA:167,0
DA:169,0
-DA:170,0
-DA:172,0
-DA:175,0
-DA:177,0
-DA:179,0
+DA:171,0
+DA:173,0
+DA:176,0
+DA:178,0
+DA:181,0
DA:182,0
-DA:184,0
+DA:183,0
DA:185,0
-DA:190,0
-DA:191,0
+DA:187,0
+DA:188,0
DA:192,0
+DA:193,0
DA:194,0
-DA:196,0
-DA:197,0
-DA:198,0
DA:199,0
-DA:200,0
-DA:206,0
+DA:201,0
DA:207,0
-DA:208,0
+DA:209,0
+DA:210,0
+DA:211,0
+DA:212,0
DA:213,0
+DA:214,0
DA:215,0
DA:216,0
DA:217,0
-DA:218,0
-DA:226,0
-DA:230,0
+DA:221,0
+DA:223,0
+DA:224,0
+DA:225,0
+DA:227,0
DA:231,0
DA:232,0
DA:233,0
@@ -24445,27 +24375,14 @@ DA:235,0
DA:236,0
DA:237,0
DA:238,0
+DA:241,0
+DA:242,0
+DA:243,0
DA:244,0
-DA:246,0
-DA:247,0
-DA:248,0
DA:249,0
-DA:255,0
-DA:256,0
-DA:257,0
-DA:258,0
-DA:259,0
-DA:260,0
-DA:261,0
-DA:262,0
-DA:265,0
-DA:266,0
-DA:267,0
-DA:268,0
-DA:273,0
-DA:274,0
-DA:275,0
-LF:119
+DA:250,0
+DA:251,0
+LF:122
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\plans_filter_bottom_sheet.dart
@@ -24671,74 +24588,80 @@ LF:171
LH:0
end_of_record
SF:lib\features\feed\presentation\widgets\recipes_widget.dart
-DA:28,0
-DA:34,0
-DA:35,0
+DA:29,0
+DA:31,0
+DA:32,0
+DA:38,0
+DA:40,0
DA:41,0
+DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:47,0
-DA:48,0
DA:49,0
DA:50,0
DA:52,0
-DA:53,0
+DA:54,0
DA:55,0
+DA:56,0
DA:57,0
DA:58,0
DA:59,0
DA:61,0
-DA:62,0
-DA:63,0
+DA:64,0
+DA:65,0
+DA:66,0
DA:67,0
-DA:68,0
+DA:69,0
DA:70,0
-DA:73,0
-DA:74,0
+DA:72,0
DA:75,0
-DA:76,0
DA:78,0
-DA:79,0
+DA:80,0
DA:81,0
-DA:84,0
-DA:87,0
+DA:83,0
+DA:85,0
DA:89,0
-DA:90,0
+DA:91,0
DA:92,0
DA:94,0
-DA:98,0
-DA:100,0
-DA:101,0
-DA:103,0
-DA:105,0
+DA:96,0
+DA:99,0
DA:108,0
+DA:111,0
+DA:114,0
+DA:116,0
DA:117,0
+DA:118,0
+DA:119,0
DA:120,0
+DA:122,0
DA:123,0
-DA:125,0
-DA:126,0
-DA:127,0
-DA:128,0
-DA:129,0
DA:131,0
-DA:132,0
+DA:133,0
+DA:135,0
+DA:137,0
+DA:139,0
DA:140,0
-DA:142,0
+DA:141,0
DA:143,0
-DA:144,0
-DA:147,0
+DA:148,0
DA:149,0
-DA:151,0
+DA:150,0
DA:152,0
DA:153,0
+DA:154,0
DA:155,0
DA:156,0
-DA:157,0
-DA:163,0
-DA:164,0
+DA:158,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:162,0
DA:165,0
+DA:166,0
DA:167,0
DA:168,0
DA:169,0
@@ -24749,53 +24672,53 @@ DA:173,0
DA:174,0
DA:175,0
DA:176,0
-DA:177,0
+DA:179,0
+DA:180,0
+DA:181,0
DA:182,0
-DA:183,0
-DA:195,0
-DA:196,0
-DA:198,0
+DA:184,0
+DA:186,0
+DA:187,0
+DA:191,0
+DA:192,0
DA:199,0
DA:200,0
DA:202,0
DA:203,0
DA:204,0
-DA:205,0
DA:206,0
DA:207,0
+DA:208,0
+DA:209,0
+DA:210,0
DA:211,0
-DA:213,0
-DA:214,0
-DA:216,0
+DA:215,0
DA:217,0
DA:218,0
+DA:220,0
+DA:223,0
DA:224,0
-DA:225,0
-DA:229,0
+DA:228,0
+DA:230,0
DA:231,0
DA:232,0
DA:233,0
DA:234,0
DA:235,0
-DA:236,0
-DA:242,0
+DA:241,0
+DA:243,0
+DA:244,0
DA:245,0
-DA:248,0
-DA:249,0
DA:250,0
-DA:252,0
DA:259,0
+DA:260,0
+DA:262,0
+DA:264,0
+DA:266,0
+DA:267,0
DA:268,0
-DA:269,0
-DA:271,0
-DA:272,0
-DA:273,0
-DA:276,0
-DA:278,0
-DA:279,0
-DA:282,0
-DA:284,0
-LF:124
+DA:270,0
+LF:130
LH:0
end_of_record
SF:lib\features\finances_and_consultations_archive\period_enum.dart
@@ -24941,119 +24864,137 @@ LF:23
LH:0
end_of_record
SF:lib\features\my_diets\presentation\widgets\my_diet_widget.dart
-DA:31,0
-DA:36,0
-DA:37,0
+DA:32,0
+DA:34,0
+DA:35,0
+DA:39,0
DA:41,0
+DA:42,0
DA:43,0
DA:44,0
-DA:45,0
-DA:46,0
+DA:47,0
+DA:48,0
DA:49,0
+DA:50,0
+DA:51,0
DA:52,0
-DA:53,0
DA:54,0
DA:55,0
-DA:56,0
DA:57,0
-DA:59,0
-DA:60,0
-DA:62,0
-DA:66,0
-DA:68,0
-DA:69,0
-DA:70,0
+DA:61,0
+DA:63,0
+DA:64,0
+DA:65,0
+DA:71,0
+DA:73,0
+DA:74,0
DA:76,0
DA:78,0
-DA:79,0
-DA:81,0
+DA:80,0
DA:82,0
DA:83,0
+DA:84,0
+DA:85,0
DA:86,0
+DA:88,0
+DA:89,0
DA:90,0
+DA:91,0
DA:92,0
-DA:93,0
-DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:99,0
-DA:108,0
+DA:100,0
+DA:101,0
+DA:102,0
+DA:103,0
+DA:104,0
+DA:105,0
+DA:106,0
DA:109,0
DA:110,0
+DA:111,0
DA:112,0
-DA:113,0
DA:114,0
-DA:115,0
DA:116,0
DA:117,0
-DA:118,0
-DA:119,0
-DA:120,0
-DA:122,0
-DA:123,0
DA:125,0
+DA:126,0
DA:127,0
DA:129,0
+DA:130,0
DA:131,0
+DA:132,0
DA:133,0
+DA:134,0
+DA:135,0
DA:136,0
DA:137,0
-DA:138,0
DA:139,0
+DA:140,0
DA:142,0
-DA:143,0
DA:144,0
-DA:145,0
+DA:146,0
+DA:148,0
DA:150,0
-DA:152,0
DA:153,0
DA:154,0
DA:155,0
DA:156,0
-DA:157,0
-DA:158,0
-DA:164,0
-DA:168,0
+DA:159,0
+DA:160,0
+DA:161,0
+DA:162,0
+DA:167,0
+DA:169,0
DA:170,0
DA:171,0
DA:172,0
DA:173,0
-DA:182,0
-DA:183,0
-DA:184,0
+DA:174,0
+DA:175,0
+DA:181,0
DA:185,0
-DA:186,0
DA:187,0
DA:188,0
+DA:189,0
DA:190,0
-DA:191,0
-DA:194,0
-DA:196,0
-DA:198,0
+DA:199,0
+DA:200,0
DA:201,0
DA:202,0
+DA:203,0
+DA:204,0
DA:205,0
-DA:206,0
DA:207,0
-DA:210,0
+DA:208,0
DA:211,0
-DA:212,0
DA:213,0
+DA:215,0
+DA:218,0
DA:219,0
-DA:220,0
-DA:221,0
+DA:222,0
DA:223,0
DA:224,0
-DA:226,0
+DA:227,0
DA:228,0
-DA:233,0
+DA:229,0
+DA:230,0
+DA:236,0
+DA:237,0
DA:238,0
-DA:239,0
DA:240,0
DA:241,0
-LF:112
+DA:243,0
+DA:245,0
+DA:250,0
+DA:251,0
+DA:252,0
+DA:253,0
+DA:254,0
+LF:130
LH:0
end_of_record
SF:lib\features\my_diets\presentation\widgets\my_diets_tab.dart
@@ -25207,88 +25148,109 @@ LF:36
LH:1
end_of_record
SF:lib\features\my_plans\presentation\widgets\my_plan_widget.dart
-DA:24,0
-DA:26,0
+DA:25,0
DA:27,0
-DA:31,0
-DA:33,0
+DA:28,0
+DA:32,0
DA:34,0
DA:35,0
DA:36,0
-DA:39,0
+DA:37,0
DA:40,0
DA:41,0
DA:42,0
DA:43,0
DA:44,0
-DA:46,0
-DA:49,0
-DA:51,0
-DA:52,0
-DA:53,0
-DA:59,0
-DA:61,0
-DA:62,0
+DA:45,0
+DA:47,0
+DA:48,0
+DA:50,0
+DA:54,0
+DA:56,0
+DA:57,0
+DA:58,0
DA:64,0
DA:66,0
-DA:68,0
-DA:70,0
+DA:67,0
+DA:69,0
DA:71,0
-DA:72,0
DA:73,0
-DA:74,0
DA:75,0
DA:76,0
DA:77,0
DA:78,0
DA:79,0
+DA:81,0
+DA:82,0
+DA:83,0
+DA:84,0
+DA:85,0
DA:88,0
+DA:89,0
DA:90,0
DA:91,0
DA:92,0
+DA:93,0
+DA:94,0
+DA:95,0
DA:96,0
DA:97,0
DA:98,0
-DA:100,0
-DA:101,0
+DA:99,0
+DA:102,0
DA:103,0
DA:104,0
DA:105,0
-DA:106,0
DA:107,0
-DA:108,0
+DA:109,0
DA:110,0
-DA:111,0
-DA:112,0
-DA:114,0
-DA:115,0
-DA:119,0
+DA:118,0
DA:120,0
+DA:121,0
DA:122,0
-DA:124,0
-DA:125,0
DA:126,0
+DA:127,0
+DA:128,0
DA:130,0
DA:131,0
DA:133,0
-DA:146,0
-DA:147,0
-DA:148,0
+DA:134,0
+DA:135,0
+DA:136,0
+DA:137,0
+DA:138,0
+DA:140,0
+DA:141,0
+DA:142,0
+DA:144,0
+DA:145,0
DA:149,0
+DA:150,0
+DA:152,0
+DA:154,0
DA:155,0
DA:156,0
-DA:157,0
-DA:158,0
-DA:159,0
DA:160,0
DA:161,0
-DA:162,0
-DA:167,0
-DA:168,0
-DA:169,0
-DA:172,0
-DA:173,0
-LF:81
+DA:163,0
+DA:176,0
+DA:177,0
+DA:178,0
+DA:179,0
+DA:185,0
+DA:186,0
+DA:187,0
+DA:188,0
+DA:189,0
+DA:190,0
+DA:191,0
+DA:192,0
+DA:197,0
+DA:198,0
+DA:199,0
+DA:202,0
+DA:203,0
+LF:102
LH:0
end_of_record
SF:lib\features\notifications\models\notification_model.dart
@@ -26494,6 +26456,145 @@ DA:32,0
LF:18
LH:0
end_of_record
+SF:lib\features\profile\models\chosen_diets_pagination_model.dart
+DA:13,0
+DA:26,0
+DA:29,0
+DA:31,0
+LF:4
+LH:0
+end_of_record
+SF:lib\features\profile\models\chosen_diets_pagination_model.g.dart
+DA:9,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:17,0
+DA:19,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:33,0
+DA:34,0
+DA:35,0
+DA:36,0
+LF:21
+LH:0
+end_of_record
+SF:lib\features\profile\models\circumference_model.dart
+DA:19,0
+LF:1
+LH:0
+end_of_record
+SF:lib\features\profile\models\circumference_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+LF:18
+LH:0
+end_of_record
+SF:lib\features\profile\models\pass_key_params.dart
+DA:14,0
+LF:1
+LH:0
+end_of_record
+SF:lib\features\profile\models\pass_key_params.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:15,0
+DA:16,0
+DA:17,0
+DA:18,0
+LF:8
+LH:0
+end_of_record
+SF:lib\features\profile\models\sub_model.dart
+DA:16,0
+DA:31,0
+LF:2
+LH:0
+end_of_record
+SF:lib\features\profile\models\sub_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:25,0
+DA:26,0
+DA:27,0
+DA:28,0
+DA:29,0
+DA:30,0
+DA:31,0
+DA:32,0
+DA:35,0
+DA:36,0
+DA:37,0
+DA:38,0
+DA:39,0
+DA:40,0
+DA:41,0
+DA:42,0
+LF:28
+LH:0
+end_of_record
+SF:lib\features\profile\models\weight_model.dart
+DA:18,0
+LF:1
+LH:0
+end_of_record
+SF:lib\features\profile\models\weight_model.g.dart
+DA:9,0
+DA:10,0
+DA:11,0
+DA:12,0
+DA:13,0
+DA:14,0
+DA:15,0
+DA:18,0
+DA:19,0
+DA:20,0
+DA:21,0
+DA:22,0
+DA:23,0
+DA:24,0
+DA:25,0
+LF:15
+LH:0
+end_of_record
SF:lib\features\profile\presentation\widgets\circumference_chart_widget.dart
DA:13,0
DA:19,0
@@ -26667,10 +26768,13 @@ LF:38
LH:0
end_of_record
SF:lib\features\profile\presentation\widgets\profile_blog_post_widget.dart
-DA:25,0
-DA:31,0
-DA:32,0
+DA:26,0
+DA:28,0
+DA:29,0
+DA:36,0
+DA:38,0
DA:39,0
+DA:40,0
DA:41,0
DA:42,0
DA:43,0
@@ -26680,105 +26784,112 @@ DA:46,0
DA:47,0
DA:48,0
DA:49,0
-DA:51,0
-DA:53,0
+DA:52,0
DA:54,0
-DA:55,0
+DA:56,0
+DA:57,0
DA:58,0
DA:61,0
+DA:62,0
DA:63,0
-DA:65,0
-DA:66,0
-DA:67,0
-DA:70,0
+DA:64,0
+DA:69,0
DA:71,0
DA:72,0
DA:73,0
+DA:77,0
DA:78,0
-DA:80,0
-DA:81,0
-DA:82,0
+DA:84,0
+DA:85,0
+DA:87,0
+DA:88,0
+DA:89,0
DA:90,0
-DA:91,0
+DA:95,0
+DA:97,0
+DA:99,0
DA:100,0
-DA:101,0
-DA:103,0
-DA:104,0
DA:105,0
DA:106,0
+DA:107,0
+DA:108,0
+DA:110,0
DA:111,0
+DA:112,0
DA:113,0
-DA:115,0
+DA:114,0
DA:116,0
+DA:117,0
+DA:118,0
+DA:119,0
+DA:120,0
+DA:121,0
+DA:122,0
+DA:123,0
+DA:124,0
DA:125,0
DA:126,0
DA:127,0
DA:128,0
-DA:130,0
-DA:131,0
+DA:129,0
DA:132,0
DA:133,0
DA:134,0
DA:135,0
-DA:136,0
-DA:142,0
-DA:143,0
+DA:137,0
+DA:139,0
+DA:140,0
+DA:144,0
+DA:145,0
+DA:152,0
+DA:153,0
+DA:154,0
DA:155,0
-DA:156,0
DA:157,0
-DA:158,0
DA:160,0
DA:161,0
+DA:162,0
+DA:164,0
+DA:165,0
DA:166,0
-DA:167,0
-DA:168,0
DA:170,0
DA:171,0
-DA:172,0
+DA:173,0
+DA:174,0
+DA:175,0
DA:176,0
DA:177,0
+DA:178,0
DA:179,0
DA:180,0
DA:181,0
DA:182,0
DA:183,0
DA:184,0
-DA:185,0
DA:186,0
DA:187,0
DA:188,0
DA:189,0
-DA:190,0
-DA:192,0
DA:193,0
DA:194,0
-DA:195,0
-DA:196,0
-DA:197,0
-DA:202,0
-DA:203,0
-DA:207,0
-DA:208,0
+DA:198,0
+DA:200,0
+DA:201,0
+DA:204,0
+DA:205,0
+DA:209,0
+DA:211,0
DA:212,0
DA:213,0
+DA:214,0
DA:215,0
-DA:219,0
-DA:220,0
+DA:216,0
+DA:222,0
DA:224,0
+DA:225,0
DA:226,0
-DA:227,0
-DA:228,0
-DA:229,0
-DA:230,0
DA:231,0
-DA:237,0
-DA:240,0
-DA:243,0
-DA:244,0
-DA:245,0
-DA:247,0
-DA:254,0
-LF:111
+LF:121
LH:0
end_of_record
SF:lib\features\profile\presentation\widgets\weight_chart_widget.dart
@@ -27037,47 +27148,55 @@ LF:29
LH:0
end_of_record
SF:lib\features\recipe\presentation\widgets\my_recipe_widget.dart
-DA:23,0
-DA:28,0
-DA:29,0
+DA:24,0
+DA:26,0
+DA:27,0
+DA:35,0
DA:37,0
+DA:38,0
DA:39,0
DA:40,0
DA:41,0
-DA:42,0
DA:43,0
-DA:45,0
+DA:47,0
DA:49,0
+DA:50,0
DA:51,0
DA:52,0
-DA:53,0
-DA:54,0
+DA:55,0
+DA:56,0
DA:57,0
+DA:58,0
+DA:59,0
DA:60,0
-DA:61,0
DA:62,0
DA:63,0
-DA:64,0
-DA:66,0
-DA:67,0
-DA:71,0
-DA:73,0
+DA:65,0
+DA:69,0
+DA:72,0
DA:74,0
-DA:76,0
-DA:80,0
-DA:83,0
-DA:85,0
+DA:75,0
+DA:77,0
+DA:79,0
DA:86,0
DA:88,0
-DA:90,0
+DA:89,0
+DA:91,0
+DA:93,0
+DA:95,0
DA:97,0
+DA:98,0
DA:99,0
DA:100,0
-DA:102,0
+DA:101,0
DA:103,0
DA:104,0
+DA:105,0
+DA:106,0
DA:107,0
+DA:110,0
DA:111,0
+DA:112,0
DA:113,0
DA:114,0
DA:115,0
@@ -27087,47 +27206,51 @@ DA:118,0
DA:119,0
DA:120,0
DA:121,0
-DA:122,0
+DA:124,0
+DA:125,0
+DA:126,0
+DA:127,0
+DA:129,0
DA:131,0
-DA:133,0
-DA:134,0
-DA:135,0
-DA:136,0
-DA:137,0
-DA:138,0
-DA:139,0
+DA:132,0
DA:140,0
DA:142,0
+DA:143,0
+DA:144,0
DA:145,0
DA:146,0
-DA:150,0
+DA:147,0
+DA:148,0
+DA:149,0
DA:151,0
-DA:152,0
-DA:153,0
+DA:154,0
+DA:155,0
DA:159,0
DA:160,0
DA:161,0
DA:162,0
-DA:163,0
-DA:164,0
-DA:165,0
-DA:166,0
+DA:168,0
+DA:169,0
+DA:170,0
+DA:171,0
DA:172,0
DA:173,0
DA:174,0
-DA:177,0
-DA:178,0
-DA:192,0
-DA:193,0
-DA:195,0
-DA:196,0
-DA:197,0
-DA:200,0
+DA:175,0
+DA:181,0
+DA:182,0
+DA:183,0
+DA:186,0
+DA:187,0
+DA:201,0
DA:202,0
-DA:203,0
+DA:204,0
DA:206,0
DA:208,0
-LF:90
+DA:209,0
+DA:210,0
+DA:212,0
+LF:102
LH:0
end_of_record
SF:lib\features\registration\models\location_model.dart
diff --git a/lib/common/widgets/markdown_editor.dart b/lib/common/widgets/markdown_editor.dart
new file mode 100644
index 00000000..551f1449
--- /dev/null
+++ b/lib/common/widgets/markdown_editor.dart
@@ -0,0 +1,502 @@
+import 'dart:async';
+import 'package:flutter/material.dart';
+import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
+import 'package:eatvio_app/core/widgets/custom_text_form_field.dart';
+
+class MarkdownEditor extends StatefulWidget {
+ const MarkdownEditor({
+ super.key,
+ this.initialText,
+ this.hintText,
+ this.hasError = false,
+ this.minLines = 4,
+ this.maxLines = 6,
+ this.heightPreview = 120,
+ this.onChanged,
+ this.onToolbarVisibilityChanged,
+ this.showInlineToolbar = true,
+ });
+
+ final String? initialText;
+ final String? hintText;
+ final bool hasError;
+ final int minLines;
+ final int maxLines;
+ final double heightPreview;
+ final void Function(String value)? onChanged;
+ final void Function(bool visible)? onToolbarVisibilityChanged;
+ final bool showInlineToolbar;
+
+ @override
+ State createState() => MarkdownEditorState();
+}
+
+class MarkdownEditorState extends State {
+ late final TextEditingController _controller;
+ final FocusNode _focusNode = FocusNode();
+ bool _isPreview = false;
+ bool _enablePanel = false;
+ late final KeyboardVisibilityController _keyboardVisibilityController;
+ late final StreamSubscription _keyboardSubscription;
+
+ bool get isToolbarVisible => _enablePanel || _isPreview;
+
+ @override
+ void initState() {
+ super.initState();
+ _controller = TextEditingController(text: widget.initialText ?? '');
+ _keyboardVisibilityController = KeyboardVisibilityController();
+ _keyboardSubscription = _keyboardVisibilityController.onChange.listen((visible) {
+ setState(() {
+ _enablePanel = visible;
+ });
+ widget.onToolbarVisibilityChanged?.call(isToolbarVisible);
+ });
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ widget.onToolbarVisibilityChanged?.call(isToolbarVisible);
+ });
+ }
+
+ @override
+ void dispose() {
+ _keyboardSubscription.cancel();
+ _focusNode.dispose();
+ _controller.dispose();
+ super.dispose();
+ }
+
+ bool _hasFormatting(String prefix, String suffix) {
+ final text = _controller.text;
+ final selection = _controller.selection;
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ return selectedText.startsWith(prefix) && selectedText.endsWith(suffix);
+ } else {
+ final cursorPosition = selection.baseOffset;
+ if (cursorPosition >= prefix.length && text.length >= cursorPosition + suffix.length) {
+ final beforeCursor = text.substring(cursorPosition - prefix.length, cursorPosition);
+ final afterCursor = text.substring(cursorPosition, cursorPosition + suffix.length);
+ return beforeCursor == prefix && afterCursor == suffix;
+ }
+ }
+ return false;
+ }
+
+ void _removeFormatting(String prefix, String suffix) {
+ final text = _controller.text;
+ final selection = _controller.selection;
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ final unformattedText = selectedText.substring(prefix.length, selectedText.length - suffix.length);
+ final newText = text.replaceRange(selection.start, selection.end, unformattedText);
+ _controller.text = newText;
+ _controller.selection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + unformattedText.length);
+ } else {
+ final cursorPosition = selection.baseOffset;
+ if (cursorPosition >= prefix.length && text.length >= cursorPosition + suffix.length) {
+ final beforeCursor = text.substring(0, cursorPosition - prefix.length);
+ final afterCursor = text.substring(cursorPosition + suffix.length);
+ final newText = beforeCursor + afterCursor;
+ _controller.text = newText;
+ _controller.selection = TextSelection.collapsed(offset: cursorPosition - prefix.length);
+ }
+ }
+ widget.onChanged?.call(_controller.text);
+ }
+
+ void _applyMarkdownFormat(String prefix, String suffix) {
+ final text = _controller.text;
+ final selection = _controller.selection;
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ final formattedText = '$prefix$selectedText$suffix';
+ final newText = text.replaceRange(selection.start, selection.end, formattedText);
+ _controller.text = newText;
+ _controller.selection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + formattedText.length);
+ } else {
+ final cursorPosition = selection.baseOffset;
+ final newText = '${text.substring(0, cursorPosition)}$prefix$suffix${text.substring(cursorPosition)}';
+ _controller.text = newText;
+ _controller.selection = TextSelection.collapsed(offset: cursorPosition + prefix.length);
+ }
+ widget.onChanged?.call(_controller.text);
+ }
+
+ void _applyHeading() {
+ if (_hasFormatting('# ', '')) {
+ _removeFormatting('# ', '');
+ } else {
+ _applyMarkdownFormat('# ', '');
+ }
+ }
+
+ void _applyBold() {
+ if (_hasFormatting('**', '**')) {
+ _removeFormatting('**', '**');
+ } else {
+ _applyMarkdownFormat('**', '**');
+ }
+ }
+
+ void _applyItalic() {
+ if (_hasFormatting('*', '*')) {
+ _removeFormatting('*', '*');
+ } else {
+ _applyMarkdownFormat('*', '*');
+ }
+ }
+
+ void _applyNumberedList() {
+ if (_hasFormatting('1. ', '')) {
+ _removeFormatting('1. ', '');
+ } else {
+ _applyMarkdownFormat('1. ', '');
+ }
+ }
+
+ void _applyBulletedList() {
+ if (_hasFormatting('- ', '')) {
+ _removeFormatting('- ', '');
+ } else {
+ _applyMarkdownFormat('- ', '');
+ }
+ }
+
+ void _applyLink() {
+ final text = _controller.text;
+ final selection = _controller.selection;
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ final linkRegex = RegExp(r'^\[(.*?)\]\((.*?)\)$');
+ if (linkRegex.hasMatch(selectedText)) {
+ final match = linkRegex.firstMatch(selectedText);
+ final linkText = match?.group(1) ?? selectedText;
+ final newText = text.replaceRange(selection.start, selection.end, linkText);
+ _controller.text = newText;
+ _controller.selection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + linkText.length);
+ } else {
+ final formattedText = '[$selectedText](url)';
+ final newText = text.replaceRange(selection.start, selection.end, formattedText);
+ _controller.text = newText;
+ _controller.selection = TextSelection(baseOffset: selection.start + selectedText.length + 2, extentOffset: selection.start + selectedText.length + 5);
+ }
+ } else {
+ _applyMarkdownFormat('[', '](url)');
+ }
+ widget.onChanged?.call(_controller.text);
+ }
+
+ void _applyHorizontalRule() {
+ final cursorPosition = _controller.selection.baseOffset;
+ final text = _controller.text;
+ final newText = '${text.substring(0, cursorPosition)}\n---\n${text.substring(cursorPosition)}';
+ _controller.text = newText;
+ _controller.selection = TextSelection.collapsed(offset: cursorPosition + 5);
+ widget.onChanged?.call(_controller.text);
+ }
+
+ void _togglePreview() {
+ setState(() {
+ _isPreview = !_isPreview;
+ });
+ if (!_isPreview) {
+ Future.delayed(const Duration(milliseconds: 100), () {
+ _focusNode.requestFocus();
+ });
+ } else {
+ _focusNode.unfocus();
+ }
+ widget.onToolbarVisibilityChanged?.call(isToolbarVisible);
+ }
+
+ Widget _mdButton(IconData icon, VoidCallback onTap) {
+ return Expanded(
+ child: GestureDetector(
+ onTap: onTap,
+ child: Container(
+ height: 36,
+ decoration: BoxDecoration(color: const Color(0xFFF1F2F6), borderRadius: BorderRadius.circular(10)),
+ child: Icon(icon),
+ ),
+ ),
+ );
+ }
+
+ Widget _mdTextButton(String text, VoidCallback onTap) {
+ return Expanded(
+ child: GestureDetector(
+ onTap: onTap,
+ child: Container(
+ height: 36,
+ decoration: BoxDecoration(color: const Color(0xFFF1F2F6), borderRadius: BorderRadius.circular(10)),
+ child: Center(
+ child: Text(
+ text,
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w900, color: Colors.black87),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
+ Widget _buildMarkdownPreview(BuildContext context) {
+ return Container(
+ height: widget.heightPreview,
+ padding: const EdgeInsets.all(16),
+ width: MediaQuery.of(context).size.width - 32,
+ decoration: BoxDecoration(
+ color: const Color(0xFFF6F6F6),
+ borderRadius: BorderRadius.circular(20),
+ border: Border.all(color: const Color(0xFFE0E0E0)),
+ ),
+ child: SingleChildScrollView(child: _parseMarkdown(_controller.text)),
+ );
+ }
+
+ Widget buildToolbar(BuildContext context) {
+ return Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Container(
+ width: MediaQuery.of(context).size.width - 76,
+ height: 52,
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [BoxShadow(color: const Color(0x00000000).withAlpha((255 * 0.2).toInt()), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0))],
+ ),
+ child: Row(
+ children: [
+ const SizedBox(width: 8),
+ _mdTextButton('H', _applyHeading),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_bold, _applyBold),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_italic, _applyItalic),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_numbered, _applyNumberedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_bulleted, _applyBulletedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.link, _applyLink),
+ const SizedBox(width: 8),
+ _mdButton(Icons.horizontal_rule, _applyHorizontalRule),
+ const SizedBox(width: 8),
+ ],
+ ),
+ ),
+ const SizedBox(width: 8),
+ Container(
+ width: 52,
+ height: 52,
+ padding: const EdgeInsets.symmetric(horizontal: 8),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [BoxShadow(color: const Color(0x00000000).withAlpha((255 * 0.2).toInt()), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0))],
+ ),
+ child: Row(children: [_mdButton(_isPreview ? Icons.edit : Icons.visibility, _togglePreview)]),
+ ),
+ ],
+ );
+ }
+
+ Widget _parseMarkdown(String text) {
+ if (text.isEmpty) {
+ return Text(widget.hintText ?? '');
+ }
+ final lines = text.split('\n');
+ final widgets = [];
+ for (int i = 0; i < lines.length; i++) {
+ final line = lines[i];
+ if (line.trim().isEmpty) {
+ widgets.add(const SizedBox(height: 8));
+ continue;
+ }
+ if (line.startsWith('# ')) {
+ widgets.add(
+ Text(
+ line.substring(2),
+ style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('## ')) {
+ widgets.add(
+ Text(
+ line.substring(3),
+ style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('### ')) {
+ widgets.add(
+ Text(
+ line.substring(4),
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('- ') || line.startsWith('* ')) {
+ widgets.add(
+ Padding(
+ padding: const EdgeInsets.only(left: 16),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Text('• ', style: TextStyle(fontSize: 16)),
+ Expanded(child: _parseInlineMarkdown(line.substring(2))),
+ ],
+ ),
+ ),
+ );
+ } else if (RegExp(r'^\d+\. ').hasMatch(line)) {
+ final match = RegExp(r'^(\d+)\. ').firstMatch(line);
+ final number = match?.group(1) ?? '1';
+ widgets.add(
+ Padding(
+ padding: const EdgeInsets.only(left: 16),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('$number. ', style: const TextStyle(fontSize: 16)),
+ Expanded(child: _parseInlineMarkdown(line.substring(number.length + 2))),
+ ],
+ ),
+ ),
+ );
+ } else if (line.trim() == '---') {
+ widgets.add(const Divider(color: Colors.grey, thickness: 1));
+ } else {
+ widgets.add(_parseInlineMarkdown(line));
+ }
+ if (i < lines.length - 1) {
+ widgets.add(const SizedBox(height: 4));
+ }
+ }
+ return Column(crossAxisAlignment: CrossAxisAlignment.start, children: widgets);
+ }
+
+ Widget _parseInlineMarkdown(String text) {
+ final spans = [];
+ final regex = RegExp(r'(\*\*.*?\*\*|\*.*?\*|\[.*?\]\(.*?\))');
+ int lastEnd = 0;
+ for (final match in regex.allMatches(text)) {
+ if (match.start > lastEnd) {
+ spans.add(
+ TextSpan(
+ text: text.substring(lastEnd, match.start),
+ style: const TextStyle(fontSize: 16, color: Colors.black),
+ ),
+ );
+ }
+ final matchedText = match.group(0)!;
+ if (matchedText.startsWith('**') && matchedText.endsWith('**')) {
+ spans.add(
+ TextSpan(
+ text: matchedText.substring(2, matchedText.length - 2),
+ style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (matchedText.startsWith('*') && matchedText.endsWith('*')) {
+ spans.add(
+ TextSpan(
+ text: matchedText.substring(1, matchedText.length - 1),
+ style: const TextStyle(fontSize: 16, fontStyle: FontStyle.italic, color: Colors.black),
+ ),
+ );
+ } else if (matchedText.startsWith('[') && matchedText.contains('](')) {
+ final linkMatch = RegExp(r'\[(.*?)\]\((.*?)\)').firstMatch(matchedText);
+ if (linkMatch != null) {
+ final linkText = linkMatch.group(1)!;
+ spans.add(
+ TextSpan(
+ text: linkText,
+ style: const TextStyle(fontSize: 16, color: Colors.blue, decoration: TextDecoration.underline),
+ ),
+ );
+ }
+ }
+ lastEnd = match.end;
+ }
+ if (lastEnd < text.length) {
+ spans.add(
+ TextSpan(
+ text: text.substring(lastEnd),
+ style: const TextStyle(fontSize: 16, color: Colors.black),
+ ),
+ );
+ }
+ return RichText(text: TextSpan(children: spans));
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ if (_isPreview)
+ _buildMarkdownPreview(context)
+ else
+ CustomTextFormField(
+ controller: _controller,
+ focusNode: _focusNode,
+ maxLines: widget.maxLines,
+ minLines: widget.minLines,
+ hintText: widget.hintText,
+ hasError: widget.hasError,
+ onChanged: (value) => widget.onChanged?.call(value),
+ ),
+ const SizedBox(height: 8),
+ if (widget.showInlineToolbar && (isToolbarVisible || !_isPreview))
+ Row(
+ children: [
+ Expanded(
+ child: Container(
+ height: 52,
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [
+ BoxShadow(color: const Color(0x00000000).withAlpha((255 * 0.2).toInt()), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0)),
+ ],
+ ),
+ child: Row(
+ children: [
+ const SizedBox(width: 8),
+ _mdTextButton('H', _applyHeading),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_bold, _applyBold),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_italic, _applyItalic),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_numbered, _applyNumberedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_bulleted, _applyBulletedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.link, _applyLink),
+ const SizedBox(width: 8),
+ _mdButton(Icons.horizontal_rule, _applyHorizontalRule),
+ const SizedBox(width: 8),
+ ],
+ ),
+ ),
+ ),
+ const SizedBox(width: 8),
+ Container(
+ width: 52,
+ height: 52,
+ padding: const EdgeInsets.symmetric(horizontal: 8),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [
+ BoxShadow(color: const Color(0x00000000).withAlpha((255 * 0.2).toInt()), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0)),
+ ],
+ ),
+ child: Row(children: [_mdButton(_isPreview ? Icons.edit : Icons.visibility, _togglePreview)]),
+ ),
+ ],
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/core/app_config.dart b/lib/core/app_config.dart
index 7dc49aa0..afe814e0 100644
--- a/lib/core/app_config.dart
+++ b/lib/core/app_config.dart
@@ -1,4 +1,5 @@
import 'package:eatvio_app/core/app_initializer.dart';
+import 'package:eatvio_app/core/cubit/marketing/marketing_cubit.dart';
import 'package:eatvio_app/core/env_config.dart';
import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_cubit.dart';
import 'package:eatvio_app/core/locator_service.dart';
@@ -40,6 +41,7 @@ class AppConfig {
BlocProvider(create: (context) => sl()..getChatRoomsWithLoading()),
BlocProvider(create: (context) => sl()),
BlocProvider(lazy: false, create: (context) => sl()),
+ BlocProvider(create: (context) => sl()),
];
/// Делегаты локализации
diff --git a/lib/core/cubit/marketing/marketing_cubit.dart b/lib/core/cubit/marketing/marketing_cubit.dart
new file mode 100644
index 00000000..cf5b0c13
--- /dev/null
+++ b/lib/core/cubit/marketing/marketing_cubit.dart
@@ -0,0 +1,29 @@
+import 'package:eatvio_app/core/cubit/marketing/marketing_cubit_state.dart';
+import 'package:eatvio_app/core/prefs.dart';
+import 'package:eatvio_app/core/prefs_keys.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+
+class MarketingCubit extends Cubit {
+ final Prefs prefs;
+ MarketingCubit(this.prefs) : super(const MarketingCubitState());
+
+ Future checkRegistrationDate() async {
+ try {
+ final milliseconds = prefs.getInt(PrefsKeys.registrationDate);
+ final marketingBottomSheetHasBeenShown = prefs.getBool(PrefsKeys.marketingBottomSheetHasBeenShown);
+ if (milliseconds == null || marketingBottomSheetHasBeenShown == true) {
+ return false;
+ }
+ final date = DateTime.fromMillisecondsSinceEpoch(milliseconds);
+ final today = DateTime.now();
+ final daysCount = today.difference(date).inDays;
+ final needToShowMarketingBottomSheet = daysCount >= 14;
+ if (needToShowMarketingBottomSheet) {
+ await prefs.setBool(PrefsKeys.marketingBottomSheetHasBeenShown, true);
+ }
+ return needToShowMarketingBottomSheet;
+ } catch (e) {
+ rethrow;
+ }
+ }
+}
diff --git a/lib/core/cubit/marketing/marketing_cubit_state.dart b/lib/core/cubit/marketing/marketing_cubit_state.dart
new file mode 100644
index 00000000..164a0afe
--- /dev/null
+++ b/lib/core/cubit/marketing/marketing_cubit_state.dart
@@ -0,0 +1,3 @@
+class MarketingCubitState {
+ const MarketingCubitState();
+}
\ No newline at end of file
diff --git a/lib/core/di/cubit_registrations.dart b/lib/core/di/cubit_registrations.dart
index 605ff8a3..9ff95e50 100644
--- a/lib/core/di/cubit_registrations.dart
+++ b/lib/core/di/cubit_registrations.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/core/cubit/marketing/marketing_cubit.dart';
import 'package:eatvio_app/core/internet_connection_cubit/internet_connection_cubit.dart';
import 'package:eatvio_app/core/views/cubit/views_cubit.dart';
import 'package:eatvio_app/features/auth/presentation/bloc/auth_cubit/auth_cubit.dart';
@@ -74,10 +75,10 @@ class CubitRegistrations {
static void _registerFactoryCubits() {
// Auth related cubits
sl.registerFactory(() => AuthCubit(authRepository: sl()));
- sl.registerFactory(() => RegistrationCubit(registrationRepository: sl()));
+ sl.registerFactory(() => RegistrationCubit(registrationRepository: sl(), prefs: sl()));
sl.registerFactory(() => ResetPasswordCubit(resetPasswordRepository: sl()));
sl.registerFactory(() => VerifyEmailCubit(profileRepository: sl()));
- sl.registerFactory(() => OAuthCubit(authRepository: sl()));
+ sl.registerFactory(() => OAuthCubit(authRepository: sl(), prefs: sl()));
// Feed related cubits
sl.registerFactory(() => FeedCubit(feedRepository: sl()));
sl.registerFactory(() => RecipesCubit(feedRepository: sl(), recipeRepository: sl(), aboutRecipeRepository: sl()));
@@ -143,5 +144,6 @@ class CubitRegistrations {
sl.registerFactory(() => ViewsCubit(viewsRepository: sl()));
sl.registerFactory(() => UserDetailsCubit(profileRepository: sl()));
sl.registerFactory(() => MenuCubit(sl()));
+ sl.registerFactory(() => MarketingCubit(sl()));
}
}
diff --git a/lib/core/mixins/registration_date_cache_mixin.dart b/lib/core/mixins/registration_date_cache_mixin.dart
new file mode 100644
index 00000000..6d5fb922
--- /dev/null
+++ b/lib/core/mixins/registration_date_cache_mixin.dart
@@ -0,0 +1,11 @@
+import 'package:eatvio_app/core/prefs.dart';
+import 'package:eatvio_app/core/prefs_keys.dart';
+
+mixin RegistrationDateCacheMixin {
+ late final Prefs prefs;
+
+
+ Future cacheRegistrationDate(DateTime date) async {
+ await prefs.setInt(PrefsKeys.registrationDate, date.millisecondsSinceEpoch);
+ }
+}
diff --git a/lib/core/prefs_keys.dart b/lib/core/prefs_keys.dart
index 0ba552d5..ea23e1d4 100644
--- a/lib/core/prefs_keys.dart
+++ b/lib/core/prefs_keys.dart
@@ -1 +1 @@
-enum PrefsKeys { hasAnonymousTokenBeenSent, welcomeScreenWasShowed }
+enum PrefsKeys { hasAnonymousTokenBeenSent, welcomeScreenWasShowed, registrationDate, marketingBottomSheetHasBeenShown }
diff --git a/lib/core/theme/custom_text_style.dart b/lib/core/theme/custom_text_style.dart
index 62544e86..1c065748 100644
--- a/lib/core/theme/custom_text_style.dart
+++ b/lib/core/theme/custom_text_style.dart
@@ -249,4 +249,10 @@ abstract class TextStyles {
fontWeight: FontWeight.w500,
height: 1.255,
);
+
+ static const textFS24FW700 = TextStyle(
+ fontSize: 24,
+ fontWeight: FontWeight.w700,
+ height: 1.255,
+ );
}
diff --git a/lib/core/theme/theme_helper.dart b/lib/core/theme/theme_helper.dart
index c202129e..be650ad3 100644
--- a/lib/core/theme/theme_helper.dart
+++ b/lib/core/theme/theme_helper.dart
@@ -141,6 +141,8 @@ class PrimaryColors {
Color get gray60003 => const Color(0XFF707070);
+ Color get gray60005 => const Color(0xFF6C7C93);
+
// Green
Color get greenA700 => const Color(0XFF019A3E);
diff --git a/lib/core/widgets/marketing_bottom_sheet.dart b/lib/core/widgets/marketing_bottom_sheet.dart
new file mode 100644
index 00000000..53b833ae
--- /dev/null
+++ b/lib/core/widgets/marketing_bottom_sheet.dart
@@ -0,0 +1,124 @@
+import 'package:eatvio_app/core/theme/custom_text_style.dart';
+import 'package:eatvio_app/core/theme/theme_helper.dart';
+import 'package:eatvio_app/core/widgets/custom_outlined_button.dart';
+import 'package:eatvio_app/generated/l10n.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:share_plus/share_plus.dart';
+
+void showMarketingBottomSheet(BuildContext context) {
+ showModalBottomSheet(
+ context: context,
+ isScrollControlled: true,
+ backgroundColor: Colors.transparent,
+ builder: (context) => Container(
+ margin: EdgeInsets.only(left: 8, right: 8, bottom: MediaQuery.of(context).viewInsets.bottom + MediaQuery.of(context).padding.bottom + 20),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: appTheme.whiteA700),
+ child: const MarketingBottomSheet(),
+ ),
+ );
+}
+
+class MarketingBottomSheet extends StatelessWidget {
+ const MarketingBottomSheet({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final s = S.of(context);
+ return Padding(
+ padding: const EdgeInsetsGeometry.all(4),
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ ClipRRect(
+ borderRadius: BorderRadius.circular(8),
+ child: Container(
+ height: 180,
+ width: double.infinity,
+ decoration: const BoxDecoration(
+ image: DecorationImage(image: AssetImage('assets/images/logo_bg.png'), fit: BoxFit.cover),
+ ),
+ child: Center(child: SvgPicture.asset('assets/icons/logo_2.svg', height: 90)),
+ ),
+ ),
+ const SizedBox(height: 16),
+ Text(s.congratulations, style: TextStyles.textFS24FW700.copyWith(color: appTheme.blueA400)),
+ const SizedBox(height: 12),
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 4),
+ child: Container(
+ decoration: BoxDecoration(color: appTheme.lightGray0, borderRadius: BorderRadius.circular(20)),
+ child: Padding(
+ padding: const EdgeInsets.symmetric(vertical: 20),
+ child: Row(
+ children: [
+ const Spacer(),
+ Container(
+ decoration: BoxDecoration(shape: BoxShape.circle, color: appTheme.blueA400),
+ padding: const EdgeInsets.all(8),
+ child: Text('14', style: TextStyles.textFS24FW700.copyWith(color: appTheme.whiteA700)),
+ ),
+ const SizedBox(width: 12),
+ RichText(
+ text: TextSpan(
+ text: s.youWithUs,
+
+ style: TextStyles.textSMedium.copyWith(color: appTheme.gray60005),
+ children: [
+ TextSpan(
+ text: s.fourteenDays,
+ style: TextStyles.textLMedium.copyWith(color: appTheme.black),
+ ),
+ ],
+ ),
+ ),
+ const Spacer(),
+ ],
+ ),
+ ),
+ ),
+ ),
+ const SizedBox(height: 12),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ child: Text(
+ s.weAreLookingFor,
+ textAlign: TextAlign.center,
+ style: TextStyles.textMMediumAuto.copyWith(color: appTheme.black),
+ ),
+ ),
+ Text(
+ s.letsInvite,
+ textAlign: TextAlign.center,
+ style: TextStyles.textMMediumAuto.copyWith(color: appTheme.black),
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 4),
+ child: CustomOutlinedButton(
+ text: s.invite,
+ height: 52,
+ buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.whiteA700),
+ leftIcon: Padding(
+ padding: const EdgeInsets.only(right: 12),
+ child: Transform.rotate(
+ angle: 3.14,
+ child: SvgPicture.asset('assets/icons/share.svg', width: 14, height: 14, colorFilter: ColorFilter.mode(appTheme.whiteA700, BlendMode.srcIn)),
+ ),
+ ),
+ buttonStyle: ButtonStyle(side: const WidgetStatePropertyAll(BorderSide.none), backgroundColor: WidgetStatePropertyAll(appTheme.blueA400)),
+ onPressed: () async {
+ SharePlus.instance.share(ShareParams(uri: Uri.parse('https://promo.eatvio.ru/')));
+ },
+ ),
+ ),
+ Text(
+ s.eatvioIsAHelthyHabbit,
+ textAlign: TextAlign.center,
+ style: TextStyles.textSMedium.copyWith(color: appTheme.blueA400),
+ ),
+ const SizedBox(height: 16),
+ ],
+ ),
+ );
+ }
+}
diff --git a/lib/features/auth/presentation/bloc/oauth_cubit/oauth_cubit.dart b/lib/features/auth/presentation/bloc/oauth_cubit/oauth_cubit.dart
index 52a0e73b..b4f78b4a 100644
--- a/lib/features/auth/presentation/bloc/oauth_cubit/oauth_cubit.dart
+++ b/lib/features/auth/presentation/bloc/oauth_cubit/oauth_cubit.dart
@@ -1,14 +1,18 @@
import 'dart:developer';
import 'package:dio/dio.dart';
+import 'package:eatvio_app/core/mixins/registration_date_cache_mixin.dart';
+import 'package:eatvio_app/core/prefs.dart';
import 'package:eatvio_app/core/token_storage.dart';
import 'package:eatvio_app/features/auth/presentation/bloc/oauth_cubit/oauth_state.dart';
import 'package:eatvio_app/features/auth/repositories/auth_repository.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
-class OAuthCubit extends Cubit {
+class OAuthCubit extends Cubit with RegistrationDateCacheMixin {
final AuthRepository authRepository;
- OAuthCubit({required this.authRepository}) : super(const OAuthState());
+ OAuthCubit({required this.authRepository, required Prefs prefs}) : super(const OAuthState()) {
+ this.prefs = prefs;
+ }
Future signInViaSocialMedia({required String provider, required String accessToken, required String refreshToken, required String clientId}) async {
try {
@@ -63,6 +67,7 @@ class OAuthCubit extends Cubit {
clientId: clientId,
);
TokenStorage.saveTokenInStorage(token);
+ cacheRegistrationDate(DateTime.now());
emit(OAuthState.loaded(token: token));
} on DioException catch (e) {
emit(OAuthState.error(errorMessage: e.toString()));
diff --git a/lib/features/blog_post/presentation/pages/blog_post_screen.dart b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
index 4b08b333..f10bb742 100644
--- a/lib/features/blog_post/presentation/pages/blog_post_screen.dart
+++ b/lib/features/blog_post/presentation/pages/blog_post_screen.dart
@@ -18,6 +18,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class BlogPostScreen extends StatefulWidget {
final int id;
@@ -231,10 +232,35 @@ class _BlogPostScreenState extends State {
),
if (blogPostState.blogPostModel?.description.isNotEmpty ?? false)
Padding(
- padding: const EdgeInsets.symmetric(horizontal: 8),
+ padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: Html(
- data: blogPostState.blogPostModel?.description.replaceAll('\n', '
'),
- style: {"*": Style(color: Colors.black87)},
+ data: md.markdownToHtml(blogPostState.blogPostModel!.description.replaceAll('\n', '
')),
+ style: {
+ "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)),
+ "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
+ },
),
),
const SizedBox(height: 8),
diff --git a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart
index da1dfa24..48536468 100644
--- a/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart
+++ b/lib/features/blog_post_create/presentation/pages/blog_post_create_screen.dart
@@ -25,10 +25,7 @@ import 'package:permission_handler/permission_handler.dart';
class BlogPostCreateScreen extends StatefulWidget {
final FeedBlogPostModel? feedBlogPostModel;
- const BlogPostCreateScreen({
- super.key,
- this.feedBlogPostModel,
- });
+ const BlogPostCreateScreen({super.key, this.feedBlogPostModel});
@override
State createState() => _BlogPostCreateScreenState();
@@ -43,6 +40,9 @@ class _BlogPostCreateScreenState extends State {
final descriptionController = TextEditingController();
final videoUrlController = TextEditingController();
bool isLoading = false;
+ bool enableMdPanel = false;
+ bool isPreviewMode = false;
+ final FocusNode descriptionFocusNode = FocusNode();
@override
void initState() {
@@ -51,6 +51,7 @@ class _BlogPostCreateScreenState extends State {
keyboardSubscription = keyboardVisibilityController.onChange.listen((bool visible) {
setState(() {
shrinkImage = visible;
+ enableMdPanel = visible;
});
});
if (widget.feedBlogPostModel != null) {
@@ -63,9 +64,326 @@ class _BlogPostCreateScreenState extends State {
@override
void dispose() {
keyboardSubscription.cancel();
+ descriptionFocusNode.dispose();
super.dispose();
}
+ bool _hasFormatting(String prefix, String suffix) {
+ final text = descriptionController.text;
+ final selection = descriptionController.selection;
+
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ return selectedText.startsWith(prefix) && selectedText.endsWith(suffix);
+ } else {
+ final cursorPosition = selection.baseOffset;
+ if (cursorPosition >= prefix.length && text.length >= cursorPosition + suffix.length) {
+ final beforeCursor = text.substring(cursorPosition - prefix.length, cursorPosition);
+ final afterCursor = text.substring(cursorPosition, cursorPosition + suffix.length);
+ return beforeCursor == prefix && afterCursor == suffix;
+ }
+ }
+ return false;
+ }
+
+ void _removeFormatting(String prefix, String suffix) {
+ final text = descriptionController.text;
+ final selection = descriptionController.selection;
+
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ final unformattedText = selectedText.substring(prefix.length, selectedText.length - suffix.length);
+
+ final newText = text.replaceRange(selection.start, selection.end, unformattedText);
+ descriptionController.text = newText;
+
+ final newSelection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + unformattedText.length);
+ descriptionController.selection = newSelection;
+ } else {
+ final cursorPosition = selection.baseOffset;
+ if (cursorPosition >= prefix.length && text.length >= cursorPosition + suffix.length) {
+ final beforeCursor = text.substring(0, cursorPosition - prefix.length);
+ final afterCursor = text.substring(cursorPosition + suffix.length);
+ final newText = beforeCursor + afterCursor;
+ descriptionController.text = newText;
+
+ final newCursorPosition = cursorPosition - prefix.length;
+ descriptionController.selection = TextSelection.collapsed(offset: newCursorPosition);
+ }
+ }
+ }
+
+ void _applyMarkdownFormat(String prefix, String suffix) {
+ final text = descriptionController.text;
+ final selection = descriptionController.selection;
+
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+ final formattedText = '$prefix$selectedText$suffix';
+
+ final newText = text.replaceRange(selection.start, selection.end, formattedText);
+ descriptionController.text = newText;
+
+ final newSelection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + formattedText.length);
+ descriptionController.selection = newSelection;
+ } else {
+ final cursorPosition = selection.baseOffset;
+ final newText = '${text.substring(0, cursorPosition)}$prefix$suffix${text.substring(cursorPosition)}';
+ descriptionController.text = newText;
+
+ final newCursorPosition = cursorPosition + prefix.length;
+ descriptionController.selection = TextSelection.collapsed(offset: newCursorPosition);
+ }
+ }
+
+ void _applyHeading() {
+ if (_hasFormatting('# ', '')) {
+ _removeFormatting('# ', '');
+ } else {
+ _applyMarkdownFormat('# ', '');
+ }
+ }
+
+ void _applyBold() {
+ if (_hasFormatting('**', '**')) {
+ _removeFormatting('**', '**');
+ } else {
+ _applyMarkdownFormat('**', '**');
+ }
+ }
+
+ void _applyItalic() {
+ if (_hasFormatting('*', '*')) {
+ _removeFormatting('*', '*');
+ } else {
+ _applyMarkdownFormat('*', '*');
+ }
+ }
+
+ void _applyNumberedList() {
+ if (_hasFormatting('1. ', '')) {
+ _removeFormatting('1. ', '');
+ } else {
+ _applyMarkdownFormat('1. ', '');
+ }
+ }
+
+ void _applyBulletedList() {
+ if (_hasFormatting('- ', '')) {
+ _removeFormatting('- ', '');
+ } else {
+ _applyMarkdownFormat('- ', '');
+ }
+ }
+
+ void _applyLink() {
+ final text = descriptionController.text;
+ final selection = descriptionController.selection;
+
+ if (selection.isValid && !selection.isCollapsed) {
+ final selectedText = text.substring(selection.start, selection.end);
+
+ final linkRegex = RegExp(r'^\[(.*?)\]\((.*?)\)$');
+ if (linkRegex.hasMatch(selectedText)) {
+ final match = linkRegex.firstMatch(selectedText);
+ final linkText = match?.group(1) ?? selectedText;
+ final newText = text.replaceRange(selection.start, selection.end, linkText);
+ descriptionController.text = newText;
+
+ final newSelection = TextSelection(baseOffset: selection.start, extentOffset: selection.start + linkText.length);
+ descriptionController.selection = newSelection;
+ } else {
+ final formattedText = '[$selectedText](url)';
+ final newText = text.replaceRange(selection.start, selection.end, formattedText);
+ descriptionController.text = newText;
+
+ final newSelection = TextSelection(baseOffset: selection.start + selectedText.length + 2, extentOffset: selection.start + selectedText.length + 5);
+ descriptionController.selection = newSelection;
+ }
+ } else {
+ _applyMarkdownFormat('[', '](url)');
+ }
+ }
+
+ void _applyHorizontalRule() {
+ final cursorPosition = descriptionController.selection.baseOffset;
+ final text = descriptionController.text;
+ final newText = '${text.substring(0, cursorPosition)}\n---\n${text.substring(cursorPosition)}';
+ descriptionController.text = newText;
+
+ final newCursorPosition = cursorPosition + 5;
+ descriptionController.selection = TextSelection.collapsed(offset: newCursorPosition);
+ }
+
+ void _togglePreview() {
+ setState(() {
+ isPreviewMode = !isPreviewMode;
+ });
+
+ if (!isPreviewMode) {
+ Future.delayed(const Duration(milliseconds: 100), () {
+ descriptionFocusNode.requestFocus();
+ });
+ } else {
+ descriptionFocusNode.unfocus();
+ }
+ }
+
+ Widget _buildMarkdownPreview() {
+ return Container(
+ height: 120,
+ padding: const EdgeInsets.all(16),
+ width: MediaQuery.of(context).size.width - 32,
+ decoration: BoxDecoration(
+ color: const Color(0xFFF6F6F6),
+ borderRadius: BorderRadius.circular(20),
+ border: Border.all(color: const Color(0xFFE0E0E0)),
+ ),
+ child: SingleChildScrollView(child: _parseMarkdown(descriptionController.text)),
+ );
+ }
+
+ Widget _parseMarkdown(String text) {
+ if (text.isEmpty) {
+ return const Text(
+ 'Описание',
+ style: TextStyle(fontSize: 16, color: Color(0xFF323F4B), fontWeight: FontWeight.w500),
+ );
+ }
+
+ final lines = text.split('\n');
+ final widgets = [];
+
+ for (int i = 0; i < lines.length; i++) {
+ final line = lines[i];
+
+ if (line.trim().isEmpty) {
+ widgets.add(const SizedBox(height: 8));
+ continue;
+ }
+
+ if (line.startsWith('# ')) {
+ widgets.add(
+ Text(
+ line.substring(2),
+ style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('## ')) {
+ widgets.add(
+ Text(
+ line.substring(3),
+ style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('### ')) {
+ widgets.add(
+ Text(
+ line.substring(4),
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (line.startsWith('- ') || line.startsWith('* ')) {
+ widgets.add(
+ Padding(
+ padding: const EdgeInsets.only(left: 16),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ const Text('• ', style: TextStyle(fontSize: 16)),
+ Expanded(child: _parseInlineMarkdown(line.substring(2))),
+ ],
+ ),
+ ),
+ );
+ } else if (RegExp(r'^\d+\. ').hasMatch(line)) {
+ final match = RegExp(r'^(\d+)\. ').firstMatch(line);
+ final number = match?.group(1) ?? '1';
+ widgets.add(
+ Padding(
+ padding: const EdgeInsets.only(left: 16),
+ child: Row(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ Text('$number. ', style: const TextStyle(fontSize: 16)),
+ Expanded(child: _parseInlineMarkdown(line.substring(number.length + 2))),
+ ],
+ ),
+ ),
+ );
+ } else if (line.trim() == '---') {
+ widgets.add(const Divider(color: Colors.grey, thickness: 1));
+ } else {
+ widgets.add(_parseInlineMarkdown(line));
+ }
+
+ if (i < lines.length - 1) {
+ widgets.add(const SizedBox(height: 4));
+ }
+ }
+
+ return Column(crossAxisAlignment: CrossAxisAlignment.start, children: widgets);
+ }
+
+ Widget _parseInlineMarkdown(String text) {
+ final spans = [];
+ final regex = RegExp(r'(\*\*.*?\*\*|\*.*?\*|\[.*?\]\(.*?\))');
+ int lastEnd = 0;
+
+ for (final match in regex.allMatches(text)) {
+ if (match.start > lastEnd) {
+ spans.add(
+ TextSpan(
+ text: text.substring(lastEnd, match.start),
+ style: const TextStyle(fontSize: 16, color: Colors.black),
+ ),
+ );
+ }
+
+ final matchedText = match.group(0)!;
+
+ if (matchedText.startsWith('**') && matchedText.endsWith('**')) {
+ spans.add(
+ TextSpan(
+ text: matchedText.substring(2, matchedText.length - 2),
+ style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black),
+ ),
+ );
+ } else if (matchedText.startsWith('*') && matchedText.endsWith('*')) {
+ spans.add(
+ TextSpan(
+ text: matchedText.substring(1, matchedText.length - 1),
+ style: const TextStyle(fontSize: 16, fontStyle: FontStyle.italic, color: Colors.black),
+ ),
+ );
+ } else if (matchedText.startsWith('[') && matchedText.contains('](')) {
+ final linkMatch = RegExp(r'\[(.*?)\]\((.*?)\)').firstMatch(matchedText);
+ if (linkMatch != null) {
+ final linkText = linkMatch.group(1)!;
+ spans.add(
+ TextSpan(
+ text: linkText,
+ style: const TextStyle(fontSize: 16, color: Colors.blue, decoration: TextDecoration.underline),
+ ),
+ );
+ }
+ }
+
+ lastEnd = match.end;
+ }
+
+ if (lastEnd < text.length) {
+ spans.add(
+ TextSpan(
+ text: text.substring(lastEnd),
+ style: const TextStyle(fontSize: 16, color: Colors.black),
+ ),
+ );
+ }
+
+ return RichText(text: TextSpan(children: spans));
+ }
+
@override
Widget build(BuildContext context) {
return BlocProvider(
@@ -103,13 +421,7 @@ class _BlogPostCreateScreenState extends State {
context: context,
);
},
- child: const Row(
- children: [
- Icon(Icons.photo_camera),
- SizedBox(width: 8),
- Text('Фото'),
- ],
- ),
+ child: const Row(children: [Icon(Icons.photo_camera), SizedBox(width: 8), Text('Фото')]),
),
CupertinoActionSheetAction(
onPressed: () async {
@@ -127,97 +439,102 @@ class _BlogPostCreateScreenState extends State {
context: context,
);
},
- child: const Row(
- children: [
- Icon(Icons.photo),
- SizedBox(width: 8),
- Text('Галерея'),
- ],
- ),
+ child: const Row(children: [Icon(Icons.photo), SizedBox(width: 8), Text('Галерея')]),
),
],
- cancelButton: CupertinoActionSheetAction(
- onPressed: () => Navigator.of(context).pop(),
- isDestructiveAction: true,
- child: const Text('Отмена'),
- ),
+ cancelButton: CupertinoActionSheetAction(onPressed: () => Navigator.of(context).pop(), isDestructiveAction: true, child: const Text('Отмена')),
);
},
);
}
+ Widget _mdButton(IconData icon, Function() onTap) {
+ return Expanded(
+ child: GestureDetector(
+ onTap: onTap,
+ child: Container(
+ height: 36,
+ decoration: BoxDecoration(color: const Color(0xFFF1F2F6), borderRadius: BorderRadius.circular(10)),
+ child: Icon(icon),
+ ),
+ ),
+ );
+ }
+
+ Widget _mdTextButton(String text, Function() onTap) {
+ return Expanded(
+ child: GestureDetector(
+ onTap: onTap,
+ child: Container(
+ height: 36,
+ decoration: BoxDecoration(color: const Color(0xFFF1F2F6), borderRadius: BorderRadius.circular(10)),
+ child: Center(
+ child: Text(
+ text,
+ style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w900, color: Colors.black87),
+ ),
+ ),
+ ),
+ ),
+ );
+ }
+
Scaffold _buildBlogPostCreate(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true,
- appBar: AppBar(),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
- floatingActionButton: SizedBox(
- width: MediaQuery.of(context).size.width - 32,
- child: FloatingActionButton.extended(
- key: AppKeys.blogPostCreateScreenCreateButton,
- heroTag: 'createBlogPost',
- highlightElevation: 0,
- elevation: 0,
- focusElevation: 0,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(16),
- ),
- backgroundColor: appTheme.blueA400,
- label: isLoading
- ? const CircularProgressIndicator()
- : const Text(
- 'Создать',
- style: TextStyle(
- color: Colors.white,
+ floatingActionButton: enableMdPanel || isPreviewMode
+ ? Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ if (!isPreviewMode) ...[
+ Container(
+ width: MediaQuery.of(context).size.width - 76,
+ height: 52,
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [
+ BoxShadow(color: const Color(0x00000000).withValues(alpha: 0.2), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0)),
+ ],
+ ),
+ child: Row(
+ children: [
+ const SizedBox(width: 8),
+ _mdTextButton('H', _applyHeading),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_bold, _applyBold),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_italic, _applyItalic),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_numbered, _applyNumberedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.format_list_bulleted, _applyBulletedList),
+ const SizedBox(width: 8),
+ _mdButton(Icons.link, _applyLink),
+ const SizedBox(width: 8),
+ _mdButton(Icons.horizontal_rule, _applyHorizontalRule),
+ const SizedBox(width: 8),
+ ],
+ ),
),
+ const SizedBox(width: 8),
+ ],
+ Container(
+ width: 52,
+ height: 52,
+ padding: const EdgeInsets.symmetric(horizontal: 8),
+ decoration: BoxDecoration(
+ color: Colors.white,
+ borderRadius: BorderRadius.circular(20),
+ boxShadow: [BoxShadow(color: const Color(0x00000000).withValues(alpha: 0.2), spreadRadius: 0, blurRadius: 32, offset: const Offset(0, 0))],
+ ),
+ child: Row(children: [_mdButton(isPreviewMode ? Icons.edit : Icons.visibility, _togglePreview)]),
),
- onPressed: isLoading
- ? null
- : () async {
- setState(() {
- isLoading = true;
- });
-
- if (widget.feedBlogPostModel != null) {
- final result = await blogPostCubit.updateBlogPost(
- id: widget.feedBlogPostModel!.id,
- title: titleController.text,
- description: descriptionController.text,
- videoUrl: videoUrlController.text,
- image: image,
- oldImageUrl: widget.feedBlogPostModel!.image,
- );
- setState(() {
- isLoading = false;
- });
- if (!result) {
- if (!context.mounted) return;
- showErrorDialog(context, title: S.current.could_not_update_blog_post);
- } else {
- if (!context.mounted) return;
- context.pop();
- }
- } else {
- final result = await blogPostCubit.createBlogPost(
- title: titleController.text,
- description: descriptionController.text,
- videoUrl: videoUrlController.text,
- image: image,
- );
- setState(() {
- isLoading = false;
- });
- if (!result) {
- if (!context.mounted) return;
- showErrorDialog(context, title: S.current.could_not_publish_blog_post);
- } else {
- if (!context.mounted) return;
- context.pop();
- }
- }
- },
- ),
- ),
+ ],
+ )
+ : null,
+ appBar: AppBar(),
body: SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
@@ -226,19 +543,19 @@ class _BlogPostCreateScreenState extends State {
const SizedBox(height: 16),
const Text('Заголовок'),
const SizedBox(height: 8),
- CustomTextFormField(
- key: AppKeys.blogPostCreateScreenTitleTextField,
- controller: titleController,
- ),
+ CustomTextFormField(key: AppKeys.blogPostCreateScreenTitleTextField, controller: titleController),
const SizedBox(height: 16),
const Text('Описание'),
const SizedBox(height: 8),
- CustomTextFormField(
- key: AppKeys.blogPostCreateScreenContentTextField,
- controller: descriptionController,
- maxLines: 6,
- minLines: 4,
- ),
+ isPreviewMode
+ ? _buildMarkdownPreview()
+ : CustomTextFormField(
+ key: AppKeys.blogPostCreateScreenContentTextField,
+ controller: descriptionController,
+ focusNode: descriptionFocusNode,
+ maxLines: 6,
+ minLines: 4,
+ ),
const SizedBox(height: 16),
if (videoUrlController.text.isEmpty) const Text('Изображение поста'),
if (videoUrlController.text.isEmpty) const SizedBox(height: 8),
@@ -247,17 +564,75 @@ class _BlogPostCreateScreenState extends State {
if (image == null && widget.feedBlogPostModel?.image == null) const Text('Ссылка на видео'),
if (image == null && widget.feedBlogPostModel?.image == null) const SizedBox(height: 8),
if (image == null && widget.feedBlogPostModel?.image == null)
- CustomTextFormField(
- key: AppKeys.blogPostCreateScreenVideoLinkTextField,
- controller: videoUrlController,
- ),
+ CustomTextFormField(key: AppKeys.blogPostCreateScreenVideoLinkTextField, controller: videoUrlController),
const SizedBox(height: 80),
+ _createBlogPostButton(),
],
),
),
);
}
+ Widget _createBlogPostButton() {
+ return InkWell(
+ onTap: isLoading
+ ? null
+ : () async {
+ setState(() {
+ isLoading = true;
+ });
+ if (widget.feedBlogPostModel != null) {
+ final result = await blogPostCubit.updateBlogPost(
+ id: widget.feedBlogPostModel!.id,
+ title: titleController.text,
+ description: descriptionController.text,
+ videoUrl: videoUrlController.text,
+ image: image,
+ oldImageUrl: widget.feedBlogPostModel!.image,
+ );
+ setState(() {
+ isLoading = false;
+ });
+ if (!result) {
+ if (!mounted) return;
+ showErrorDialog(context, title: S.current.could_not_update_blog_post);
+ } else {
+ if (!mounted) return;
+ context.pop();
+ }
+ } else {
+ final result = await blogPostCubit.createBlogPost(
+ title: titleController.text,
+ description: descriptionController.text,
+ videoUrl: videoUrlController.text,
+ image: image,
+ );
+ setState(() {
+ isLoading = false;
+ });
+ if (!result) {
+ if (!mounted) return;
+ showErrorDialog(context, title: S.current.could_not_publish_blog_post);
+ } else {
+ if (!mounted) return;
+ context.pop();
+ }
+ }
+ },
+ borderRadius: BorderRadius.circular(16),
+ child: Ink(
+ width: MediaQuery.of(context).size.width - 32,
+ height: 52,
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(16), color: appTheme.blueA400),
+ child: isLoading
+ ? const Center(child: CircularProgressIndicator())
+ : const Center(
+ child: Text('Создать', style: TextStyle(color: Colors.white)),
+ ),
+ ),
+ );
+ }
+
GestureDetector _buildAddPhoto() {
return GestureDetector(
onTap: () {
@@ -270,22 +645,14 @@ class _BlogPostCreateScreenState extends State {
height: shrinkImage ? 52 : 128,
curve: Curves.easeIn,
duration: const Duration(milliseconds: 150),
- decoration: AppDecoration.fillGray.copyWith(
- borderRadius: BorderRadius.circular(16),
- ),
+ decoration: AppDecoration.fillGray.copyWith(borderRadius: BorderRadius.circular(16)),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
- Icon(
- Icons.photo_library,
- color: appTheme.blueGray300,
- ),
+ Icon(Icons.photo_library, color: appTheme.blueGray300),
const SizedBox(width: 8),
- Text(
- "Добавить фото",
- selectionColor: appTheme.blueA400,
- ),
+ Text("Добавить фото", selectionColor: appTheme.blueA400),
],
),
),
@@ -294,13 +661,7 @@ class _BlogPostCreateScreenState extends State {
width: shrinkImage ? 52 : MediaQuery.of(context).size.width - 32,
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
- child: Image(
- image: FileImage(
- File(
- image!.path,
- ),
- ),
- ),
+ child: Image(image: FileImage(File(image!.path))),
),
),
if (widget.feedBlogPostModel?.image != null && image == null)
@@ -308,9 +669,7 @@ class _BlogPostCreateScreenState extends State {
width: shrinkImage ? 52 : MediaQuery.of(context).size.width - 32,
child: ClipRRect(
borderRadius: BorderRadius.circular(16),
- child: Image(
- image: NetworkImage('${sl().baseUrl}/storage/${widget.feedBlogPostModel!.image}'),
- ),
+ child: Image(image: NetworkImage('${sl().baseUrl}/storage/${widget.feedBlogPostModel!.image}')),
),
),
],
diff --git a/lib/features/create_diet/presentation/create_diet_screen.dart b/lib/features/create_diet/presentation/create_diet_screen.dart
index f0f729d4..95775e86 100644
--- a/lib/features/create_diet/presentation/create_diet_screen.dart
+++ b/lib/features/create_diet/presentation/create_diet_screen.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/common/widgets/markdown_editor.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/custom_text_style.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
@@ -54,6 +55,8 @@ class _CreateDietScreenContentState extends State {
final nameController = TextEditingController();
final descriptionController = TextEditingController();
final scaffoldKey = GlobalKey();
+ final GlobalKey _mdKey = GlobalKey();
+ bool _mdToolbarVisible = false;
@override
void initState() {
@@ -76,9 +79,7 @@ class _CreateDietScreenContentState extends State {
showBottomSheetWithBlur(
userRootNavigator: true,
context: context,
- child: SuccessPublishedDietOrPlanBottomSheet(
- title: state.dietData.name ?? 'Диета',
- ),
+ child: SuccessPublishedDietOrPlanBottomSheet(title: state.dietData.name ?? 'Диета'),
);
});
} else if (state.drafted) {
@@ -87,15 +88,15 @@ class _CreateDietScreenContentState extends State {
context.pop();
showBottomSheetWithBlur(
context: context,
- child: SuccessPublishedDietOrPlanBottomSheet(
- title: '${state.dietData.name ?? 'Диета'} сохраненна в черновиках',
- ),
+ child: SuccessPublishedDietOrPlanBottomSheet(title: '${state.dietData.name ?? 'Диета'} сохраненна в черновиках'),
);
});
}
return Scaffold(
backgroundColor: appTheme.gray100,
+ floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
+ floatingActionButton: _mdToolbarVisible && _mdKey.currentState != null ? _mdKey.currentState!.buildToolbar(context) : null,
appBar: AppBar(
centerTitle: true,
title: Text(
@@ -124,34 +125,23 @@ class _CreateDietScreenContentState extends State {
context.read().setName(value);
},
),
- if (state.dietNameError != null) ...[
- const SizedBox(
- height: 4,
- ),
- ValidationErrorWidget(error: state.dietNameError ?? ''),
- ],
+ if (state.dietNameError != null) ...[const SizedBox(height: 4), ValidationErrorWidget(error: state.dietNameError ?? '')],
const SizedBox(height: 12),
- SizedBox(
- height: 132,
- child: CustomTextFormField(
- hasError: state.dietDescriptionError != null,
- controller: descriptionController,
- textAlignVertical: TextAlignVertical.top,
- maxLines: null,
- minLines: null,
- expands: true,
- hintText: s.enter_diet_description,
- onChanged: (value) {
- context.read().setDetails(value);
- },
- ),
+ MarkdownEditor(
+ key: _mdKey,
+ initialText: descriptionController.text,
+ hintText: s.enter_diet_description,
+ hasError: state.dietDescriptionError != null,
+ minLines: 6,
+ maxLines: 8,
+ showInlineToolbar: false,
+ onToolbarVisibilityChanged: (v) => setState(() => _mdToolbarVisible = v),
+ onChanged: (value) {
+ descriptionController.text = value;
+ context.read().setDetails(value);
+ },
),
- if (state.dietDescriptionError != null) ...[
- const SizedBox(
- height: 4,
- ),
- ValidationErrorWidget(error: state.dietDescriptionError ?? ''),
- ],
+ if (state.dietDescriptionError != null) ...[const SizedBox(height: 4), ValidationErrorWidget(error: state.dietDescriptionError ?? '')],
const SizedBox(height: 12),
const DietDurationDropDownWidget(),
const SizedBox(height: 12),
@@ -171,9 +161,7 @@ class _CreateDietScreenContentState extends State {
child: Center(
child: Text(
'${s.diet_plan} (${state.dietData.duration ?? 0} ${getDayForm(state.dietData.duration ?? 0, s)})',
- style: TextStyles.headingXLSemibold.copyWith(
- color: appTheme.black,
- ),
+ style: TextStyles.headingXLSemibold.copyWith(color: appTheme.black),
),
),
),
@@ -196,9 +184,7 @@ class _CreateDietScreenContentState extends State {
onPressed: () async {
context.read().setDietState(DietState.draft);
if (widget.diet != null) {
- final result = await context.read().updateDiet(
- widget.diet!.id,
- );
+ final result = await context.read().updateDiet(widget.diet!.id);
if (result == 'error') {
if (!context.mounted) return;
showErrorDialog(context, title: '${s.could_not_update_diet} ${state.dietData.name}');
diff --git a/lib/features/create_plan/presentation/create_plan_screen.dart b/lib/features/create_plan/presentation/create_plan_screen.dart
index c9ac8302..1b0a3e5c 100644
--- a/lib/features/create_plan/presentation/create_plan_screen.dart
+++ b/lib/features/create_plan/presentation/create_plan_screen.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/common/widgets/markdown_editor.dart';
import 'package:eatvio_app/core/locator_service.dart';
import 'package:eatvio_app/core/theme/custom_text_style.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
@@ -28,16 +29,21 @@ class CreatePlanScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return BlocProvider(
- create: (context) => sl(),
- child: const CreatePlanScreenContent(),
- );
+ return BlocProvider(create: (context) => sl(), child: const CreatePlanScreenContent());
}
}
-class CreatePlanScreenContent extends StatelessWidget {
+class CreatePlanScreenContent extends StatefulWidget {
const CreatePlanScreenContent({super.key});
+ @override
+ State createState() => _CreatePlanScreenContentState();
+}
+
+class _CreatePlanScreenContentState extends State {
+ final GlobalKey _mdKey = GlobalKey();
+ bool _mdToolbarVisible = false;
+
@override
Widget build(BuildContext context) {
final s = S.of(context);
@@ -51,15 +57,14 @@ class CreatePlanScreenContent extends StatelessWidget {
showBottomSheetWithBlur(
userRootNavigator: true,
context: context,
- child: SuccessPublishedDietOrPlanBottomSheet(
- title: state.planData.name ?? 'План',
- isPlan: true,
- ),
+ child: SuccessPublishedDietOrPlanBottomSheet(title: state.planData.name ?? 'План', isPlan: true),
);
});
}
return Scaffold(
backgroundColor: appTheme.gray100,
+ floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
+ floatingActionButton: _mdToolbarVisible && _mdKey.currentState != null ? _mdKey.currentState!.buildToolbar(context) : null,
appBar: AppBar(
centerTitle: true,
title: Text(
@@ -104,10 +109,7 @@ class CreatePlanScreenContent extends StatelessWidget {
},
maxLength: 150,
),
- if (state.validationState.titleHasError) ...[
- const SizedBox(height: 4),
- ValidationErrorWidget(error: s.atLeast3Symbols),
- ],
+ if (state.validationState.titleHasError) ...[const SizedBox(height: 4), ValidationErrorWidget(error: s.atLeast3Symbols)],
],
);
},
@@ -140,20 +142,17 @@ class CreatePlanScreenContent extends StatelessWidget {
builder: (context, state) {
return Column(
children: [
- SizedBox(
- height: 132,
- child: CustomTextFormField(
- hasError: state.validationState.descriptionHasError,
- textAlignVertical: TextAlignVertical.top,
- maxLength: 1000,
- maxLines: null,
- minLines: null,
- expands: true,
- hintText: s.plan_desc_example,
- onChanged: (value) {
- context.read().setDetails(value);
- },
- ),
+ MarkdownEditor(
+ key: _mdKey,
+ hintText: s.plan_desc_example,
+ hasError: state.validationState.descriptionHasError,
+ minLines: 6,
+ maxLines: 8,
+ showInlineToolbar: false,
+ onToolbarVisibilityChanged: (v) => setState(() => _mdToolbarVisible = v),
+ onChanged: (value) {
+ context.read().setDetails(value);
+ },
),
if (state.validationState.descriptionHasError) ...[
const SizedBox(height: 4),
@@ -253,10 +252,7 @@ class CreatePlanScreenContent extends StatelessWidget {
}
return const Padding(
padding: EdgeInsets.only(bottom: 24.0),
- child: Align(
- alignment: Alignment.bottomCenter,
- child: SelectExactOptionWidget(),
- ),
+ child: Align(alignment: Alignment.bottomCenter, child: SelectExactOptionWidget()),
);
},
),
diff --git a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart
index d230bd1a..c8a6d4ef 100644
--- a/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart
+++ b/lib/features/create_recipe/presentation/pages/recipe_create_screen.dart
@@ -8,6 +8,7 @@ import 'package:eatvio_app/core/widgets/success_published_recipe_bottom_sheet.da
import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_cubit.dart';
import 'package:eatvio_app/features/create_recipe/presentation/bloc/create_recipe_cubit/create_recipe_state.dart';
import 'package:eatvio_app/features/create_recipe/presentation/widgets/info_about_recipe_widget.dart';
+import 'package:eatvio_app/common/widgets/markdown_editor.dart';
import 'package:eatvio_app/features/create_recipe/presentation/widgets/ingredients_widget.dart';
import 'package:eatvio_app/features/create_recipe/presentation/widgets/steps_widget.dart';
import 'package:eatvio_app/features/feed/models/recipes_model.dart';
@@ -30,6 +31,8 @@ class RecipeCreateScreen extends StatefulWidget {
class _RecipeCreateScreenState extends State {
late final CreateRecipeCubit createRecipeCubit;
+ final GlobalKey _mdKey = GlobalKey();
+ bool _mdToolbarVisible = false;
@override
void initState() {
@@ -54,6 +57,10 @@ class _RecipeCreateScreenState extends State {
} else {
return Scaffold(
backgroundColor: const Color(0xFFF0F2F5),
+ floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
+ floatingActionButton: _mdToolbarVisible && _mdKey.currentState != null
+ ? _mdKey.currentState!.buildToolbar(context)
+ : null,
appBar: AppBar(
title: widget.recipe != null ? const Text('Редактирование рецепта') : const Text('Добавление рецепта'),
centerTitle: true,
@@ -65,7 +72,11 @@ class _RecipeCreateScreenState extends State {
child: Column(
spacing: 16,
children: [
- InfoAboutRecipeWidget(createRecipeCubit: createRecipeCubit),
+ InfoAboutRecipeWidget(
+ createRecipeCubit: createRecipeCubit,
+ markdownEditorKey: _mdKey,
+ onMarkdownToolbarVisibilityChanged: (v) => setState(() => _mdToolbarVisible = v),
+ ),
const IngredientsWidget(),
StepsWidget(createRecipeCubit: createRecipeCubit),
BlocBuilder(
diff --git a/lib/features/create_recipe/presentation/widgets/info_about_recipe_widget.dart b/lib/features/create_recipe/presentation/widgets/info_about_recipe_widget.dart
index 7ce4d26d..0eb609e4 100644
--- a/lib/features/create_recipe/presentation/widgets/info_about_recipe_widget.dart
+++ b/lib/features/create_recipe/presentation/widgets/info_about_recipe_widget.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/common/widgets/markdown_editor.dart';
import 'package:eatvio_app/app_keys.dart';
import 'package:eatvio_app/core/data/selectionPopupModel/selection_popup_model.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
@@ -16,8 +17,10 @@ import 'package:flutter_bloc/flutter_bloc.dart';
class InfoAboutRecipeWidget extends StatefulWidget {
final CreateRecipeCubit createRecipeCubit;
+ final GlobalKey? markdownEditorKey;
+ final void Function(bool visible)? onMarkdownToolbarVisibilityChanged;
- const InfoAboutRecipeWidget({super.key, required this.createRecipeCubit});
+ const InfoAboutRecipeWidget({super.key, required this.createRecipeCubit, this.markdownEditorKey, this.onMarkdownToolbarVisibilityChanged});
@override
State createState() => _InfoAboutRecipeWidgetState();
@@ -105,19 +108,24 @@ class _InfoAboutRecipeWidgetState extends State {
builder: (context, state) {
return Column(
children: [
- CustomTextFormField(
+ KeyedSubtree(
key: AppKeys.recipeCreateScreenDescriptionField,
+ child: MarkdownEditor(
+ key: widget.markdownEditorKey,
hintText: 'Расскажите, почему вы выбрали именно этот рецепт? Опишите, каким будет готовое блюдо и в чём его достоинства.',
minLines: 5,
- initialValue: state.entity.description,
maxLines: 5,
+ initialText: state.entity.description,
hasError: state.descriptionValidationError != null,
+ showInlineToolbar: false,
+ onToolbarVisibilityChanged: widget.onMarkdownToolbarVisibilityChanged,
onChanged: (value) {
widget.createRecipeCubit.replaceDescription(value);
if (state.descriptionValidationError != null) {
widget.createRecipeCubit.validateDescription();
}
},
+ ),
),
if (state.descriptionValidationError != null) ...[
const SizedBox(height: 4),
diff --git a/lib/features/feed/presentation/pages/feed_screen.dart b/lib/features/feed/presentation/pages/feed_screen.dart
index e664d78f..47447e49 100644
--- a/lib/features/feed/presentation/pages/feed_screen.dart
+++ b/lib/features/feed/presentation/pages/feed_screen.dart
@@ -1,9 +1,11 @@
import 'package:easy_debounce/easy_debounce.dart';
import 'package:eatvio_app/app_keys.dart';
import 'package:eatvio_app/core/const.dart';
+import 'package:eatvio_app/core/cubit/marketing/marketing_cubit.dart';
import 'package:eatvio_app/core/views/cubit/views_cubit.dart';
import 'package:eatvio_app/core/widgets/add_item_button.dart';
import 'package:eatvio_app/core/widgets/custom_search_bar.dart';
+import 'package:eatvio_app/core/widgets/marketing_bottom_sheet.dart';
import 'package:eatvio_app/features/create_diet/presentation/create_diet_screen.dart';
import 'package:eatvio_app/features/create_plan/presentation/create_plan_screen.dart';
import 'package:eatvio_app/features/feed/presentation/bloc/consultants_cubit/consultants_cubit.dart';
@@ -71,6 +73,7 @@ class _FeedScreenContentState extends State {
void initState() {
chipsLabelList = hidePlans ? ['Все', 'Рецепты', 'Диеты', 'Консультанты'] : ['Все', 'Рецепты', 'Диеты', 'Планы питания', 'Консультанты'];
consultantsScrollController.addListener(_onScrollConsultants);
+ _checkRegistrationDate(context);
super.initState();
}
@@ -78,6 +81,15 @@ class _FeedScreenContentState extends State {
if (consultantsScrollController.offset >= consultantsScrollController.position.maxScrollExtent && !consultantsScrollController.position.outOfRange) {}
}
+ void _checkRegistrationDate(BuildContext context) {
+ WidgetsBinding.instance.addPostFrameCallback((_) async {
+ final needToShowMarketingBottomSheet = await context.read().checkRegistrationDate();
+ if (needToShowMarketingBottomSheet && context.mounted) {
+ showMarketingBottomSheet(context);
+ }
+ });
+ }
+
@override
void dispose() {
blogPostsScrollController.dispose();
diff --git a/lib/features/feed/presentation/widgets/blog_post_widget.dart b/lib/features/feed/presentation/widgets/blog_post_widget.dart
index 6718f6e0..baebe3a5 100644
--- a/lib/features/feed/presentation/widgets/blog_post_widget.dart
+++ b/lib/features/feed/presentation/widgets/blog_post_widget.dart
@@ -17,6 +17,7 @@ import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class BlogPostWidget extends StatefulWidget {
final int index;
@@ -57,10 +58,7 @@ class _BlogPostWidgetState extends State {
children: [
GestureDetector(
onTap: () {
- GoRouter.of(context).pushNamed(
- 'profileScreen',
- extra: state.feedBlogPostList[widget.index].author.authorSlug,
- );
+ GoRouter.of(context).pushNamed('profileScreen', extra: state.feedBlogPostList[widget.index].author.authorSlug);
},
child: CircleAvatar(
radius: 20,
@@ -126,14 +124,39 @@ class _BlogPostWidgetState extends State {
const SizedBox(height: 8),
if (state.feedBlogPostList[widget.index].description.isNotEmpty)
Padding(
- padding: const EdgeInsets.symmetric(horizontal: 4),
+ padding: const EdgeInsets.symmetric(horizontal: 12),
child: Html(
- data:
- (state.feedBlogPostList[widget.index].description.length > 200
- ? state.feedBlogPostList[widget.index].description.substring(0, 200)
- : state.feedBlogPostList[widget.index].description)
- .replaceAll('\n', '
'),
- style: {"*": Style(fontSize: FontSize(16), color: Colors.black87)},
+ data: md.markdownToHtml(
+ (state.feedBlogPostList[widget.index].description.length > 200
+ ? state.feedBlogPostList[widget.index].description.substring(0, 200).replaceAll('\n', '
')
+ : state.feedBlogPostList[widget.index].description.replaceAll('\n', '
')),
+ ),
+ style: {
+ "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)),
+ "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
+ },
),
),
if (state.feedBlogPostList[widget.index].description.length > 200)
diff --git a/lib/features/feed/presentation/widgets/diets_widget.dart b/lib/features/feed/presentation/widgets/diets_widget.dart
index 1f39ff72..257811bf 100644
--- a/lib/features/feed/presentation/widgets/diets_widget.dart
+++ b/lib/features/feed/presentation/widgets/diets_widget.dart
@@ -17,15 +17,12 @@ import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
-class DietsWidget extends StatefulWidget {
+class DietsWidget extends StatefulWidget {
final Diet diet;
final int index;
- const DietsWidget({
- super.key,
- required this.diet,
- required this.index,
- });
+ const DietsWidget({super.key, required this.diet, required this.index});
@override
State createState() => _DietsWidgetState();
@@ -33,18 +30,11 @@ class DietsWidget extends StatefulWidget {
class _DietsWidgetState extends State {
bool isMoreOptionsVisible = false;
-
+
@override
Widget build(BuildContext context) {
return InkWell(
- onTap: () => GoRouter.of(context).pushNamed(
- 'aboutDietScreen',
- extra: {
- 'slug': widget.diet.slug,
- 'index': widget.index,
- 'navigateToComments': false,
- },
- ),
+ onTap: () => GoRouter.of(context).pushNamed('aboutDietScreen', extra: {'slug': widget.diet.slug, 'index': widget.index, 'navigateToComments': false}),
child: Material(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
@@ -104,12 +94,7 @@ class _DietsWidgetState extends State {
bottom: 16,
child: SizedBox(
width: MediaQuery.sizeOf(context).width,
- child: InfoRow(
- diet: widget.diet,
- itemsBackgroundColor: appTheme.whiteA700,
- disableDescriptionOfTypes: true,
- type: ProductType.diet,
- ),
+ child: InfoRow(diet: widget.diet, itemsBackgroundColor: appTheme.whiteA700, disableDescriptionOfTypes: true, type: ProductType.diet),
),
),
],
@@ -120,26 +105,48 @@ class _DietsWidgetState extends State {
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.diet.name,
- style: TextStyles.textMSemibold.copyWith(color: appTheme.black),
- ),
+ child: Text(widget.diet.name, style: TextStyles.textMSemibold.copyWith(color: appTheme.black)),
),
if (widget.diet.details.isNotEmpty) ...[
- const SizedBox(
- height: 12,
- ),
+ const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.diet.details.length > 200 ? '${widget.diet.details.substring(0, 200).replaceAll('\n', '
')}...' : widget.diet.details.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.diet.details.length > 200
+ ? '${widget.diet.details.substring(0, 200).replaceAll('\n', '
')}...'
+ : widget.diet.details.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
+ "body": Style(
margin: Margins.zero,
- color: appTheme.black,
+ padding: HtmlPaddings.zero,
fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14),
- fontWeight: TextStyles.textSMedium.fontWeight ?? FontWeight.w400,
+ lineHeight: const LineHeight(1.5),
),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -149,12 +156,7 @@ class _DietsWidgetState extends State {
padding: EdgeInsets.only(left: 16, top: 8),
child: Text(
'Показать ещё',
- style: TextStyle(
- height: 1,
- color: Color(0xFF8B8B8B),
- fontSize: 14,
- fontWeight: FontWeight.w600,
- ),
+ style: TextStyle(height: 1, color: Color(0xFF8B8B8B), fontSize: 14, fontWeight: FontWeight.w600),
),
),
],
@@ -172,18 +174,14 @@ class _DietsWidgetState extends State {
await context.read().likeDiet(widget.diet.id, widget.index);
},
),
- const SizedBox(
- width: 12,
- ),
+ const SizedBox(width: 12),
FeedIconButton(
icon: Icons.chat_bubble_outline,
text: widget.diet.totalComments.toString(),
onTap: () =>
GoRouter.of(context).pushNamed('aboutDietScreen', extra: {'slug': widget.diet.slug, 'index': widget.index, 'navigateToComments': true}),
),
- const SizedBox(
- width: 12,
- ),
+ const SizedBox(width: 12),
FeedIconButton(
svgIcon: SvgPicture.asset('assets/icons/repost.svg'),
onTap: () async {
diff --git a/lib/features/feed/presentation/widgets/plan_widget.dart b/lib/features/feed/presentation/widgets/plan_widget.dart
index 271594df..dae66fbf 100644
--- a/lib/features/feed/presentation/widgets/plan_widget.dart
+++ b/lib/features/feed/presentation/widgets/plan_widget.dart
@@ -19,16 +19,13 @@ import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class PlanWidget extends StatefulWidget {
final PlanModel plan;
final int index;
- const PlanWidget({
- super.key,
- required this.plan,
- required this.index,
- });
+ const PlanWidget({super.key, required this.plan, required this.index});
@override
State createState() => _PlanWidgetState();
@@ -41,14 +38,7 @@ class _PlanWidgetState extends State {
Widget build(BuildContext context) {
final s = S.of(context);
return InkWell(
- onTap: () => GoRouter.of(context).pushNamed(
- 'aboutPlanScreen',
- extra: {
- 'slug': widget.plan.slug,
- 'index': widget.index,
- 'navigateToComments': false,
- },
- ),
+ onTap: () => GoRouter.of(context).pushNamed('aboutPlanScreen', extra: {'slug': widget.plan.slug, 'index': widget.index, 'navigateToComments': false}),
child: Material(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
@@ -109,12 +99,7 @@ class _PlanWidgetState extends State {
bottom: 16,
child: SizedBox(
width: MediaQuery.sizeOf(context).width,
- child: InfoRow(
- plan: widget.plan,
- itemsBackgroundColor: appTheme.whiteA700,
- disableDescriptionOfTypes: true,
- type: ProductType.plan,
- ),
+ child: InfoRow(plan: widget.plan, itemsBackgroundColor: appTheme.whiteA700, disableDescriptionOfTypes: true, type: ProductType.plan),
),
),
],
@@ -125,26 +110,43 @@ class _PlanWidgetState extends State {
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.plan.name,
- style: TextStyles.textMSemibold.copyWith(color: appTheme.black, fontSize: 18),
- ),
+ child: Text(widget.plan.name, style: TextStyles.textMSemibold.copyWith(color: appTheme.black, fontSize: 18)),
),
if (widget.plan.details.isNotEmpty) ...[
- const SizedBox(
- height: 12,
- ),
+ const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.plan.details.length > 200 ? '${widget.plan.details.substring(0, 200).replaceAll('\n', '
')}...' : widget.plan.details.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.plan.details.length > 200
+ ? '${widget.plan.details.substring(0, 200).replaceAll('\n', '
')}...'
+ : widget.plan.details.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
- margin: Margins.zero,
- color: appTheme.black,
- fontSize: FontSize(16),
- fontWeight: TextStyles.textSMedium.fontWeight ?? FontWeight.w400,
+ "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -153,12 +155,7 @@ class _PlanWidgetState extends State {
padding: EdgeInsets.only(left: 16, top: 8),
child: Text(
'Показать ещё',
- style: TextStyle(
- height: 1,
- color: Color(0xFF8B8B8B),
- fontSize: 14,
- fontWeight: FontWeight.w600,
- ),
+ style: TextStyle(height: 1, color: Color(0xFF8B8B8B), fontSize: 14, fontWeight: FontWeight.w600),
),
),
],
@@ -167,10 +164,7 @@ class _PlanWidgetState extends State {
const SizedBox(height: 16),
GestureDetector(
onTap: () {
- GoRouter.of(context).pushNamed(
- 'profileScreen',
- extra: widget.plan.author.authorSlug,
- );
+ GoRouter.of(context).pushNamed('profileScreen', extra: widget.plan.author.authorSlug);
},
child: Padding(
padding: const EdgeInsets.only(left: 16.0),
@@ -181,10 +175,7 @@ class _PlanWidgetState extends State {
height: 46,
decoration: BoxDecoration(
shape: BoxShape.circle,
- image: DecorationImage(
- image: NetworkImage(sl().baseUrl + widget.plan.author.authorProfileIcon),
- fit: BoxFit.cover,
- ),
+ image: DecorationImage(image: NetworkImage(sl().baseUrl + widget.plan.author.authorProfileIcon), fit: BoxFit.cover),
),
),
subtitle: Row(
@@ -194,12 +185,7 @@ class _PlanWidgetState extends State {
backgroundColor: appTheme.gray50,
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 10),
children: [
- Text(
- '${widget.plan.author.authorPlaceInRating}-й в рейтинге',
- style: TextStyles.textXSSemibold.copyWith(
- color: appTheme.blueA400,
- ),
- ),
+ Text('${widget.plan.author.authorPlaceInRating}-й в рейтинге', style: TextStyles.textXSSemibold.copyWith(color: appTheme.blueA400)),
],
),
const Spacer(),
@@ -212,21 +198,14 @@ class _PlanWidgetState extends State {
),
title: Padding(
padding: const EdgeInsets.only(bottom: 4.0),
- child: Text(
- widget.plan.author.authorName,
- style: TextStyles.textSSemibold.copyWith(
- color: appTheme.black,
- ),
- ),
+ child: Text(widget.plan.author.authorName, style: TextStyles.textSSemibold.copyWith(color: appTheme.black)),
),
),
),
),
const SizedBox(height: 16),
Padding(
- padding: const EdgeInsets.only(
- left: 16,
- ),
+ padding: const EdgeInsets.only(left: 16),
child: Row(
children: [
FeedIconButton(
@@ -238,20 +217,17 @@ class _PlanWidgetState extends State {
await context.read().likePlan(widget.plan.slug, widget.index);
},
),
- const SizedBox(
- width: 12,
- ),
+ const SizedBox(width: 12),
FeedIconButton(
icon: Icons.chat_bubble_outline,
text: widget.plan.totalComments.toString(),
- onTap: () {
- return GoRouter.of(context)
- .pushNamed('aboutPlanScreen', extra: {'slug': widget.plan.slug, 'index': widget.index, 'navigateToComments': true});
+ onTap: () {
+ return GoRouter.of(
+ context,
+ ).pushNamed('aboutPlanScreen', extra: {'slug': widget.plan.slug, 'index': widget.index, 'navigateToComments': true});
},
),
- const SizedBox(
- width: 12,
- ),
+ const SizedBox(width: 12),
FeedIconButton(
svgIcon: SvgPicture.asset('assets/icons/repost.svg'),
onTap: () async {
diff --git a/lib/features/feed/presentation/widgets/recipes_widget.dart b/lib/features/feed/presentation/widgets/recipes_widget.dart
index 5fb415b1..349fdb7d 100644
--- a/lib/features/feed/presentation/widgets/recipes_widget.dart
+++ b/lib/features/feed/presentation/widgets/recipes_widget.dart
@@ -20,16 +20,13 @@ import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class RecipesWidget extends StatefulWidget {
final int index;
final Recipe recipe;
- const RecipesWidget({
- super.key,
- required this.recipe,
- required this.index,
- });
+ const RecipesWidget({super.key, required this.recipe, required this.index});
@override
State createState() => _RecipesWidgetState();
@@ -56,14 +53,8 @@ class _RecipesWidgetState extends State {
}
return InkWell(
borderRadius: BorderRadius.circular(12),
- onTap: () => GoRouter.of(context).pushNamed(
- 'aboutRecipesScreen',
- extra: {
- 'recipe': widget.recipe.slug,
- 'index': widget.index,
- 'navigateToComments': false,
- },
- ),
+ onTap: () =>
+ GoRouter.of(context).pushNamed('aboutRecipesScreen', extra: {'recipe': widget.recipe.slug, 'index': widget.index, 'navigateToComments': false}),
child: Material(
borderRadius: BorderRadius.circular(12),
color: Colors.white,
@@ -139,10 +130,7 @@ class _RecipesWidgetState extends State {
const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.recipe.title ?? '',
- style: TextStyles.textMSemibold.copyWith(color: appTheme.black),
- ),
+ child: Text(widget.recipe.title ?? '', style: TextStyles.textMSemibold.copyWith(color: appTheme.black)),
),
if (widget.recipe.videoUrl != null && widget.recipe.videoUrl!.isNotEmpty) ...[
const SizedBox(height: 12),
@@ -152,10 +140,7 @@ class _RecipesWidgetState extends State {
children: [
SvgPicture.asset('assets/icons/play_icon.svg', width: 16, height: 16),
const SizedBox(width: 8),
- Text(
- s.there_is_a_video,
- style: TextStyles.textXSSemibold.copyWith(color: appTheme.black),
- ),
+ Text(s.there_is_a_video, style: TextStyles.textXSSemibold.copyWith(color: appTheme.black)),
],
),
),
@@ -165,17 +150,41 @@ class _RecipesWidgetState extends State {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.recipe.description.length > 200
- ? widget.recipe.description.substring(0, 200).replaceAll('\n', '
')
- : widget.recipe.description.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.recipe.description.length > 200
+ ? widget.recipe.description.substring(0, 200).replaceAll('\n', '
')
+ : widget.recipe.description.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
- color: appTheme.black,
- margin: Margins.all(0),
- fontFamily: TextStyles.textSMedium.fontFamily,
+ "body": Style(
+ margin: Margins.zero,
+ padding: HtmlPaddings.zero,
fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14),
- fontWeight: TextStyles.textSMedium.fontWeight,
+ lineHeight: const LineHeight(1.5),
),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -184,12 +193,7 @@ class _RecipesWidgetState extends State {
padding: EdgeInsets.only(left: 16, top: 8),
child: Text(
'Показать ещё',
- style: TextStyle(
- height: 1,
- color: Color(0xFF8B8B8B),
- fontSize: 14,
- fontWeight: FontWeight.w600,
- ),
+ style: TextStyle(height: 1, color: Color(0xFF8B8B8B), fontSize: 14, fontWeight: FontWeight.w600),
),
),
const SizedBox(height: 12),
@@ -211,14 +215,9 @@ class _RecipesWidgetState extends State {
FeedIconButton(
icon: Icons.chat_bubble_outline,
text: widget.recipe.commentsCount.toString(),
- onTap: () => GoRouter.of(context).pushNamed(
- 'aboutRecipesScreen',
- extra: {
- 'recipe': widget.recipe.slug,
- 'index': widget.index,
- 'navigateToComments': true,
- },
- ),
+ onTap: () => GoRouter.of(
+ context,
+ ).pushNamed('aboutRecipesScreen', extra: {'recipe': widget.recipe.slug, 'index': widget.index, 'navigateToComments': true}),
),
const SizedBox(width: 8),
FeedIconButton(
@@ -239,19 +238,11 @@ class _RecipesWidgetState extends State {
},
),
const Spacer(),
- Icon(
- Icons.visibility_rounded,
- size: 16,
- color: appTheme.gray500,
- ),
+ Icon(Icons.visibility_rounded, size: 16, color: appTheme.gray500),
const SizedBox(width: 4),
Text(
widget.recipe.viewsCount.toString(),
- style: TextStyle(
- fontSize: 12,
- color: appTheme.gray500,
- fontWeight: FontWeight.w400,
- ),
+ style: TextStyle(fontSize: 12, color: appTheme.gray500, fontWeight: FontWeight.w400),
),
],
),
@@ -268,26 +259,17 @@ class _RecipesWidgetState extends State {
Container _iconButton(String iconPath, [String? text]) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
- decoration: BoxDecoration(
- color: appTheme.whiteA700,
- borderRadius: BorderRadius.circular(16),
- ),
+ decoration: BoxDecoration(color: appTheme.whiteA700, borderRadius: BorderRadius.circular(16)),
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
- SvgPicture.asset(
- iconPath,
- ),
+ SvgPicture.asset(iconPath),
if (text != null) const SizedBox(width: 8),
if (text != null)
Text(
text,
- style: const TextStyle(
- fontSize: 12,
- color: Colors.black,
- fontWeight: FontWeight.w500,
- ),
+ style: const TextStyle(fontSize: 12, color: Colors.black, fontWeight: FontWeight.w500),
),
],
),
diff --git a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart
index d6f41d7f..c3c9c5a3 100644
--- a/lib/features/my_diets/presentation/widgets/my_diet_widget.dart
+++ b/lib/features/my_diets/presentation/widgets/my_diet_widget.dart
@@ -24,14 +24,12 @@ import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/svg.dart';
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class MyDietWidget extends StatefulWidget {
final Diet diet;
- const MyDietWidget({
- super.key,
- required this.diet,
- });
+ const MyDietWidget({super.key, required this.diet});
@override
State createState() => _MyDietWidgetState();
@@ -42,10 +40,7 @@ class _MyDietWidgetState extends State {
Widget build(BuildContext context) {
final s = S.of(context);
return DecoratedBox(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- color: Colors.white,
- ),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -78,26 +73,48 @@ class _MyDietWidgetState extends State {
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.diet.name,
- style: TextStyles.textMSemibold.copyWith(color: appTheme.black),
- ),
+ child: Text(widget.diet.name, style: TextStyles.textMSemibold.copyWith(color: appTheme.black)),
),
if (widget.diet.details.isNotEmpty) ...[
- const SizedBox(
- height: 12,
- ),
+ const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.diet.details.length > 200 ? '${widget.diet.details.substring(0, 200).replaceAll('\n', '
')}...' : widget.diet.details.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.diet.details.length > 200
+ ? '${widget.diet.details.substring(0, 200).replaceAll('\n', '
')}...'
+ : widget.diet.details.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
+ "body": Style(
margin: Margins.zero,
- color: appTheme.black,
+ padding: HtmlPaddings.zero,
fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14),
- fontWeight: TextStyles.textSMedium.fontWeight ?? FontWeight.w400,
+ lineHeight: const LineHeight(1.5),
),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -230,11 +247,7 @@ class _MyDietWidgetState extends State {
},
height: 52,
width: 52,
- leftIcon: SvgPicture.asset(
- 'assets/icons/trash_can.svg',
- width: 20,
- height: 20,
- ),
+ leftIcon: SvgPicture.asset('assets/icons/trash_can.svg', width: 20, height: 20),
buttonTextStyle: TextStyles.textMSemibold.copyWith(color: appTheme.red),
buttonStyle: ButtonStyle(
shape: WidgetStatePropertyAll(RoundedRectangleBorder(borderRadius: BorderRadius.circular(20))),
diff --git a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart
index 5d057be5..14a2567f 100644
--- a/lib/features/my_plans/presentation/widgets/my_plan_widget.dart
+++ b/lib/features/my_plans/presentation/widgets/my_plan_widget.dart
@@ -18,6 +18,7 @@ import 'package:flutter_html/flutter_html.dart';
// Removed SVG icon usage after switching to text buttons
import 'package:go_router/go_router.dart';
import 'package:share_plus/share_plus.dart';
+import 'package:markdown/markdown.dart' as md;
class MyPlanWidget extends StatefulWidget {
final PlanModel plan;
@@ -43,7 +44,11 @@ class _MyPlanWidgetState extends State {
onTap: () => GoRouter.of(context).pushNamed('aboutPlanScreen', extra: {'slug': widget.plan.slug, 'navigateToComments': false}),
child: ClipRRect(
borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),
- child: CachedNetworkImage(imageUrl: '${sl().baseUrl}/storage/${widget.plan.image}', fit: BoxFit.fitWidth, width: MediaQuery.of(context).size.width),
+ child: CachedNetworkImage(
+ imageUrl: '${sl().baseUrl}/storage/${widget.plan.image}',
+ fit: BoxFit.fitWidth,
+ width: MediaQuery.of(context).size.width,
+ ),
),
),
Positioned(
@@ -68,16 +73,41 @@ class _MyPlanWidgetState extends State {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.plan.details.length > 200
- ? '${widget.plan.details.substring(0, 200).replaceAll('\n', '
')}...'
- : widget.plan.details.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.plan.details.length > 200
+ ? '${widget.plan.details.substring(0, 200).replaceAll('\n', '
')}...'
+ : widget.plan.details.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
+ "body": Style(
margin: Margins.zero,
- color: appTheme.black,
+ padding: HtmlPaddings.zero,
fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14),
- fontWeight: TextStyles.textSMedium.fontWeight ?? FontWeight.w400,
+ lineHeight: const LineHeight(1.5),
),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
diff --git a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart
index 7c55c420..7163179f 100644
--- a/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart
+++ b/lib/features/profile/presentation/widgets/profile_blog_post_widget.dart
@@ -16,17 +16,14 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
+import 'package:markdown/markdown.dart' as md;
import 'package:share_plus/share_plus.dart';
class ProfileBlogPostWidget extends StatefulWidget {
final int index;
final ProfileCubit profileCubit;
- const ProfileBlogPostWidget({
- super.key,
- required this.index,
- required this.profileCubit,
- });
+ const ProfileBlogPostWidget({super.key, required this.index, required this.profileCubit});
@override
State createState() => _ProfileBlogPostWidgetState();
@@ -46,15 +43,9 @@ class _ProfileBlogPostWidgetState extends State {
totalLikes = state.blogPosts[widget.index].totalLikes;
return InkWell(
borderRadius: BorderRadius.circular(12),
- onTap: () => GoRouter.of(context).pushNamed(
- 'blogPostScreen',
- extra: state.blogPosts[widget.index].id,
- ),
+ onTap: () => GoRouter.of(context).pushNamed('blogPostScreen', extra: state.blogPosts[widget.index].id),
child: Ink(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- color: Colors.white,
- ),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -80,19 +71,12 @@ class _ProfileBlogPostWidgetState extends State {
children: [
Text(
state.blogPosts[widget.index].author.authorName,
- style: const TextStyle(
- height: 1,
- color: Colors.black87,
- fontWeight: FontWeight.w500,
- ),
+ style: const TextStyle(height: 1, color: Colors.black87, fontWeight: FontWeight.w500),
),
const SizedBox(height: 4),
Text(
'${calculateDifference(state.blogPosts[widget.index].createdAt)} в ${state.blogPosts[widget.index].createdAt.hour.toString().padLeft(2, '0')}:${state.blogPosts[widget.index].createdAt.minute.toString().padLeft(2, '0')}',
- style: const TextStyle(
- height: 1,
- color: Colors.black45,
- ),
+ style: const TextStyle(height: 1, color: Colors.black45),
),
],
),
@@ -114,11 +98,7 @@ class _ProfileBlogPostWidgetState extends State {
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Text(
state.blogPosts[widget.index].title,
- style: const TextStyle(
- fontWeight: FontWeight.w600,
- fontSize: 18,
- color: Colors.black87,
- ),
+ style: const TextStyle(fontWeight: FontWeight.w600, fontSize: 18, color: Colors.black87),
),
),
],
@@ -128,14 +108,36 @@ class _ProfileBlogPostWidgetState extends State {
Padding(
padding: const EdgeInsets.symmetric(horizontal: 4),
child: Html(
- data: state.blogPosts[widget.index].description.length > 200
- ? state.blogPosts[widget.index].description.substring(0, 200).replaceAll('\n', '
')
- : state.blogPosts[widget.index].description.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ state.blogPosts[widget.index].description.length > 200
+ ? state.blogPosts[widget.index].description.substring(0, 200).replaceAll('\n', '
')
+ : state.blogPosts[widget.index].description.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
- fontSize: FontSize(16),
- color: Colors.black87,
+ "body": Style(margin: Margins.zero, padding: HtmlPaddings.zero, fontSize: FontSize(16), lineHeight: const LineHeight(1.5)),
+ "p": Style(margin: Margins.only(bottom: 12), color: Colors.black87),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: Colors.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: Colors.black87),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: Colors.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -144,12 +146,7 @@ class _ProfileBlogPostWidgetState extends State {
padding: EdgeInsets.symmetric(horizontal: 12),
child: Text(
'Показать ещё',
- style: TextStyle(
- height: 1,
- color: Color(0xFF8B8B8B),
- fontSize: 14,
- fontWeight: FontWeight.w600,
- ),
+ style: TextStyle(height: 1, color: Color(0xFF8B8B8B), fontSize: 14, fontWeight: FontWeight.w600),
),
),
if (state.blogPosts[widget.index].title.isNotEmpty || state.blogPosts[widget.index].description.isNotEmpty) const SizedBox(height: 8),
@@ -157,10 +154,7 @@ class _ProfileBlogPostWidgetState extends State {
onTap: () {
context.pushTransparentRoute(
rootNavigator: true,
- PhotoViewScreen(
- imageUrls: ['${sl().baseUrl}/storage/${state.blogPosts[widget.index].image}'],
- index: 0,
- ),
+ PhotoViewScreen(imageUrls: ['${sl().baseUrl}/storage/${state.blogPosts[widget.index].image}'], index: 0),
);
},
child: Hero(
@@ -192,10 +186,7 @@ class _ProfileBlogPostWidgetState extends State {
isLiked
? await context.read().likePost(state.blogPosts[widget.index].id)
: await context.read().unlikedPost(state.blogPosts[widget.index].id);
- widget.profileCubit.updateFeedBlogPostList(
- state.blogPosts[widget.index],
- isLiked ? false : true,
- );
+ widget.profileCubit.updateFeedBlogPostList(state.blogPosts[widget.index], isLiked ? false : true);
},
),
const SizedBox(width: 8),
@@ -204,16 +195,10 @@ class _ProfileBlogPostWidgetState extends State {
'assets/icons/comment.svg',
height: 20,
width: 20,
- colorFilter: ColorFilter.mode(
- appTheme.gray600,
- BlendMode.srcIn,
- ),
+ colorFilter: ColorFilter.mode(appTheme.gray600, BlendMode.srcIn),
),
text: state.blogPosts[widget.index].totalComments.toString(),
- onTap: () => GoRouter.of(context).pushNamed(
- 'blogPostScreen',
- extra: state.blogPosts[widget.index].id,
- ),
+ onTap: () => GoRouter.of(context).pushNamed('blogPostScreen', extra: state.blogPosts[widget.index].id),
),
const SizedBox(width: 8),
FeedIconButton(
@@ -234,19 +219,11 @@ class _ProfileBlogPostWidgetState extends State {
},
),
const Spacer(),
- Icon(
- Icons.visibility_rounded,
- size: 16,
- color: appTheme.gray500,
- ),
+ Icon(Icons.visibility_rounded, size: 16, color: appTheme.gray500),
const SizedBox(width: 4),
Text(
state.blogPosts[widget.index].totalViews.toString(),
- style: TextStyle(
- fontSize: 12,
- color: appTheme.gray500,
- fontWeight: FontWeight.w400,
- ),
+ style: TextStyle(fontSize: 12, color: appTheme.gray500, fontWeight: FontWeight.w400),
),
],
),
diff --git a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart
index d791135a..3e73b7cc 100644
--- a/lib/features/recipe/presentation/widgets/my_recipe_widget.dart
+++ b/lib/features/recipe/presentation/widgets/my_recipe_widget.dart
@@ -15,15 +15,13 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_html/flutter_html.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:go_router/go_router.dart';
+import 'package:markdown/markdown.dart' as md;
import 'package:share_plus/share_plus.dart';
class MyRecipeWidget extends StatefulWidget {
final MyRecipeModel recipe;
- const MyRecipeWidget({
- super.key,
- required this.recipe,
- });
+ const MyRecipeWidget({super.key, required this.recipe});
@override
State createState() => _MyRecipeWidgetState();
@@ -50,10 +48,7 @@ class _MyRecipeWidgetState extends State {
Widget build(BuildContext context) {
final s = S.of(context);
return DecoratedBox(
- decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(12),
- color: Colors.white,
- ),
+ decoration: BoxDecoration(borderRadius: BorderRadius.circular(12), color: Colors.white),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
@@ -61,13 +56,7 @@ class _MyRecipeWidgetState extends State {
Stack(
children: [
InkWell(
- onTap: () async => GoRouter.of(context).pushNamed(
- 'aboutRecipesScreen',
- extra: {
- 'recipe': widget.recipe.slug,
- 'navigateToComments': false,
- },
- ),
+ onTap: () async => GoRouter.of(context).pushNamed('aboutRecipesScreen', extra: {'recipe': widget.recipe.slug, 'navigateToComments': false}),
child: ClipRRect(
borderRadius: const BorderRadius.vertical(top: Radius.circular(12)),
child: CachedNetworkImage(
@@ -99,28 +88,48 @@ class _MyRecipeWidgetState extends State {
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
- child: Text(
- widget.recipe.title!,
- style: TextStyles.textMSemibold.copyWith(color: appTheme.black),
- ),
+ child: Text(widget.recipe.title!, style: TextStyles.textMSemibold.copyWith(color: appTheme.black)),
),
if (widget.recipe.description.isNotEmpty) ...[
- const SizedBox(
- height: 12,
- ),
+ const SizedBox(height: 12),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: Html(
- data: widget.recipe.description.length > 200
- ? '${widget.recipe.description.substring(0, 200).replaceAll('\n', '
')}...'
- : widget.recipe.description.replaceAll('\n', '
'),
+ data: md.markdownToHtml(
+ widget.recipe.description.length > 200
+ ? '${widget.recipe.description.substring(0, 200).replaceAll('\n', '
')}...'
+ : widget.recipe.description.replaceAll('\n', '
'),
+ ),
style: {
- "*": Style(
+ "body": Style(
margin: Margins.zero,
- color: appTheme.black,
+ padding: HtmlPaddings.zero,
fontSize: FontSize(TextStyles.textSMedium.fontSize ?? 14),
- fontWeight: TextStyles.textSMedium.fontWeight ?? FontWeight.w400,
+ lineHeight: const LineHeight(1.5),
),
+ "p": Style(margin: Margins.only(bottom: 12), color: appTheme.black),
+ "h1, h2, h3, h4, h5, h6": Style(margin: Margins.only(top: 16, bottom: 8), color: appTheme.black, fontWeight: FontWeight.bold),
+ "h1": Style(fontSize: FontSize(24)),
+ "h2": Style(fontSize: FontSize(20)),
+ "h3": Style(fontSize: FontSize(18)),
+ "ul, ol": Style(margin: Margins.only(bottom: 12), padding: HtmlPaddings.only(left: 16)),
+ "li": Style(margin: Margins.only(bottom: 4), color: appTheme.black),
+ "strong, b": Style(fontWeight: FontWeight.bold, color: appTheme.black),
+ "em, i": Style(fontStyle: FontStyle.italic),
+ "code": Style(
+ backgroundColor: Colors.grey.shade100,
+ padding: HtmlPaddings.symmetric(horizontal: 4, vertical: 2),
+ fontFamily: 'monospace',
+ ),
+ "pre": Style(backgroundColor: Colors.grey.shade100, padding: HtmlPaddings.all(12), margin: Margins.only(bottom: 12)),
+ "blockquote": Style(
+ padding: HtmlPaddings.only(left: 16),
+ margin: Margins.only(left: 8, bottom: 12),
+ fontStyle: FontStyle.italic,
+ color: Colors.grey.shade700,
+ ),
+ "a": Style(color: Colors.blue, textDecoration: TextDecoration.underline),
+ "img": Style(width: Width(MediaQuery.of(context).size.width - 32)),
},
),
),
@@ -192,26 +201,17 @@ class _MyRecipeWidgetState extends State {
Container _iconButton(String iconPath, [String? text]) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 4),
- decoration: BoxDecoration(
- color: appTheme.whiteA700,
- borderRadius: BorderRadius.circular(16),
- ),
+ decoration: BoxDecoration(color: appTheme.whiteA700, borderRadius: BorderRadius.circular(16)),
height: 32,
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
- SvgPicture.asset(
- iconPath,
- ),
+ SvgPicture.asset(iconPath),
if (text != null) const SizedBox(width: 8),
if (text != null)
Text(
text,
- style: const TextStyle(
- fontSize: 12,
- color: Colors.black,
- fontWeight: FontWeight.w500,
- ),
+ style: const TextStyle(fontSize: 12, color: Colors.black, fontWeight: FontWeight.w500),
),
],
),
diff --git a/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart b/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart
index ccf9cae4..3bd0a6a1 100644
--- a/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart
+++ b/lib/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart
@@ -3,6 +3,8 @@ import 'dart:developer';
import 'package:eatvio_app/core/app_router.dart';
import 'package:eatvio_app/core/firebase_api.dart';
import 'package:eatvio_app/core/locator_service.dart';
+import 'package:eatvio_app/core/mixins/registration_date_cache_mixin.dart';
+import 'package:eatvio_app/core/prefs.dart';
import 'package:eatvio_app/core/token_storage.dart';
import 'package:eatvio_app/features/registration/models/user_registration_model.dart';
@@ -12,10 +14,9 @@ import 'package:eatvio_app/features/registration/services/registration_analytics
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
-class RegistrationCubit extends Cubit {
+class RegistrationCubit extends Cubit with RegistrationDateCacheMixin {
final RegistrationRepository registrationRepository;
-
- RegistrationCubit({required this.registrationRepository})
+ RegistrationCubit({required this.registrationRepository, required Prefs prefs})
: super(
const RegistrationState(
sheet: UserRegistrationSheet(
@@ -47,7 +48,9 @@ class RegistrationCubit extends Cubit {
phone: '',
),
),
- );
+ ) {
+ this.prefs = prefs;
+ }
void updateSheet(UserRegistrationSheet sheet) => emit(RegistrationState(sheet: sheet));
@@ -59,6 +62,7 @@ class RegistrationCubit extends Cubit {
await TokenStorage.saveTokenInStorage(token);
await sl().registerPushToken();
RegistrationAnalyticsService.reportRegistrationComplete();
+ cacheRegistrationDate(DateTime.now());
AppRouter.navigatorKey.currentContext?.replaceNamed('verifyEmailScreen');
} catch (e, st) {
log(e.toString(), stackTrace: st);
diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart
index 7baeee1a..907d842b 100644
--- a/lib/generated/intl/messages_en.dart
+++ b/lib/generated/intl/messages_en.dart
@@ -199,6 +199,7 @@ class MessageLookup extends MessageLookupByLibrary {
"congratsYouHaveFinishedPlan": MessageLookupByLibrary.simpleMessage(
"Поздравляем, Вы закончили план",
),
+ "congratulations": MessageLookupByLibrary.simpleMessage("Поздравляем!"),
"consultantLeftComment": m0,
"consultations_count": MessageLookupByLibrary.simpleMessage(
"Кол-во проведенных консулдьтаций",
@@ -306,6 +307,9 @@ class MessageLookup extends MessageLookupByLibrary {
"eating_behavior_type_desc": MessageLookupByLibrary.simpleMessage(
"Формирование здорового пищевого поведения — это процесс, который включает в себя изменение привычек и отношения к еде. Он направлен на то, чтобы помочь людям научиться правильно питаться и поддерживать здоровый образ жизни.Основные принципы формирования здорового пищевого поведения: \n● Разнообразие продуктов; \n● Сбалансированный рацион; \n● Питьевой режим; \n● Ограничение вредных продуктов; \n● Регулярные приёмы пищи; \n● Умеренность;Осознанное питание; \n● Физическая активность;",
),
+ "eatvioIsAHelthyHabbit": MessageLookupByLibrary.simpleMessage(
+ "Итвио — это полезная привычка",
+ ),
"economy": MessageLookupByLibrary.simpleMessage("Эконом"),
"edit": MessageLookupByLibrary.simpleMessage("Редактировать"),
"email": MessageLookupByLibrary.simpleMessage("Электронная почта"),
@@ -379,6 +383,7 @@ class MessageLookup extends MessageLookupByLibrary {
"for_whole_period_of_time": MessageLookupByLibrary.simpleMessage(
"За всё время",
),
+ "fourteenDays": MessageLookupByLibrary.simpleMessage("14 дней"),
"fraud": MessageLookupByLibrary.simpleMessage("Мошенничество"),
"fraud_description": MessageLookupByLibrary.simpleMessage(
"Мошенничество с целью наживы. Если вас обманули, пожалуйста, сообщите об этом в правоохранительные органы.",
@@ -419,6 +424,7 @@ class MessageLookup extends MessageLookupByLibrary {
"initial_measurements": MessageLookupByLibrary.simpleMessage(
"Первичные замеры",
),
+ "invite": MessageLookupByLibrary.simpleMessage("Пригласить"),
"invited_people_count": MessageLookupByLibrary.simpleMessage(
"Количество приглашенных",
),
@@ -441,6 +447,9 @@ class MessageLookup extends MessageLookupByLibrary {
"leaveComplainRequest": MessageLookupByLibrary.simpleMessage(
"Подать жалобу",
),
+ "letsInvite": MessageLookupByLibrary.simpleMessage(
+ "Давайте пригласим близких в итвио",
+ ),
"light_type": MessageLookupByLibrary.simpleMessage("Легкая"),
"light_type_desc": MessageLookupByLibrary.simpleMessage(
"С некоторыми видами диет можно употреблять алкоголь в умеренных количествах. Рекомендуется совмещать вместе с низкокалорийными закусками.",
@@ -774,6 +783,9 @@ class MessageLookup extends MessageLookupByLibrary {
"want_to_see_tomorrow": MessageLookupByLibrary.simpleMessage(
"Хотите заглянуть в будущее?",
),
+ "weAreLookingFor": MessageLookupByLibrary.simpleMessage(
+ "Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!",
+ ),
"weapon": MessageLookupByLibrary.simpleMessage("Оружие"),
"weight": MessageLookupByLibrary.simpleMessage("Вес"),
"weight_chart": MessageLookupByLibrary.simpleMessage("График веса"),
@@ -802,6 +814,7 @@ class MessageLookup extends MessageLookupByLibrary {
"youShureYouWantToDeleteAccount": MessageLookupByLibrary.simpleMessage(
"Вы уверены, что хотите удалить аккаунт?",
),
+ "youWithUs": MessageLookupByLibrary.simpleMessage("Вы с итвио уже\n"),
"you_can_not_open_this_day": MessageLookupByLibrary.simpleMessage(
"Вы не можете перейти в этот день",
),
diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart
index ea858556..c987d1e5 100644
--- a/lib/generated/l10n.dart
+++ b/lib/generated/l10n.dart
@@ -3503,6 +3503,66 @@ class S {
String get customer {
return Intl.message('Покупатель', name: 'customer', desc: '', args: []);
}
+
+ /// `Поздравляем!`
+ String get congratulations {
+ return Intl.message(
+ 'Поздравляем!',
+ name: 'congratulations',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Вы с итвио уже\n`
+ String get youWithUs {
+ return Intl.message(
+ 'Вы с итвио уже\n',
+ name: 'youWithUs',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `14 дней`
+ String get fourteenDays {
+ return Intl.message('14 дней', name: 'fourteenDays', desc: '', args: []);
+ }
+
+ /// `Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!`
+ String get weAreLookingFor {
+ return Intl.message(
+ 'Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!',
+ name: 'weAreLookingFor',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Давайте пригласим близких в итвио`
+ String get letsInvite {
+ return Intl.message(
+ 'Давайте пригласим близких в итвио',
+ name: 'letsInvite',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Итвио — это полезная привычка`
+ String get eatvioIsAHelthyHabbit {
+ return Intl.message(
+ 'Итвио — это полезная привычка',
+ name: 'eatvioIsAHelthyHabbit',
+ desc: '',
+ args: [],
+ );
+ }
+
+ /// `Пригласить`
+ String get invite {
+ return Intl.message('Пригласить', name: 'invite', desc: '', args: []);
+ }
}
class AppLocalizationDelegate extends LocalizationsDelegate {
diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb
index 5e7094b6..916fdcfa 100644
--- a/lib/l10n/intl_en.arb
+++ b/lib/l10n/intl_en.arb
@@ -415,6 +415,13 @@
"cannotDeleteAccount": "Не получилось удалить ваш аккаунт",
"resend": "Отправить повторно",
"notifications": "Уведомления",
- "customer": "Покупатель"
+ "customer": "Покупатель",
+ "congratulations": "Поздравляем!",
+ "youWithUs": "Вы с итвио уже\n",
+ "fourteenDays": "14 дней",
+ "weAreLookingFor": "Мы собираем самое большое сообщество людей, желающих вести здоровый образ жизни!",
+ "letsInvite": "Давайте пригласим близких в итвио",
+ "eatvioIsAHelthyHabbit": "Итвио — это полезная привычка",
+ "invite": "Пригласить"
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 746ffa31..d3819b86 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -76,6 +76,7 @@ dependencies:
appmetrica_plugin: ^3.3.0
vk_id: ^1.0.3
flutter_login_yandex: ^0.0.5
+ markdown: ^7.3.0
dev_dependencies:
build_runner: ^2.7.0
diff --git a/test/features/registration/basic_widget_test.dart b/test/features/registration/basic_widget_test.dart
index 1a51a4b2..16995a82 100644
--- a/test/features/registration/basic_widget_test.dart
+++ b/test/features/registration/basic_widget_test.dart
@@ -1,5 +1,6 @@
// ignore_for_file: deprecated_member_use
+import 'package:eatvio_app/core/prefs.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
@@ -10,7 +11,7 @@ import 'package:mockito/annotations.dart';
import 'basic_widget_test.mocks.dart';
-@GenerateMocks([RegistrationRepository])
+@GenerateMocks([RegistrationRepository, Prefs])
void main() {
group('Registration Basic Widget Tests', () {
late MockRegistrationRepository mockRegistrationRepository;
@@ -18,7 +19,7 @@ void main() {
setUp(() {
mockRegistrationRepository = MockRegistrationRepository();
- registrationCubit = RegistrationCubit(registrationRepository: mockRegistrationRepository);
+ registrationCubit = RegistrationCubit(registrationRepository: mockRegistrationRepository, prefs: MockPrefs());
});
tearDown(() {
@@ -37,7 +38,7 @@ void main() {
testWidgets('should create RegistrationCubit successfully', (WidgetTester tester) async {
// Arrange & Act
- final cubit = RegistrationCubit(registrationRepository: mockRegistrationRepository);
+ final cubit = RegistrationCubit(registrationRepository: mockRegistrationRepository, prefs: MockPrefs());
// Assert
expect(cubit, isA());
diff --git a/test/features/registration/integration_widget_test.dart b/test/features/registration/integration_widget_test.dart
index 8a9afc15..e5559a80 100644
--- a/test/features/registration/integration_widget_test.dart
+++ b/test/features/registration/integration_widget_test.dart
@@ -1,3 +1,4 @@
+import 'package:eatvio_app/core/prefs.dart';
import 'package:eatvio_app/core/theme/theme_helper.dart';
import 'package:eatvio_app/features/registration/presentation/bloc/registration_cubit/registration_cubit.dart';
import 'package:eatvio_app/features/registration/repositories/registration_repository.dart';
@@ -8,7 +9,7 @@ import 'package:mockito/annotations.dart';
import 'integration_widget_test.mocks.dart';
-@GenerateMocks([RegistrationRepository])
+@GenerateMocks([RegistrationRepository, Prefs])
void main() {
group('Registration Integration Widget Tests', () {
late MockRegistrationRepository mockRegistrationRepository;
@@ -16,7 +17,7 @@ void main() {
setUp(() {
mockRegistrationRepository = MockRegistrationRepository();
- registrationCubit = RegistrationCubit(registrationRepository: mockRegistrationRepository);
+ registrationCubit = RegistrationCubit(registrationRepository: mockRegistrationRepository, prefs: MockPrefs());
});
tearDown(() {