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(() {