diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 0000000..dfc1347 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,985 @@ +SF:lib\app\data\model\shalat_time_response.dart +DA:8,2 +DA:14,2 +DA:15,2 +DA:16,2 +DA:17,2 +DA:18,2 +DA:19,0 +DA:20,10 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:30,2 +DA:31,2 +DA:32,4 +DA:33,4 +DA:34,4 +DA:35,4 +DA:36,4 +DA:37,4 +DA:38,4 +DA:39,4 +DA:40,4 +DA:41,4 +DA:42,4 +DA:43,6 +DA:44,4 +DA:45,4 +DA:46,4 +DA:47,4 +DA:48,4 +DA:49,4 +DA:50,4 +DA:51,6 +DA:52,6 +DA:53,4 +DA:54,2 +DA:55,0 +DA:64,2 +DA:70,4 +DA:72,6 +DA:73,6 +DA:74,6 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:90,2 +DA:97,4 +DA:98,2 +DA:99,2 +DA:100,2 +DA:102,4 +DA:103,6 +DA:106,0 +DA:107,0 +DA:108,0 +DA:109,0 +DA:110,0 +DA:123,2 +DA:133,4 +DA:134,2 +DA:135,2 +DA:136,2 +DA:137,2 +DA:139,4 +DA:140,2 +DA:142,4 +DA:143,2 +DA:144,2 +DA:146,4 +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:164,2 +DA:169,4 +DA:170,2 +DA:171,2 +DA:174,0 +DA:175,0 +DA:176,0 +DA:184,2 +DA:189,4 +DA:190,2 +DA:191,2 +DA:194,0 +DA:195,0 +DA:196,0 +DA:203,2 +DA:207,2 +DA:208,2 +DA:209,2 +DA:212,0 +DA:213,0 +DA:227,2 +DA:238,4 +DA:239,2 +DA:240,2 +DA:241,2 +DA:242,2 +DA:244,4 +DA:246,6 +DA:247,2 +DA:248,2 +DA:250,4 +DA:251,2 +DA:252,0 +DA:253,8 +DA:256,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:260,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:265,0 +DA:274,2 +DA:280,4 +DA:281,2 +DA:282,2 +DA:283,2 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:297,2 +DA:302,4 +DA:303,2 +DA:304,2 +DA:307,0 +DA:308,0 +DA:309,0 +DA:323,2 +DA:334,4 +DA:335,4 +DA:336,4 +DA:337,2 +DA:338,6 +DA:339,2 +DA:340,2 +DA:341,2 +DA:342,4 +DA:343,6 +DA:346,0 +DA:347,0 +DA:348,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:355,0 +DA:364,2 +DA:370,4 +DA:371,2 +DA:372,2 +DA:373,6 +DA:376,0 +DA:377,0 +DA:378,0 +DA:379,0 +DA:386,2 +DA:390,4 +DA:391,2 +DA:394,0 +DA:395,0 +DA:412,2 +DA:426,4 +DA:427,2 +DA:428,2 +DA:429,2 +DA:430,2 +DA:431,2 +DA:432,2 +DA:433,2 +DA:434,2 +DA:435,2 +DA:436,2 +DA:437,2 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:445,0 +DA:446,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +LF:199 +LH:122 +end_of_record +SF:lib\app\data\providers\database_helper.dart +DA:9,0 +DA:13,0 +DA:17,0 +DA:18,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:33,0 +DA:34,0 +DA:35,0 +DA:38,0 +DA:39,0 +DA:40,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:73,0 +DA:74,0 +DA:75,0 +DA:76,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +LF:44 +LH:0 +end_of_record +SF:lib\app\data\providers\shalat_local_data_source.dart +DA:18,1 +DA:20,1 +DA:22,2 +DA:23,1 +DA:24,4 +DA:25,2 +DA:28,1 +DA:31,2 +DA:34,2 +DA:38,1 +DA:40,2 +DA:41,2 +LF:12 +LH:12 +end_of_record +SF:lib\app\domain\entities\shalat.dart +DA:11,2 +DA:25,0 +DA:26,0 +LF:3 +LH:1 +end_of_record +SF:lib\core\extensions\string_extension.dart +DA:3,1 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,1 +DA:11,2 +DA:12,1 +LF:7 +LH:7 +end_of_record +SF:lib\core\utils\exception.dart +DA:4,2 +DA:10,4 +LF:2 +LH:2 +end_of_record +SF:lib\core\utils\logger.dart +DA:21,3 +DA:22,15 +DA:26,0 +DA:27,0 +DA:31,0 +DA:32,0 +DA:36,0 +DA:37,0 +DA:41,0 +DA:42,0 +LF:10 +LH:2 +end_of_record +SF:lib\core\values\constant.dart +DA:3,0 +DA:15,0 +DA:37,0 +LF:3 +LH:0 +end_of_record +SF:lib\app\data\model\asmaul_husna_response.dart +DA:10,1 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,4 +DA:20,0 +DA:22,0 +DA:25,2 +DA:26,3 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:42,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:64,0 +LF:29 +LH:21 +end_of_record +SF:lib\app\data\model\daily_pray_response.dart +DA:10,0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:20,0 +DA:22,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:38,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +LF:24 +LH:0 +end_of_record +SF:lib\app\data\model\list_surah_response.dart +DA:9,0 +DA:11,2 +DA:12,4 +DA:13,4 +DA:14,4 +DA:15,2 +DA:16,4 +DA:17,6 +DA:18,6 +DA:23,2 +DA:24,2 +DA:25,4 +DA:26,2 +DA:27,2 +DA:28,2 +DA:29,4 +DA:30,4 +DA:31,4 +DA:32,6 +DA:33,4 +DA:34,6 +DA:35,2 +DA:36,2 +DA:37,4 +DA:38,4 +DA:39,6 +DA:40,4 +DA:41,2 +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:65,0 +DA:73,2 +DA:74,4 +DA:75,4 +DA:76,4 +DA:77,8 +DA:78,4 +DA:79,4 +DA:81,8 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:89,0 +DA:90,0 +DA:92,0 +DA:93,0 +DA:95,0 +DA:96,0 +DA:108,0 +DA:110,2 +DA:111,4 +DA:112,4 +DA:113,4 +DA:114,4 +DA:116,4 +DA:117,4 +DA:121,0 +DA:122,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:126,0 +DA:128,0 +DA:129,0 +DA:139,0 +DA:141,2 +DA:142,4 +DA:143,4 +DA:146,0 +DA:147,0 +DA:148,0 +DA:149,0 +DA:159,0 +DA:161,2 +DA:162,4 +DA:163,4 +DA:164,4 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:171,0 +DA:179,0 +DA:181,2 +DA:182,4 +DA:185,0 +DA:186,0 +DA:187,0 +LF:96 +LH:51 +end_of_record +SF:lib\app\data\model\surah_detail_response.dart +DA:8,0 +DA:9,0 +DA:11,0 +DA:12,0 +DA:20,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,3 +DA:35,0 +DA:36,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:41,1 +DA:42,2 +DA:44,3 +DA:45,2 +DA:46,2 +DA:47,3 +DA:48,3 +DA:49,4 +DA:50,4 +DA:51,3 +DA:52,3 +DA:53,2 +DA:54,2 +DA:56,2 +DA:57,2 +DA:59,2 +DA:60,2 +DA:61,2 +DA:62,2 +DA:63,2 +DA:64,3 +DA:65,1 +DA:66,0 +DA:80,1 +DA:91,2 +DA:92,1 +DA:93,1 +DA:94,1 +DA:95,3 +DA:96,1 +DA:98,2 +DA:100,3 +DA:101,1 +DA:103,0 +DA:104,1 +DA:105,0 +DA:106,5 +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:129,1 +DA:136,2 +DA:137,1 +DA:138,1 +DA:139,1 +DA:141,2 +DA:142,1 +DA:144,2 +DA:147,0 +DA:148,0 +DA:149,0 +DA:150,0 +DA:151,0 +DA:159,1 +DA:164,2 +DA:165,1 +DA:166,1 +DA:169,0 +DA:170,0 +DA:171,0 +DA:180,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:190,0 +DA:191,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:205,1 +DA:210,2 +DA:211,1 +DA:212,1 +DA:213,0 +DA:214,4 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:229,1 +DA:234,2 +DA:235,1 +DA:236,1 +DA:238,2 +DA:241,0 +DA:242,0 +DA:243,0 +DA:250,1 +DA:254,1 +DA:255,1 +DA:256,1 +DA:259,0 +DA:260,0 +DA:269,1 +DA:275,2 +DA:276,1 +DA:277,1 +DA:278,1 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:291,1 +DA:295,2 +DA:296,1 +DA:299,0 +DA:300,0 +DA:312,1 +DA:321,2 +DA:322,3 +DA:323,3 +DA:324,3 +DA:325,1 +DA:327,2 +DA:328,3 +DA:329,1 +DA:331,2 +DA:334,0 +DA:335,0 +DA:336,0 +DA:337,0 +DA:338,0 +DA:339,0 +DA:340,0 +DA:352,1 +DA:361,2 +DA:362,1 +DA:363,1 +DA:364,1 +DA:365,1 +DA:366,1 +DA:367,3 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:384,1 +DA:389,2 +DA:390,1 +DA:391,1 +DA:394,0 +DA:395,0 +DA:396,0 +DA:404,1 +DA:409,2 +DA:410,1 +DA:411,1 +DA:414,0 +DA:415,0 +DA:416,0 +DA:423,1 +DA:427,2 +DA:428,3 +DA:431,0 +DA:432,0 +DA:440,1 +DA:445,2 +DA:446,1 +DA:447,1 +DA:450,0 +DA:451,0 +DA:452,0 +LF:191 +LH:108 +end_of_record +SF:lib\app\data\providers\shalat_remote_data_source.dart +DA:16,0 +DA:18,0 +DA:19,0 +DA:22,0 +DA:25,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:31,0 +DA:34,0 +LF:10 +LH:0 +end_of_record +SF:lib\app\data\providers\surah_local_data_source.dart +DA:25,1 +DA:27,1 +DA:29,2 +DA:32,0 +DA:36,0 +DA:37,0 +DA:40,0 +DA:44,0 +DA:48,0 +DA:49,0 +DA:52,0 +DA:56,1 +DA:58,2 +DA:61,1 +DA:64,2 +DA:67,2 +DA:71,1 +DA:74,2 +DA:77,2 +DA:81,1 +DA:83,2 +LF:21 +LH:13 +end_of_record +SF:lib\app\data\providers\surah_remote_data_source.dart +DA:17,0 +DA:19,0 +DA:22,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:29,0 +DA:30,0 +DA:33,0 +DA:34,0 +DA:38,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:49,0 +LF:17 +LH:0 +end_of_record +SF:lib\app\domain\entities\asmaul_husna.dart +DA:7,1 +LF:1 +LH:1 +end_of_record +SF:lib\app\domain\entities\daily_pray.dart +DA:6,0 +LF:1 +LH:0 +end_of_record +SF:lib\app\domain\entities\surah.dart +DA:10,2 +DA:20,0 +DA:21,0 +LF:3 +LH:1 +end_of_record +SF:lib\app\domain\entities\surah_detail.dart +DA:11,1 +DA:31,0 +DA:32,0 +DA:33,0 +LF:4 +LH:1 +end_of_record +SF:lib\core\utils\failure.dart +DA:6,4 +DA:8,2 +DA:9,4 +DA:13,6 +DA:17,6 +DA:21,6 +LF:6 +LH:6 +end_of_record +SF:lib\core\utils\error_handler.dart +DA:4,0 +DA:5,0 +DA:6,0 +DA:7,0 +DA:8,0 +DA:9,0 +DA:11,0 +DA:13,0 +DA:15,0 +DA:17,0 +DA:19,0 +DA:21,0 +DA:23,0 +DA:25,0 +LF:14 +LH:0 +end_of_record +SF:lib\app\modules\tasbih\controllers\tasbih_controller.dart +DA:8,1 +DA:9,2 +DA:10,4 +DA:13,6 +DA:16,2 +DA:17,4 +DA:18,6 +DA:19,4 +DA:23,6 +DA:25,2 +DA:27,2 +DA:28,8 +DA:31,0 +DA:33,0 +DA:34,0 +DA:37,0 +DA:38,0 +DA:39,0 +DA:41,0 +LF:19 +LH:12 +end_of_record +SF:lib\app\modules\tasbih\views\tasbih_view.dart +DA:8,1 +DA:10,1 +DA:12,1 +DA:13,1 +DA:21,1 +DA:22,0 +DA:30,1 +DA:31,1 +DA:32,1 +DA:34,1 +DA:35,1 +DA:38,1 +DA:39,6 +DA:40,4 +DA:42,5 +DA:46,1 +DA:50,1 +DA:52,1 +DA:65,1 +DA:66,1 +DA:68,3 +DA:71,1 +DA:73,1 +DA:75,1 +DA:76,1 +DA:81,2 +DA:83,3 +DA:85,1 +DA:89,1 +DA:90,2 +DA:91,2 +DA:93,1 +DA:94,1 +DA:96,1 +DA:98,1 +DA:99,1 +DA:111,1 +DA:113,1 +DA:117,1 +DA:119,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,0 +DA:125,0 +DA:127,3 +DA:129,1 +DA:130,3 +DA:133,1 +DA:149,1 +DA:150,1 +DA:151,0 +DA:152,0 +DA:154,3 +DA:156,1 +DA:157,3 +DA:160,1 +DA:176,1 +DA:177,1 +DA:178,0 +DA:179,0 +DA:181,3 +DA:183,1 +DA:184,3 +DA:187,1 +DA:219,1 +DA:220,1 +DA:223,2 +DA:224,1 +DA:227,1 +DA:229,1 +DA:230,3 +DA:232,1 +DA:233,1 +DA:234,1 +DA:243,1 +DA:245,1 +DA:246,0 +DA:247,0 +DA:249,1 +DA:250,1 +DA:260,1 +DA:262,1 +DA:263,0 +DA:264,0 +DA:266,1 +DA:267,1 +LF:87 +LH:76 +end_of_record +SF:lib\core\theme\colors.dart +DA:4,0 +LF:1 +LH:0 +end_of_record +SF:lib\app\data\repository\shalat_repository_impl.dart +DA:19,1 +DA:25,1 +DA:28,2 +DA:30,1 +DA:31,2 +DA:32,1 +DA:34,1 +DA:36,1 +DA:37,3 +DA:38,1 +DA:39,3 +DA:40,1 +DA:41,3 +DA:43,0 +DA:48,1 +DA:49,2 +DA:50,1 +DA:51,1 +DA:52,2 +DA:53,1 +LF:20 +LH:19 +end_of_record +SF:lib\app\data\repository\surah_repository_impl.dart +DA:21,1 +DA:26,0 +DA:29,0 +DA:30,0 +DA:32,0 +DA:36,1 +DA:39,2 +DA:40,2 +DA:41,1 +DA:42,3 +DA:44,0 +DA:48,1 +DA:49,2 +DA:50,1 +DA:51,1 +DA:52,2 +DA:53,1 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:64,0 +DA:65,0 +DA:71,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:86,0 +DA:87,0 +DA:89,0 +DA:106,1 +DA:109,2 +DA:110,1 +DA:111,1 +DA:112,2 +DA:113,1 +DA:115,1 +DA:116,1 +DA:117,3 +DA:118,1 +DA:119,3 +DA:120,1 +DA:121,3 +DA:123,0 +DA:139,0 +DA:142,0 +DA:143,0 +DA:144,0 +DA:145,0 +DA:147,0 +LF:57 +LH:25 +end_of_record diff --git a/lib/app/data/datasources/shalat_remote_data_source.dart b/lib/app/data/datasources/shalat_remote_data_source.dart index a04553a..500ec23 100644 --- a/lib/app/data/datasources/shalat_remote_data_source.dart +++ b/lib/app/data/datasources/shalat_remote_data_source.dart @@ -1,4 +1,3 @@ - import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; import 'package:suji/app/data/model/shalat_time_response.dart'; @@ -7,12 +6,12 @@ import 'package:suji/core/utils/exception.dart'; import 'package:suji/core/values/constant.dart'; abstract class ShalatRemoteDataSource { - Future getShalatTime(DateTime dateTime,Position position); + Future getShalatTime( + DateTime dateTime, Position position); } class ShalatRemoteDataSourceImpl extends GetConnect implements ShalatRemoteDataSource { - @override void onInit() { httpClient.baseUrl = ApiConfig.shalatBaseURL; @@ -20,7 +19,8 @@ class ShalatRemoteDataSourceImpl extends GetConnect } @override - Future getShalatTime(DateTime dateTime, Position position) async { + Future getShalatTime( + DateTime dateTime, Position position) async { final endPoint = '${ApiConfig.shalatCalendarEndpoint}${dateTime.year}/${dateTime.month}?shafaq=general&method=15&latitude=${position.latitude}&longitude=${position.longitude}'; try { diff --git a/lib/app/data/datasources/surah_remote_data_source.dart b/lib/app/data/datasources/surah_remote_data_source.dart index 7da62c5..79fb417 100644 --- a/lib/app/data/datasources/surah_remote_data_source.dart +++ b/lib/app/data/datasources/surah_remote_data_source.dart @@ -30,7 +30,7 @@ class SurahRemoteDataSourceImpl extends GetConnect return errorHandler(response); } } catch (e) { - Log.e('[SurahRemoteDataSource][getAllSurah]', e.toString()); + Log.e('[SurahRemoteDataSource][getAllSurah]', e.toString()); throw ServerException(e.toString()); } } diff --git a/lib/app/data/model/daily_pray_response.dart b/lib/app/data/model/daily_pray_response.dart index 32db214..e4de028 100644 --- a/lib/app/data/model/daily_pray_response.dart +++ b/lib/app/data/model/daily_pray_response.dart @@ -22,11 +22,13 @@ class DataDailyPrayResponse { List.from(dataDailyPray.map((x) => x.toJson())), }; - List toEntity() => dataDailyPray.map((e) => DailyPray( - title: e.title, - arabic: e.arabic, - latin: e.latin, - translation: e.translation)).toList(); + List toEntity() => dataDailyPray + .map((e) => DailyPray( + title: e.title, + arabic: e.arabic, + latin: e.latin, + translation: e.translation)) + .toList(); } class DataDailyPrayElement { diff --git a/lib/app/data/repository/shalat_repository_impl.dart b/lib/app/data/repository/shalat_repository_impl.dart index 106fe58..38e09a0 100644 --- a/lib/app/data/repository/shalat_repository_impl.dart +++ b/lib/app/data/repository/shalat_repository_impl.dart @@ -19,13 +19,14 @@ class ShalatRepositoryImpl implements ShalatRepository { ShalatRepositoryImpl( {required this.shalatRemoteDataSource, required this.shalatLocalDataSource, - required this.connectivity - }); + required this.connectivity}); @override - Future> getShalatTime(DateTime dateTime, Position position) async { + Future> getShalatTime( + DateTime dateTime, Position position) async { try { - final result = await shalatLocalDataSource.getShalatTime(dateTime, position); + final result = + await shalatLocalDataSource.getShalatTime(dateTime, position); if (result == null) { final data = await fetchShalatTime(dateTime, position); await shalatLocalDataSource.insertOrUpdateShalat(data); @@ -44,12 +45,13 @@ class ShalatRepositoryImpl implements ShalatRepository { } } - - Future> fetchShalatTime(DateTime dateTime, Position position) async { + Future> fetchShalatTime( + DateTime dateTime, Position position) async { final hasConnected = await connectivity.checkConnectivity(); if (hasConnected == ConnectivityResult.mobile || hasConnected == ConnectivityResult.wifi) { - final result = await shalatRemoteDataSource.getShalatTime(dateTime, position); + final result = + await shalatRemoteDataSource.getShalatTime(dateTime, position); return result.toEntity(); } else { throw const SocketException(AppString.socketException); diff --git a/lib/app/data/services/background_service.dart b/lib/app/data/services/background_service.dart index 8f20fb0..3ada108 100644 --- a/lib/app/data/services/background_service.dart +++ b/lib/app/data/services/background_service.dart @@ -32,7 +32,8 @@ class BackgroundService extends GetxService { final notificationService = NotificationService(); await notificationService.showNotification(flutterLocalNotificationsPlugin); - final ShalatLocalDataSource dataSource = ShalatLocalDataSourceImpl(databaseHelper: DatabaseHelper()); + final ShalatLocalDataSource dataSource = + ShalatLocalDataSourceImpl(databaseHelper: DatabaseHelper()); final shalatTime = await dataSource.getShalatTimeByDate(DateTime.now()); if (shalatTime != null) { await AndroidAlarmManager.oneShotAt( diff --git a/lib/app/data/services/location_service.dart b/lib/app/data/services/location_service.dart index 61ae015..1021d8c 100644 --- a/lib/app/data/services/location_service.dart +++ b/lib/app/data/services/location_service.dart @@ -1,7 +1,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:get/get.dart'; -class LocationService extends GetxService{ +class LocationService extends GetxService { static LocationService? _instance; LocationService._internal() { diff --git a/lib/app/data/services/notification_service.dart b/lib/app/data/services/notification_service.dart index 60d6dfc..9c5e0c0 100644 --- a/lib/app/data/services/notification_service.dart +++ b/lib/app/data/services/notification_service.dart @@ -37,7 +37,7 @@ class NotificationService { vibrationPattern[1] = 1000; vibrationPattern[2] = 5000; vibrationPattern[3] = 2000; - final androidPlatformChannelSpecifics = AndroidNotificationDetails( + final androidPlatformChannelSpecifics = AndroidNotificationDetails( _channelId, _channelName, channelDescription: _channelDesc, importance: Importance.max, diff --git a/lib/app/domain/entities/asmaul_husna.dart b/lib/app/domain/entities/asmaul_husna.dart index 9d7cc9e..1ee6e26 100644 --- a/lib/app/domain/entities/asmaul_husna.dart +++ b/lib/app/domain/entities/asmaul_husna.dart @@ -4,12 +4,12 @@ part 'asmaul_husna.freezed.dart'; @freezed class AsmaulHusna with _$AsmaulHusna { - const AsmaulHusna._(); - factory AsmaulHusna({ - required String arabic, - required String index, - required String latin, - required String translationEn, - required String translationId, - }) = _AsmaulHusna; + const AsmaulHusna._(); + factory AsmaulHusna({ + required String arabic, + required String index, + required String latin, + required String translationEn, + required String translationId, + }) = _AsmaulHusna; } diff --git a/lib/app/domain/entities/daily_pray.dart b/lib/app/domain/entities/daily_pray.dart index 2faae5e..46499ce 100644 --- a/lib/app/domain/entities/daily_pray.dart +++ b/lib/app/domain/entities/daily_pray.dart @@ -1,15 +1,14 @@ import 'package:freezed_annotation/freezed_annotation.dart'; part 'daily_pray.freezed.dart'; + @freezed -class DailyPray with _$DailyPray{ +class DailyPray with _$DailyPray { const DailyPray._(); - factory DailyPray( - { - required String title, - required String arabic, - required String latin, - required String translation, - } - ) = _DailyPray; -} \ No newline at end of file + factory DailyPray({ + required String title, + required String arabic, + required String latin, + required String translation, + }) = _DailyPray; +} diff --git a/lib/app/domain/repository/shalat_repository.dart b/lib/app/domain/repository/shalat_repository.dart index dfe3021..413dc15 100644 --- a/lib/app/domain/repository/shalat_repository.dart +++ b/lib/app/domain/repository/shalat_repository.dart @@ -4,5 +4,6 @@ import 'package:suji/app/domain/entities/shalat.dart'; import 'package:suji/core/utils/failure.dart'; abstract class ShalatRepository { - Future> getShalatTime(DateTime dateTime, Position position); + Future> getShalatTime( + DateTime dateTime, Position position); } diff --git a/lib/app/domain/usescases/get_ayah_by_surah_number_usecase.dart b/lib/app/domain/usescases/get_ayah_by_surah_number_usecase.dart index 2b5c837..f121119 100644 --- a/lib/app/domain/usescases/get_ayah_by_surah_number_usecase.dart +++ b/lib/app/domain/usescases/get_ayah_by_surah_number_usecase.dart @@ -6,8 +6,7 @@ import 'package:suji/core/utils/failure.dart'; class GetAyahBySurahNumberUsecase { final SurahRepository surahRepository; GetAyahBySurahNumberUsecase({required this.surahRepository}); - Future>> invoke( - int surahNumber) { + Future>> invoke(int surahNumber) { return surahRepository.getAyahBySurahNumber(surahNumber); } } diff --git a/lib/app/domain/usescases/get_shalat_time_usecase.dart b/lib/app/domain/usescases/get_shalat_time_usecase.dart index b60b8d5..fe92ff1 100644 --- a/lib/app/domain/usescases/get_shalat_time_usecase.dart +++ b/lib/app/domain/usescases/get_shalat_time_usecase.dart @@ -7,7 +7,7 @@ import 'package:suji/core/utils/failure.dart'; class GetShalatTimeUsecase { final ShalatRepository shalatRepository; GetShalatTimeUsecase({required this.shalatRepository}); - + Future> invoke(DateTime dateTime, Position position) { return shalatRepository.getShalatTime(dateTime, position); } diff --git a/lib/app/modules/asmaul_husna/bindings/asmaul_husna_binding.dart b/lib/app/modules/asmaul_husna/bindings/asmaul_husna_binding.dart index 7c6cde7..b1a1d81 100644 --- a/lib/app/modules/asmaul_husna/bindings/asmaul_husna_binding.dart +++ b/lib/app/modules/asmaul_husna/bindings/asmaul_husna_binding.dart @@ -8,6 +8,7 @@ class AsmaulHusnaBinding implements Bindings { void dependencies() { Get.lazyPut(() => AsmaulHusnaController( getAsmaulHusnaUsecase: Get.find())); - Get.lazyPut(() => GetAsmaulHusnaUsecase(surahRepository: Get.find())); + Get.lazyPut(() => + GetAsmaulHusnaUsecase(surahRepository: Get.find())); } } diff --git a/lib/app/modules/asmaul_husna/views/asmaul_husna_view.dart b/lib/app/modules/asmaul_husna/views/asmaul_husna_view.dart index 329a190..1fb7593 100644 --- a/lib/app/modules/asmaul_husna/views/asmaul_husna_view.dart +++ b/lib/app/modules/asmaul_husna/views/asmaul_husna_view.dart @@ -171,19 +171,44 @@ class AsmaulHusnaView extends GetView { } Widget _buildAsmaulHusnaError(errorMessage) { - return Center( - child: IconButton( - onPressed: () async => await controller.getAsmaulHusna(), - icon: const Icon( - Icons.replay, - size: 24.0, - ), - ), - ); - } + return Center( + child: IconButton( + onPressed: () async => await controller.getAsmaulHusna(), + icon: const Icon( + Icons.replay, + size: 24.0, + ), + ), + ); + } GridView _buildAsmaulHusnaLoading() { return GridView.builder( + padding: EdgeInsets.zero, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + childAspectRatio: 1.0, + crossAxisCount: 3, + mainAxisSpacing: 6, + crossAxisSpacing: 6, + ), + itemCount: 9, + shrinkWrap: true, + physics: const ScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return const BoxPlaceholder( + width: 64, + height: 64, + ); + }, + ); + } + + Widget _buildAsmaulHusnaSuccess(state) { + return Directionality( + textDirection: TextDirection.rtl, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GridView.builder( padding: EdgeInsets.zero, gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( childAspectRatio: 1.0, @@ -191,107 +216,82 @@ class AsmaulHusnaView extends GetView { mainAxisSpacing: 6, crossAxisSpacing: 6, ), - itemCount: 9, + itemCount: state?.length, shrinkWrap: true, physics: const ScrollPhysics(), itemBuilder: (BuildContext context, int index) { - return const BoxPlaceholder( - width: 64, - height: 64, - ); - }, - ); - } - - Widget _buildAsmaulHusnaSuccess(state) { - return Directionality( - textDirection: TextDirection.rtl, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: GridView.builder( - padding: EdgeInsets.zero, - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( - childAspectRatio: 1.0, - crossAxisCount: 3, - mainAxisSpacing: 6, - crossAxisSpacing: 6, - ), - itemCount: state?.length, - shrinkWrap: true, - physics: const ScrollPhysics(), - itemBuilder: (BuildContext context, int index) { - final asmaulHusna = state![index]; - return Stack( + final asmaulHusna = state![index]; + return Stack( + children: [ + Container( + width: double.infinity, + clipBehavior: Clip.hardEdge, + decoration: BoxDecoration( + color: AppColors.primary, + borderRadius: BorderRadius.circular(12), + boxShadow: const [ + BoxShadow( + blurRadius: 4.0, + color: Colors.black, + offset: Offset(0.0, 0.5)) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Container( - width: double.infinity, - clipBehavior: Clip.hardEdge, - decoration: BoxDecoration( - color: AppColors.primary, - borderRadius: BorderRadius.circular(12), - boxShadow: const [ - BoxShadow( - blurRadius: 4.0, - color: Colors.black, - offset: Offset(0.0, 0.5)) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - flex: 3, - child: Container( - color: Colors.grey[100], - alignment: Alignment.bottomCenter, - child: AutoSizeText( - asmaulHusna.arabic, - maxLines: 2, - textAlign: TextAlign.center, - style: Get.textTheme.displayLarge?.copyWith( - color: AppColors.primary, - ), - ), - ), - ), - Expanded( - child: Align( - alignment: Alignment.center, - child: AutoSizeText(asmaulHusna.latin, - maxLines: 2, - textAlign: TextAlign.center, - style: Get.textTheme.bodyMedium?.copyWith( - color: Colors.white, - )), - ), - ), - ], - ), - ), - Container( - padding: const EdgeInsets.all(8.0), - decoration: const BoxDecoration( - color: AppColors.primary, - borderRadius: BorderRadius.all( - Radius.circular( - 8.0, + Expanded( + flex: 3, + child: Container( + color: Colors.grey[100], + alignment: Alignment.bottomCenter, + child: AutoSizeText( + asmaulHusna.arabic, + maxLines: 2, + textAlign: TextAlign.center, + style: Get.textTheme.displayLarge?.copyWith( + color: AppColors.primary, ), ), ), - child: Text( - asmaulHusna.index, - style: const TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold, - ), + ), + Expanded( + child: Align( + alignment: Alignment.center, + child: AutoSizeText(asmaulHusna.latin, + maxLines: 2, + textAlign: TextAlign.center, + style: Get.textTheme.bodyMedium?.copyWith( + color: Colors.white, + )), ), ), ], - ); - }, - ), - ), - ); - } + ), + ), + Container( + padding: const EdgeInsets.all(8.0), + decoration: const BoxDecoration( + color: AppColors.primary, + borderRadius: BorderRadius.all( + Radius.circular( + 8.0, + ), + ), + ), + child: Text( + asmaulHusna.index, + style: const TextStyle( + fontSize: 16.0, + color: Colors.white, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ); + }, + ), + ), + ); + } } diff --git a/lib/app/modules/home/controllers/home_controller.dart b/lib/app/modules/home/controllers/home_controller.dart index 96f1781..976ea4b 100644 --- a/lib/app/modules/home/controllers/home_controller.dart +++ b/lib/app/modules/home/controllers/home_controller.dart @@ -4,7 +4,7 @@ import 'package:suji/app/domain/entities/surah.dart'; import 'package:suji/app/domain/usescases/get_all_surah_usecase.dart'; import 'package:suji/app/widgets/custom_snackbar.dart'; -class HomeController extends GetxController with StateMixin>{ +class HomeController extends GetxController with StateMixin> { final GetAllSurahUsecase getAllSurahUsecase; Box box = Hive.box('sujiSettingsBox'); @@ -23,7 +23,7 @@ class HomeController extends GetxController with StateMixin>{ String get lastRead => _lastRead.value; @override - void onInit() async{ + void onInit() async { super.onInit(); await getAllSurah(); _lastRead.value = box.get('lastRead') ?? '-'; @@ -47,7 +47,7 @@ class HomeController extends GetxController with StateMixin>{ /// get all surah Future getAllSurah() async { // _state.value = BaseState.loading; - change([], status:RxStatus.loading()); + change([], status: RxStatus.loading()); final result = await getAllSurahUsecase.invoke(); result.fold((failure) { diff --git a/lib/app/modules/lab_ui.dart b/lib/app/modules/lab_ui.dart index 4beaa8d..9f8f124 100644 --- a/lib/app/modules/lab_ui.dart +++ b/lib/app/modules/lab_ui.dart @@ -1,326 +1,226 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:suji/core/theme/colors.dart'; class Lab extends StatelessWidget { const Lab({super.key}); + // double heroItemHeight = 100; @override Widget build(BuildContext context) { return Scaffold( - resizeToAvoidBottomInset: false, - // backgroundColor: scaffoldColor, + extendBodyBehindAppBar: true, + appBar: AppBar( + title: const Text( + 'Tasbih Digital', + style: TextStyle( + color: Colors.white, + fontSize: 16.0, + ), + ), + leading: const Icon( + Icons.arrow_back_ios, + color: AppColors.background, + ), + ), body: SafeArea( child: SingleChildScrollView( child: Column( + mainAxisSize: MainAxisSize.min, children: [ Container( - width: Get.width, - decoration: const BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.all( - Radius.circular( - 8.0, - ), - ), + padding: const EdgeInsets.all(8.0), + // color: Colors.green, + child: Center( + child: Text('1', + style: Get.textTheme.displayLarge?.copyWith( + fontSize: 46.0, + )), ), - child: Stack(children: [ - SizedBox( - width: Get.width, - child: Image.asset('assets/images/salah_banner.png', - fit: BoxFit.cover), - ), - Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - decoration: const ShapeDecoration( - color: Colors.white, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.all( - Radius.circular(12.0), - ), - )), - child: IconButton( - onPressed: () {}, - icon: const Icon( - Icons.arrow_back, - size: 24.0, - // color: scaffoldColor, - )), - ), - const SizedBox( - height: 8.0, - ), - const Text( - 'Jadwal Sholat', - style: TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold), - ), - const Text( - 'Surabaya', - style: TextStyle( - fontSize: 16.0, - color: Colors.white, - fontWeight: FontWeight.bold), - ), - const SizedBox( - height: 72.0, - ), - const Center( - child: Text( - 'Shubuh 4:17 AM', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 24.0, - color: Colors.white, - fontWeight: FontWeight.bold), + ), + SizedBox( + height: 275.0, + // color: Colors.blue, + child: Stack( + fit: StackFit.expand, + alignment: Alignment.center, + children: [ + Positioned( + left: 0, + right: 0, + child: ElevatedButton( + onPressed: () {}, + style: ButtonStyle( + shadowColor: + MaterialStateProperty.all(Colors.black), + shape: MaterialStateProperty.all( + const CircleBorder( + side: BorderSide( + color: AppColors.onPrimary, + width: 2.0)))), + child: const Icon( + Icons.keyboard_arrow_up, + size: 200.0, + color: AppColors.background, ), ), - const Text( - 'Yang membedakan antara orang beriman dengan tidak beriman adalah meninggalkan salat.', - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 12.0, - fontStyle: FontStyle.italic, - color: Colors.white, + ), + Positioned( + bottom: 0, + child: ElevatedButton( + onPressed: () {}, + style: ButtonStyle( + shape: MaterialStateProperty.all( + const CircleBorder( + side: BorderSide( + color: AppColors.background, + width: 2.0)))), + child: const Icon( + Icons.keyboard_arrow_down, + color: AppColors.background, + size: 25.0, ), ), - ], - ), - ), - Positioned.fill( - child: Align( - alignment: Alignment.bottomCenter, - child: Container( - width: Get.width * .8, - height: 64.0, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(100.0), + ), + Positioned( + top: 0, + child: ElevatedButton( + onPressed: () {}, + style: ButtonStyle( + shape: MaterialStateProperty.all( + const CircleBorder( + side: BorderSide( + color: AppColors.background, + width: 2.0)))), + child: const Icon( + Icons.restart_alt, + color: AppColors.background, + size: 25.0, ), - child: const Center( - child: Text( - '30 September 2023', - style: TextStyle( - fontSize: 24.0, fontWeight: FontWeight.bold), - ), - )), - ), - ), - Positioned( - top: 8.0, - right: 8.0, - child: IconButton( - onPressed: () {}, - icon: const Icon( - Icons.notifications, - size: 48.0, - color: Colors.white, + ), ), - ), - ) - ]), + ]), ), - const SizedBox( - height: 8.0, + Flexible( + fit: FlexFit.loose, + child: Container( + margin: const EdgeInsets.only( + top: 16.0, + bottom: 16.0, + ), + child: Text( + 'Tasbih digital untuk membantu anda berdzikir setiap hari', + textAlign: TextAlign.center, + style: Get.textTheme.titleMedium), + ), ), - Column( - children: [ - Container( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - margin: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 2.0), - decoration: ShapeDecoration( - color: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.0), - )), - child: const Row( - children: [ - ImageIcon( - AssetImage( - 'assets/images/Shalat-Shubuh.png', - ), - size: 24.0, - color: Colors.white, - ), - Spacer(), - Text( - 'Shubuh', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - Spacer(), - Text( - '04:48', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ], + Flexible( + fit: FlexFit.loose, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // color: Colors.red, + margin: const EdgeInsets.only( + left: 16.0, + ), + child: Text('Target', + textAlign: TextAlign.start, + style: Get.textTheme.titleLarge), ), - ), - Container( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - margin: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 2.0), - decoration: ShapeDecoration( - color: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.0), - )), - child: const Row( - children: [ - ImageIcon( - AssetImage( - 'assets/images/Shalat-Zhuhur.png', + Container( + padding: const EdgeInsets.symmetric( + horizontal: 16, vertical: 8), + // color: Colors.orange, + child: TextFormField( + initialValue: '11', + keyboardType: + const TextInputType.numberWithOptions(signed: true), + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(12.0), + borderSide: const BorderSide( + color: Colors.black12, + ), ), - size: 24.0, - color: Colors.white, - ), - Spacer(), - Text( - 'Dzuhur', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - Spacer(), - Text( - '04:48', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), + // helperText: 'Masukkan targetmu', ), - ], + onChanged: (value) {}, + ), ), - ), - Container( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - margin: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 2.0), - decoration: ShapeDecoration( - color: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.0), - )), - child: const Row( - children: [ - ImageIcon( - AssetImage( - 'assets/images/Shalat-Ashar.png', + ], + ), + ), + Flexible( + fit: FlexFit.loose, + child: Container( + // height: 100.0, + padding: const EdgeInsets.all(8.0), + // color: Colors.red, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Container( + padding: const EdgeInsets.all(16.0), + margin: const EdgeInsets.symmetric(horizontal: 8.0), + decoration: BoxDecoration( + color: Colors.green, + borderRadius: BorderRadius.circular(12.0), ), - size: 24.0, - color: Colors.white, - ), - Spacer(), - Text( - 'Ashar', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - Spacer(), - Text( - '04:48', - style: TextStyle( - color: Colors.white, + child: const Text( + '11', + textAlign: TextAlign.center, + style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - ], - ), - ), - Container( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - margin: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 2.0), - decoration: ShapeDecoration( - color: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.0), - )), - child: const Row( - children: [ - ImageIcon( - AssetImage( - 'assets/images/Shalat-Maghrib.png', + ), ), - size: 24.0, - color: Colors.white, - ), - Spacer(), - Text( - 'Maghrib', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), - ), - Spacer(), - Text( - '04:48', - style: TextStyle( - color: Colors.white, - fontSize: 16.0, - fontWeight: FontWeight.bold), ), - ], - ), - ), - Container( - padding: const EdgeInsets.symmetric( - vertical: 16.0, horizontal: 32.0), - margin: const EdgeInsets.symmetric( - horizontal: 16.0, vertical: 2.0), - decoration: ShapeDecoration( - color: Colors.transparent, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16.0), - )), - child: const Row( - children: [ - ImageIcon( - AssetImage( - 'assets/images/Shalat-Isya.png', + ), + Expanded( + child: Container( + padding: const EdgeInsets.all(16.0), + margin: const EdgeInsets.symmetric(horizontal: 8.0), + decoration: BoxDecoration( + color: Colors.green, + borderRadius: BorderRadius.circular(12.0), ), - size: 24.0, - color: Colors.white, - ), - Spacer(), - Text( - 'Isya', - style: TextStyle( - color: Colors.white, + child: const Text( + '33', + textAlign: TextAlign.center, + style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.bold), + ), + ), ), - Spacer(), - Text( - '04:48', - style: TextStyle( - color: Colors.white, + ), + Expanded( + child: Container( + padding: const EdgeInsets.all(16.0), + margin: const EdgeInsets.symmetric(horizontal: 8.0), + decoration: BoxDecoration( + color: Colors.green, + borderRadius: BorderRadius.circular(12.0), + ), + child: const Text( + '99', + textAlign: TextAlign.center, + style: TextStyle( fontSize: 16.0, - fontWeight: FontWeight.bold), + ), + ), ), - ], - ), + ), + ], ), - ], + ), + ), + Flexible( + fit: FlexFit.loose, + child: Container( + height: 100.0, + color: Colors.green, + ), ), ], ), @@ -328,4 +228,131 @@ class Lab extends StatelessWidget { ), ); } + + // Stack _buildHeroItem() { + // return Stack( + // // fit: StackFit.expand, + // children: [ + // Container( + // height: Get.height * 0.2, + // decoration: const BoxDecoration( + // color: Colors.orange, + // ), + // ), + // Transform.translate( + // offset: const Offset(0.0, 100), + // child: Center( + // child: Container( + // width: Get.width * 0.8, + // padding: const EdgeInsets.all(8.0), + // decoration: const BoxDecoration( + // color: Colors.white, + // boxShadow: [ + // BoxShadow( + // color: Colors.black12, + // blurRadius: 16.0, + // offset: Offset(.0, 6.0)) + // ], + // borderRadius: BorderRadius.all( + // Radius.circular( + // 8.0, + // ), + // ), + // ), + // child: SingleChildScrollView( + // scrollDirection: Axis.horizontal, + // controller: ScrollController(), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // mainAxisSize: MainAxisSize.min, + // children: [ + // Container( + // width: 100, + // color: Colors.green, + // child: const Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Icon( + // Icons.photo_camera_outlined, + // size: 20.0, + // color: Colors.red, + // ), + // Text( + // 'Jadwal Shalat', + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // textAlign: TextAlign.center, + // ), + // ], + // ), + // ), + // Container( + // width: 100, + // color: Colors.green, + // child: const Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Icon( + // Icons.photo_camera_outlined, + // size: 20.0, + // color: Colors.red, + // ), + // Text( + // 'Jadwal Shalat', + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // textAlign: TextAlign.center, + // ), + // ], + // ), + // ), + // Container( + // width: 100, + // color: Colors.green, + // child: const Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Icon( + // Icons.photo_camera_outlined, + // size: 20.0, + // color: Colors.red, + // ), + // Text( + // 'Jadwal Shalat', + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // textAlign: TextAlign.center, + // ), + // ], + // ), + // ), + // Container( + // width: 100, + // color: Colors.green, + // child: const Column( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Icon( + // Icons.photo_camera_outlined, + // size: 20.0, + // color: Colors.red, + // ), + // Text( + // 'Jadwal Shalat', + // maxLines: 2, + // overflow: TextOverflow.ellipsis, + // textAlign: TextAlign.center, + // ), + // ], + // ), + // ), + // ], + // ), + // ), + // ), + // ), + // ), + // ], + // ); + // } } diff --git a/lib/app/modules/shalat/views/shalat_view.dart b/lib/app/modules/shalat/views/shalat_view.dart index 104fe72..1c4dc8c 100644 --- a/lib/app/modules/shalat/views/shalat_view.dart +++ b/lib/app/modules/shalat/views/shalat_view.dart @@ -169,18 +169,15 @@ class ShalatView extends GetView { size: 16.0, ), ), - controller.obx( - (state) { - return Text( - state?.dateReadable ?? '-', - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 24.0, fontWeight: FontWeight.bold), - ); - }, - onError: (_) => const SizedBox.shrink() - ), + controller.obx((state) { + return Text( + state?.dateReadable ?? '-', + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 24.0, fontWeight: FontWeight.bold), + ); + }, onError: (_) => const SizedBox.shrink()), IconButton( onPressed: () async => controller.nextDay(), icon: const Icon( diff --git a/lib/app/modules/surah/bindings/surah_binding.dart b/lib/app/modules/surah/bindings/surah_binding.dart index 4b8b4a6..3da66c5 100644 --- a/lib/app/modules/surah/bindings/surah_binding.dart +++ b/lib/app/modules/surah/bindings/surah_binding.dart @@ -10,9 +10,11 @@ class SurahBinding extends Bindings { @override void dependencies() { Get.lazyPut( - () => SurahController(getAyahBySurahNumberUsecase: Get.find()), + () => SurahController( + getAyahBySurahNumberUsecase: Get.find()), ); - Get.lazyPut(() => GetAyahBySurahNumberUsecase(surahRepository: Get.find())); + Get.lazyPut(() => GetAyahBySurahNumberUsecase( + surahRepository: Get.find())); Get.lazyPut( () => AudioController(connectivity: Get.find()), ); diff --git a/lib/app/modules/surah/controllers/audio_controller.dart b/lib/app/modules/surah/controllers/audio_controller.dart index e2b3111..e9e54f5 100644 --- a/lib/app/modules/surah/controllers/audio_controller.dart +++ b/lib/app/modules/surah/controllers/audio_controller.dart @@ -85,7 +85,6 @@ class AudioController extends GetxController { } } catch (e) { showErrorMessage(AppString.socketException); - } } } diff --git a/lib/app/modules/surah/controllers/surah_controller.dart b/lib/app/modules/surah/controllers/surah_controller.dart index d15aee5..af480c6 100644 --- a/lib/app/modules/surah/controllers/surah_controller.dart +++ b/lib/app/modules/surah/controllers/surah_controller.dart @@ -28,8 +28,8 @@ class SurahController extends GetxController Future getAyahBySurahNumber() async { // _state.value = BaseState.loading; change([], status: RxStatus.loading()); - final result = await - getAyahBySurahNumberUsecase.invoke(int.parse(Get.parameters['number']!)); + final result = await getAyahBySurahNumberUsecase + .invoke(int.parse(Get.parameters['number']!)); result.fold((failure) { // _message.value = failure.message; diff --git a/lib/app/modules/surah/views/surah_view.dart b/lib/app/modules/surah/views/surah_view.dart index 1e97194..afd5017 100644 --- a/lib/app/modules/surah/views/surah_view.dart +++ b/lib/app/modules/surah/views/surah_view.dart @@ -37,16 +37,14 @@ class SurahView extends GetView { actions: [ controller.obx((state) { return IconButton( - onPressed: () => - _showTafsirBottomsheet(state!.first.tafsirId), - icon: Icon( - Icons.info_outline, - size: 24.w, - color: Colors.white, - ), - ); - }, onError: (_) => const SizedBox.shrink() - ), + onPressed: () => _showTafsirBottomsheet(state!.first.tafsirId), + icon: Icon( + Icons.info_outline, + size: 24.w, + color: Colors.white, + ), + ); + }, onError: (_) => const SizedBox.shrink()), // Obx(() { // if (controller.status == RxStatus.success()) { // return IconButton( @@ -283,8 +281,7 @@ class SurahView extends GetView { IconButton( tooltip: 'Bagikan', onPressed: () { - final textAyah = - ''' + final textAyah = ''' Surah : ${ayah.nameTransliterationId} Ayah : ${ayah.versesNumberInSurah} ${ayah.versesTextArab} diff --git a/lib/app/modules/tasbih/views/tasbih_view.dart b/lib/app/modules/tasbih/views/tasbih_view.dart index 5d253c8..f84c0bc 100644 --- a/lib/app/modules/tasbih/views/tasbih_view.dart +++ b/lib/app/modules/tasbih/views/tasbih_view.dart @@ -38,9 +38,10 @@ class TasbihView extends GetView { child: Center( child: Obx(() => Text('${controller.counter}', style: Get.textTheme.displayLarge?.copyWith( - fontSize: 46.0, - color: controller.counter >= controller.target ? Colors.red : null - ))), + fontSize: 46.0, + color: controller.counter >= controller.target + ? Colors.red + : null))), ), ), _buildCounterButton(), @@ -51,7 +52,8 @@ class TasbihView extends GetView { fit: FlexFit.loose, child: Container( width: double.infinity, - decoration: const BoxDecoration(color: Colors.white, boxShadow: [ + decoration: + const BoxDecoration(color: Colors.white, boxShadow: [ BoxShadow( blurRadius: 8.0, offset: Offset(0.0, -6.0), @@ -62,8 +64,7 @@ class TasbihView extends GetView { top: 16.0, bottom: 16.0, ), - child: Text( - 'tasbih_description'.tr, + child: Text('tasbih_description'.tr, textAlign: TextAlign.center, style: Get.textTheme.titleMedium), ), @@ -149,7 +150,7 @@ class TasbihView extends GetView { ), Expanded( child: InkWell( - key: const Key('TargetButton33'), + key: const Key('TargetButton33'), onTap: () { controller.target = 33; }, @@ -177,7 +178,7 @@ class TasbihView extends GetView { ), Expanded( child: InkWell( - key: const Key('TargetButton99'), + key: const Key('TargetButton99'), onTap: () { controller.target = 99; }, @@ -409,5 +410,4 @@ class TasbihView extends GetView { // ], // ); // } - } diff --git a/lib/app/widgets/custom_snackbar.dart b/lib/app/widgets/custom_snackbar.dart index cfffd23..cd9a3b7 100644 --- a/lib/app/widgets/custom_snackbar.dart +++ b/lib/app/widgets/custom_snackbar.dart @@ -11,6 +11,7 @@ showErrorMessage(String message) { backgroundColor: AppColors.error, ); } + showSuccessMessage(String message) { Get.snackbar( 'information'.tr, diff --git a/lib/core/values/internationalization.dart b/lib/core/values/internationalization.dart index 739658d..91fb566 100644 --- a/lib/core/values/internationalization.dart +++ b/lib/core/values/internationalization.dart @@ -14,7 +14,8 @@ class Languages extends Translations { 'user': 'Moslem Brother', 'back': 'back', 'prayer_time': 'Prayer Time', - 'shalat_motivation': 'Different human who have iman between either are leaving shalat', + 'shalat_motivation': + 'Different human who have iman between either are leaving shalat', 'information': 'Information', 'alarm setup failed': 'Failed alarm setup', 'alarm setup actived': 'Alarm has been actived', @@ -22,9 +23,10 @@ class Languages extends Translations { 'daily_pray': 'Daily Pray', 'daily_pray_reminder': 'Don\'t forget to praying', 'search': 'Search', - 'last_read' : 'Last Read', + 'last_read': 'Last Read', 'goal': 'Goal', - 'tasbih_description': 'Tasbih online, making it easy to count your Dhikr. Directly from your browser, no ads, no analytics, secure privacy and completely free.', + 'tasbih_description': + 'Tasbih online, making it easy to count your Dhikr. Directly from your browser, no ads, no analytics, secure privacy and completely free.', 'audio_play_internet': 'Play Audio must be connect to internet', }, 'id': { @@ -32,7 +34,8 @@ class Languages extends Translations { 'user': 'Saudara Muslim', 'back': 'Kembali', 'prayer_time': 'Jadwal Shalat', - 'shalat_motivation': 'Yang membedakan antara orang beriman dengan tidak beriman adalah meninggalkan salat.', + 'shalat_motivation': + 'Yang membedakan antara orang beriman dengan tidak beriman adalah meninggalkan salat.', 'information': 'Informasi', 'alarm setup failed': 'Gagal menjadwalkan alarm', 'alarm setup actived': 'Alarm diaktifkan', @@ -40,10 +43,12 @@ class Languages extends Translations { 'daily_pray': 'Doa Harian', 'daily_pray_reminder': 'Jangan lupa baca doa', 'search': 'Cari', - 'last_read' : 'Terakhir Dibaca', + 'last_read': 'Terakhir Dibaca', 'goal': 'Target', - 'tasbih_description': 'Tasbih digital, mempermudah menghitung Dzikirmu. Langsung dari peramban, tanpa iklan, tanpa analitik, privasi aman dan gratis sepenuhnya', - 'audio_play_internet': 'Pastikan terhubung dengan internet untuk memutar audio', + 'tasbih_description': + 'Tasbih digital, mempermudah menghitung Dzikirmu. Langsung dari peramban, tanpa iklan, tanpa analitik, privasi aman dan gratis sepenuhnya', + 'audio_play_internet': + 'Pastikan terhubung dengan internet untuk memutar audio', }, }; -} \ No newline at end of file +} diff --git a/lib/main.dart b/lib/main.dart index d7b2f4f..903109f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,7 +22,7 @@ Future main() async { /// openBox for adzan alarm settings on [NotificationsController] final document = await getApplicationDocumentsDirectory(); Hive.init(document.path); - await Hive.openBox('alarmSettings'); + await Hive.openBox('sujiSettingsBox'); /// Initialize the background service final backgroundService = BackgroundService(); @@ -36,12 +36,13 @@ Future main() async { runApp( GetMaterialApp( translations: Languages(), - locale: Get.deviceLocale, + locale: const Locale('id'), fallbackLocale: const Locale('en', 'US'), theme: appTheme, title: 'Application', - initialRoute: AppPages.INITIAL, - // "/lab", + initialRoute: + // AppPages.INITIAL, + AppPages.menu, getPages: AppPages.routes, debugShowCheckedModeBanner: false, ), diff --git a/test/app/data/datasources/shalat_local_data_source_test.dart b/test/app/data/datasources/shalat_local_data_source_test.dart index 5aa34e3..3cd2239 100644 --- a/test/app/data/datasources/shalat_local_data_source_test.dart +++ b/test/app/data/datasources/shalat_local_data_source_test.dart @@ -46,7 +46,9 @@ void main() { expect(result, tShalat); }); - test('Should return null if the obj does not exist in [DatabaseHelper] when call is successfull', () async { + test( + 'Should return null if the obj does not exist in [DatabaseHelper] when call is successfull', + () async { // arrange when(mockDatabaseHelper.getShalatTimeByDate(tDateString)) .thenAnswer((_) async => null); @@ -60,7 +62,8 @@ void main() { expect(result, null); }); - test('Should throw [DatabaseException] when call is unsuccessfull', () async { + test('Should throw [DatabaseException] when call is unsuccessfull', + () async { // arrange when(mockDatabaseHelper.getShalatTimeByDate(tDateString)) .thenThrow(DatabaseException(AppString.databaseError)); diff --git a/test/app/data/repository/shalat_repository_impl_test.dart b/test/app/data/repository/shalat_repository_impl_test.dart index 945713b..79f494d 100644 --- a/test/app/data/repository/shalat_repository_impl_test.dart +++ b/test/app/data/repository/shalat_repository_impl_test.dart @@ -96,7 +96,8 @@ void main() { () async { // arrange when(mockShalatLocalDataSource.getShalatTime(tDateTime, tPosition)) - .thenAnswerInOrder([Future(() => null), Future(() => tShalatEntities)]); + .thenAnswerInOrder( + [Future(() => null), Future(() => tShalatEntities)]); when(mockShalatRemoteDataSource.getShalatTime(tDateTime, tPosition)) .thenAnswer((_) async => tShalatTimeResponse); when(mockShalatLocalDataSource diff --git a/test/app/data/repository/surah_repository_impl_test.dart b/test/app/data/repository/surah_repository_impl_test.dart index e1f9d30..a420182 100644 --- a/test/app/data/repository/surah_repository_impl_test.dart +++ b/test/app/data/repository/surah_repository_impl_test.dart @@ -39,7 +39,7 @@ void main() { surahRemoteDataSource: mockSurahRemoteDataSource, surahLocalDataSource: mockSurahLocalDataSource); }); - + group('Get Daily Pray', () { final tDailyPray = DataDailyPrayResponse.fromJson( json.decode(readJson('daily_pray.json'))); diff --git a/test/app/domain/usecases/get_all_surah_usecase_test.dart b/test/app/domain/usecases/get_all_surah_usecase_test.dart index 38a0dff..cadb5f8 100644 --- a/test/app/domain/usecases/get_all_surah_usecase_test.dart +++ b/test/app/domain/usecases/get_all_surah_usecase_test.dart @@ -12,22 +12,24 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late SurahRepository mockSurahRepository; late GetAllSurahUsecase getAllSurahUsecase; setUp(() { mockSurahRepository = MockSurahRepository(); - getAllSurahUsecase = GetAllSurahUsecase(surahRepository: mockSurahRepository); + getAllSurahUsecase = + GetAllSurahUsecase(surahRepository: mockSurahRepository); }); group('Get All Surah Test', () { final ListSurah tSurahResponse = ListSurah.fromJson(json.decode(readJson('list_surah_response.json'))); final tSurahEntities = tSurahResponse.toEntity(); - test('Should return all surah when call is successful', () async{ + test('Should return all surah when call is successful', () async { // arrange - when(mockSurahRepository.getAllSurah()).thenAnswer((_) async => right(tSurahEntities)); + when(mockSurahRepository.getAllSurah()) + .thenAnswer((_) async => right(tSurahEntities)); //act final result = await getAllSurahUsecase.invoke(); @@ -37,9 +39,11 @@ void main(){ expect(result, equals(right(tSurahEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAllSurah()).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockSurahRepository.getAllSurah()).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act final result = await getAllSurahUsecase.invoke(); @@ -47,11 +51,14 @@ void main(){ // assert verify(mockSurahRepository.getAllSurah()); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - test('Should return [ServerFailure] when call from remote is unsuccessful', () async{ + test('Should return [ServerFailure] when call from remote is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAllSurah()).thenAnswer((_) async => left(const ServerFailure(AppString.socketException))); + when(mockSurahRepository.getAllSurah()).thenAnswer( + (_) async => left(const ServerFailure(AppString.socketException))); //act final result = await getAllSurahUsecase.invoke(); @@ -59,11 +66,15 @@ void main(){ // assert verify(mockSurahRepository.getAllSurah()); - expect(result, equals(left(const ServerFailure(AppString.socketException)))); + expect( + result, equals(left(const ServerFailure(AppString.socketException)))); }); - test('Should return [ConnectionFailure] when device not connected to internet', () async{ + test( + 'Should return [ConnectionFailure] when device not connected to internet', + () async { // arrange - when(mockSurahRepository.getAllSurah()).thenAnswer((_) async => left(const ConnectionFailure(AppString.socketException))); + when(mockSurahRepository.getAllSurah()).thenAnswer((_) async => + left(const ConnectionFailure(AppString.socketException))); //act final result = await getAllSurahUsecase.invoke(); @@ -71,7 +82,8 @@ void main(){ // assert verify(mockSurahRepository.getAllSurah()); - expect(result, equals(left(const ConnectionFailure(AppString.socketException)))); + expect(result, + equals(left(const ConnectionFailure(AppString.socketException)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/domain/usecases/get_asmaul_husna_usecase_test.dart b/test/app/domain/usecases/get_asmaul_husna_usecase_test.dart index 36ec73f..25b8fbd 100644 --- a/test/app/domain/usecases/get_asmaul_husna_usecase_test.dart +++ b/test/app/domain/usecases/get_asmaul_husna_usecase_test.dart @@ -12,22 +12,24 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late SurahRepository mockSurahRepository; late GetAsmaulHusnaUsecase getAsmaulHusnaUsecase; setUp(() { mockSurahRepository = MockSurahRepository(); - getAsmaulHusnaUsecase = GetAsmaulHusnaUsecase(surahRepository: mockSurahRepository); + getAsmaulHusnaUsecase = + GetAsmaulHusnaUsecase(surahRepository: mockSurahRepository); }); group('Get Asmaul Husna Test', () { - final tAsmaulHusnaResponse = AsmaulHusnaResponse.fromJson( + final tAsmaulHusnaResponse = AsmaulHusnaResponse.fromJson( json.decode(readJson('asmaul_husna.json'))); final tAsmaulHusnaEntities = tAsmaulHusnaResponse.toEntity(); - test('Should return all surah when call is successful', () async{ + test('Should return all surah when call is successful', () async { // arrange - when(mockSurahRepository.getAsmaulHusna()).thenAnswer((_) async => right(tAsmaulHusnaEntities)); + when(mockSurahRepository.getAsmaulHusna()) + .thenAnswer((_) async => right(tAsmaulHusnaEntities)); //act final result = await getAsmaulHusnaUsecase.invoke(); @@ -37,9 +39,11 @@ void main(){ expect(result, equals(right(tAsmaulHusnaEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAsmaulHusna()).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockSurahRepository.getAsmaulHusna()).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act final result = await getAsmaulHusnaUsecase.invoke(); @@ -47,7 +51,8 @@ void main(){ // assert verify(mockSurahRepository.getAsmaulHusna()); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/domain/usecases/get_ayah_by_surah_number_usecase_test.dart b/test/app/domain/usecases/get_ayah_by_surah_number_usecase_test.dart index 8be2e98..ba1774b 100644 --- a/test/app/domain/usecases/get_ayah_by_surah_number_usecase_test.dart +++ b/test/app/domain/usecases/get_ayah_by_surah_number_usecase_test.dart @@ -12,23 +12,26 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late SurahRepository mockSurahRepository; late GetAyahBySurahNumberUsecase getAyahBySurahNumberUsecase; setUp(() { mockSurahRepository = MockSurahRepository(); - getAyahBySurahNumberUsecase = GetAyahBySurahNumberUsecase(surahRepository: mockSurahRepository); + getAyahBySurahNumberUsecase = + GetAyahBySurahNumberUsecase(surahRepository: mockSurahRepository); }); group('Get Ayah by SurahNumber Test', () { final SurahDetailResponse tSurahDetailResponse = - SurahDetailResponse.fromJson(json.decode(readJson('surah_detail_response.json'))); + SurahDetailResponse.fromJson( + json.decode(readJson('surah_detail_response.json'))); final tSurahDetailEntities = tSurahDetailResponse.toEntity(); final surahNumber = tSurahDetailEntities.first.number; - test('Should return all ayah when call is successful', () async{ + test('Should return all ayah when call is successful', () async { // arrange - when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer((_) async => right(tSurahDetailEntities)); + when(mockSurahRepository.getAyahBySurahNumber(surahNumber)) + .thenAnswer((_) async => right(tSurahDetailEntities)); //act final result = await getAyahBySurahNumberUsecase.invoke(surahNumber); @@ -38,9 +41,11 @@ void main(){ expect(result, equals(right(tSurahDetailEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act final result = await getAyahBySurahNumberUsecase.invoke(surahNumber); @@ -48,11 +53,14 @@ void main(){ // assert verify(mockSurahRepository.getAyahBySurahNumber(surahNumber)); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - test('Should return [ServerFailure] when call from remote is unsuccessful', () async{ + test('Should return [ServerFailure] when call from remote is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer((_) async => left(const ServerFailure(AppString.databaseError))); + when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer( + (_) async => left(const ServerFailure(AppString.databaseError))); //act final result = await getAyahBySurahNumberUsecase.invoke(surahNumber); @@ -60,11 +68,15 @@ void main(){ // assert verify(mockSurahRepository.getAyahBySurahNumber(surahNumber)); - expect(result, equals(left(const ServerFailure(AppString.databaseError)))); + expect( + result, equals(left(const ServerFailure(AppString.databaseError)))); }); - test('Should return [ConnectionFailure] when call from remote is unsuccessful', () async{ + test( + 'Should return [ConnectionFailure] when call from remote is unsuccessful', + () async { // arrange - when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer((_) async => left(const ConnectionFailure(AppString.databaseError))); + when(mockSurahRepository.getAyahBySurahNumber(surahNumber)).thenAnswer( + (_) async => left(const ConnectionFailure(AppString.databaseError))); //act final result = await getAyahBySurahNumberUsecase.invoke(surahNumber); @@ -72,7 +84,8 @@ void main(){ // assert verify(mockSurahRepository.getAyahBySurahNumber(surahNumber)); - expect(result, equals(left(const ConnectionFailure(AppString.databaseError)))); + expect(result, + equals(left(const ConnectionFailure(AppString.databaseError)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/domain/usecases/get_daily_pray_usecase_test.dart b/test/app/domain/usecases/get_daily_pray_usecase_test.dart index 9621d43..27727fb 100644 --- a/test/app/domain/usecases/get_daily_pray_usecase_test.dart +++ b/test/app/domain/usecases/get_daily_pray_usecase_test.dart @@ -12,22 +12,24 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late SurahRepository mockSurahRepository; late GetDailyPrayUsecase getDailyPrayUsecase; setUp(() { mockSurahRepository = MockSurahRepository(); - getDailyPrayUsecase = GetDailyPrayUsecase(surahRepository: mockSurahRepository); + getDailyPrayUsecase = + GetDailyPrayUsecase(surahRepository: mockSurahRepository); }); group('Get Daily Pray Test', () { final tDailyPray = DataDailyPrayResponse.fromJson( json.decode(readJson('daily_pray.json'))); final tDailyPrayEntities = tDailyPray.toEntity(); - test('Should return all daily pray when call is successful', () async{ + test('Should return all daily pray when call is successful', () async { // arrange - when(mockSurahRepository.getDailyPray()).thenAnswer((_) async => right(tDailyPrayEntities)); + when(mockSurahRepository.getDailyPray()) + .thenAnswer((_) async => right(tDailyPrayEntities)); //act final result = await getDailyPrayUsecase.invoke(); @@ -37,9 +39,11 @@ void main(){ expect(result, equals(right(tDailyPrayEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockSurahRepository.getDailyPray()).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockSurahRepository.getDailyPray()).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act final result = await getDailyPrayUsecase.invoke(); @@ -47,7 +51,8 @@ void main(){ // assert verify(mockSurahRepository.getDailyPray()); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/domain/usecases/get_shalat_time_usecase_test.dart b/test/app/domain/usecases/get_shalat_time_usecase_test.dart index 60116c3..89d63b9 100644 --- a/test/app/domain/usecases/get_shalat_time_usecase_test.dart +++ b/test/app/domain/usecases/get_shalat_time_usecase_test.dart @@ -14,13 +14,14 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late ShalatRepository mockShalatRepository; late GetShalatTimeUsecase getShalatTimeUsecase; setUp(() { mockShalatRepository = MockShalatRepository(); - getShalatTimeUsecase = GetShalatTimeUsecase(shalatRepository: mockShalatRepository); + getShalatTimeUsecase = + GetShalatTimeUsecase(shalatRepository: mockShalatRepository); }); group('Get Shalat Time Test', () { @@ -38,53 +39,65 @@ void main(){ ShalatTimeResponse.fromJson(json.decode(readJson('shalah_time.json'))); final Shalat tShalatEntities = tShalatTimeResponse.toEntity().first; - test('Should return data shalat when call is successful', () async{ + test('Should return data shalat when call is successful', () async { // arrange - when(mockShalatRepository.getShalatTime(tDateTime,tPosition)).thenAnswer((_) async => right(tShalatEntities)); + when(mockShalatRepository.getShalatTime(tDateTime, tPosition)) + .thenAnswer((_) async => right(tShalatEntities)); //act - final result = await getShalatTimeUsecase.invoke(tDateTime,tPosition); + final result = await getShalatTimeUsecase.invoke(tDateTime, tPosition); // assert - verify(mockShalatRepository.getShalatTime(tDateTime,tPosition)); + verify(mockShalatRepository.getShalatTime(tDateTime, tPosition)); expect(result, equals(right(tShalatEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockShalatRepository.getShalatTime(tDateTime,tPosition)).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockShalatRepository.getShalatTime(tDateTime, tPosition)).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act - final result = await getShalatTimeUsecase.invoke(tDateTime,tPosition); + final result = await getShalatTimeUsecase.invoke(tDateTime, tPosition); // assert - verify(mockShalatRepository.getShalatTime(tDateTime,tPosition)); + verify(mockShalatRepository.getShalatTime(tDateTime, tPosition)); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - test('Should return [ServerFailure] when call from remote is unsuccessful', () async{ + test('Should return [ServerFailure] when call from remote is unsuccessful', + () async { // arrange - when(mockShalatRepository.getShalatTime(tDateTime,tPosition)).thenAnswer((_) async => left(const ServerFailure(AppString.socketException))); + when(mockShalatRepository.getShalatTime(tDateTime, tPosition)).thenAnswer( + (_) async => left(const ServerFailure(AppString.socketException))); //act - final result = await getShalatTimeUsecase.invoke(tDateTime,tPosition); + final result = await getShalatTimeUsecase.invoke(tDateTime, tPosition); // assert - verify(mockShalatRepository.getShalatTime(tDateTime,tPosition)); + verify(mockShalatRepository.getShalatTime(tDateTime, tPosition)); - expect(result, equals(left(const ServerFailure(AppString.socketException)))); + expect( + result, equals(left(const ServerFailure(AppString.socketException)))); }); - test('Should return [ConnectionFailure] when device not connected to internet', () async{ + test( + 'Should return [ConnectionFailure] when device not connected to internet', + () async { // arrange - when(mockShalatRepository.getShalatTime(tDateTime,tPosition)).thenAnswer((_) async => left(const ConnectionFailure(AppString.socketException))); + when(mockShalatRepository.getShalatTime(tDateTime, tPosition)).thenAnswer( + (_) async => + left(const ConnectionFailure(AppString.socketException))); //act - final result = await getShalatTimeUsecase.invoke(tDateTime,tPosition); + final result = await getShalatTimeUsecase.invoke(tDateTime, tPosition); // assert - verify(mockShalatRepository.getShalatTime(tDateTime,tPosition)); + verify(mockShalatRepository.getShalatTime(tDateTime, tPosition)); - expect(result, equals(left(const ConnectionFailure(AppString.socketException)))); + expect(result, + equals(left(const ConnectionFailure(AppString.socketException)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/domain/usecases/get_surah_by_query_usecase_test.dart b/test/app/domain/usecases/get_surah_by_query_usecase_test.dart index 6542246..902c76d 100644 --- a/test/app/domain/usecases/get_surah_by_query_usecase_test.dart +++ b/test/app/domain/usecases/get_surah_by_query_usecase_test.dart @@ -12,13 +12,14 @@ import 'package:suji/core/values/constant.dart'; import '../../../helper/test_helper.mocks.dart'; import '../../../json_reader.dart'; -void main(){ +void main() { late SurahRepository mockSurahRepository; late GetSurahByQueryUsecase getSurahByQueryUsecase; setUp(() { mockSurahRepository = MockSurahRepository(); - getSurahByQueryUsecase = GetSurahByQueryUsecase(surahRepository: mockSurahRepository); + getSurahByQueryUsecase = + GetSurahByQueryUsecase(surahRepository: mockSurahRepository); }); group('Get Surah by Query Test', () { @@ -26,9 +27,11 @@ void main(){ ListSurah.fromJson(json.decode(readJson('list_surah_response.json'))); final tSurahEntities = tSurahResponse.toEntity(); final query = tSurahEntities.first.nameTransliterationId; - test('Should return all surah which matches query when call is successful', () async{ + test('Should return all surah which matches query when call is successful', + () async { // arrange - when(mockSurahRepository.getSurahByQuery(query)).thenAnswer((_) async => right(tSurahEntities)); + when(mockSurahRepository.getSurahByQuery(query)) + .thenAnswer((_) async => right(tSurahEntities)); //act final result = await getSurahByQueryUsecase.invoke(query); @@ -38,9 +41,11 @@ void main(){ expect(result, equals(right(tSurahEntities))); }); - test('Should return [DatabaseFailure] when call from local is unsuccessful', () async{ + test('Should return [DatabaseFailure] when call from local is unsuccessful', + () async { // arrange - when(mockSurahRepository.getSurahByQuery(query)).thenAnswer((_) async => left(const DatabaseFailure(AppString.databaseError))); + when(mockSurahRepository.getSurahByQuery(query)).thenAnswer( + (_) async => left(const DatabaseFailure(AppString.databaseError))); //act final result = await getSurahByQueryUsecase.invoke(query); @@ -48,7 +53,8 @@ void main(){ // assert verify(mockSurahRepository.getSurahByQuery(query)); - expect(result, equals(left(const DatabaseFailure(AppString.databaseError)))); + expect( + result, equals(left(const DatabaseFailure(AppString.databaseError)))); }); - }); -} \ No newline at end of file + }); +} diff --git a/test/app/modules/asmaul_husna/controllers/asmaul_husna_controller_test.dart b/test/app/modules/asmaul_husna/controllers/asmaul_husna_controller_test.dart new file mode 100644 index 0000000..4f20b90 --- /dev/null +++ b/test/app/modules/asmaul_husna/controllers/asmaul_husna_controller_test.dart @@ -0,0 +1,41 @@ +import 'dart:convert'; + +import 'package:dartz/dartz.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:mockito/mockito.dart'; +import 'package:suji/app/data/model/asmaul_husna_response.dart'; +import 'package:suji/app/domain/repository/surah_repository.dart'; +import 'package:suji/app/domain/usescases/get_asmaul_husna_usecase.dart'; +import 'package:suji/app/modules/asmaul_husna/controllers/asmaul_husna_controller.dart'; + +import '../../../../helper/test_helper.mocks.dart'; +import '../../../../json_reader.dart'; + +void main() { + late GetAsmaulHusnaUsecase mockGetAsmaulHusnaUsecase; + late AsmaulHusnaController asmaulHusnaController; + final tAsmaulHusnaResponse = + AsmaulHusnaResponse.fromJson(json.decode(readJson('asmaul_husna.json'))); + final tAsmaulHusnaEntities = tAsmaulHusnaResponse.toEntity(); + setUpAll(() { + mockGetAsmaulHusnaUsecase = MockGetAsmaulHusnaUsecase(); + asmaulHusnaController = + AsmaulHusnaController(getAsmaulHusnaUsecase: mockGetAsmaulHusnaUsecase); + }); + + test('initialize Asmaul Husna Controller', () async { + // arrange + when(mockGetAsmaulHusnaUsecase.invoke()) + .thenAnswer((_) async => Right(tAsmaulHusnaEntities)); + + // act + Get.put(asmaulHusnaController); + + // verify + verify(mockGetAsmaulHusnaUsecase.invoke()); + + expect(asmaulHusnaController.status.isLoading, true); + Get.delete(); + }); +} diff --git a/test/app/modules/asmaul_husna/views/asmaul_husna_view_test.dart b/test/app/modules/asmaul_husna/views/asmaul_husna_view_test.dart new file mode 100644 index 0000000..a690496 --- /dev/null +++ b/test/app/modules/asmaul_husna/views/asmaul_husna_view_test.dart @@ -0,0 +1,43 @@ +// import 'dart:convert'; + +// import 'package:dartz/dartz.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:get/get.dart'; +// import 'package:mockito/mockito.dart'; +// import 'package:suji/app/data/model/asmaul_husna_response.dart'; +// import 'package:suji/app/domain/usescases/get_asmaul_husna_usecase.dart'; +// import 'package:suji/app/modules/asmaul_husna/controllers/asmaul_husna_controller.dart'; +// import 'package:suji/app/modules/asmaul_husna/views/asmaul_husna_view.dart'; + +// import '../../../../helper/test_helper.mocks.dart'; +// import '../../../../json_reader.dart'; + +// void main() { +// // late AsmaulHusnaController asmaulHusnaController; +// late GetAsmaulHusnaUsecase mockGetAsmaulHusnaUsecase; +// final tAsmaulHusnaResponse = AsmaulHusnaResponse.fromJson( +// json.decode(readJson('asmaul_husna.json'))); +// final tAsmaulHusnaEntities = tAsmaulHusnaResponse.toEntity(); +// const asmaulHusnaView = GetMaterialApp( +// home: AsmaulHusnaView(), +// ); + +// setUp(() { +// Get.testMode = true; +// mockGetAsmaulHusnaUsecase = MockGetAsmaulHusnaUsecase(); +// Get.put(AsmaulHusnaController(getAsmaulHusnaUsecase: mockGetAsmaulHusnaUsecase)); +// }); +// tearDown(() { +// // Get.delete(); +// Get.reset(); +// }); + +// testWidgets('initial state of asmaulHusnaView', (widgetTester) async { +// // arrange +// when(mockGetAsmaulHusnaUsecase.invoke()).thenAnswer((_)async=> right(tAsmaulHusnaEntities)); + +// await widgetTester.pumpWidget(asmaulHusnaView); +// final asmaulHusnaText = find.text(tAsmaulHusnaEntities.first.latin); +// expect(asmaulHusnaText, findsOneWidget); +// }); +// } diff --git a/test/app/modules/tasbih/controllers/tasbih_controller_test.dart b/test/app/modules/tasbih/controllers/tasbih_controller_test.dart new file mode 100644 index 0000000..1dbb936 --- /dev/null +++ b/test/app/modules/tasbih/controllers/tasbih_controller_test.dart @@ -0,0 +1,61 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:suji/app/modules/tasbih/controllers/tasbih_controller.dart'; + +void main() { + late TasbihController tasbihController; + + setUp(() { + tasbihController = TasbihController(); + }); + tearDown(() => Get.reset()); + group('Tasbih Controller', () { + const int initialCounter = 0; + const int initialTarget = 11; + test('initial test Tasbih Controller', () { + expect(tasbihController.counter, initialCounter); + expect(tasbihController.target, initialTarget); + expect(tasbihController.textEditingController.text, isEmpty); + + Get.put(tasbihController); + expect(tasbihController.textEditingController.text, isNotEmpty); + + Get.delete(); + }); + test('Should increase counter when counter is lower than target', () { + Get.put(tasbihController); + for (int i = 0; i <= initialTarget; i++) { + expect(tasbihController.counter, i); + tasbihController.counter++; + } + expect(tasbihController.counter, initialTarget); + Get.delete(); + }); + test( + 'Should return 0 if value of counter lower than zero when decrease counter tap', + () { + Get.put(tasbihController); + tasbihController.counter--; + expect(tasbihController.counter, 0); + Get.delete(); + }); + + test('Should change the value of target', () { + Get.put(tasbihController); + tasbihController.target = 33; + expect(tasbihController.target, 33); + expect(tasbihController.textEditingController.text, '33'); + Get.delete(); + }); + + test( + 'Should change the value of target when call onChanged from [TextFormField]', + () { + Get.put(tasbihController); + tasbihController.onChangedTextField(''); + expect(tasbihController.target, 0); + expect(tasbihController.textEditingController.text, '0'); + Get.delete(); + }); + }); +} diff --git a/test/app/modules/tasbih/views/tasbih_view_test.dart b/test/app/modules/tasbih/views/tasbih_view_test.dart new file mode 100644 index 0000000..2347d01 --- /dev/null +++ b/test/app/modules/tasbih/views/tasbih_view_test.dart @@ -0,0 +1,84 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get/get.dart'; +import 'package:mockito/mockito.dart'; +import 'package:suji/app/modules/tasbih/controllers/tasbih_controller.dart'; +import 'package:suji/app/modules/tasbih/views/tasbih_view.dart'; + +class TasbihControllerMock extends GetxController + with Mock + implements TasbihController { + @override + TextEditingController get textEditingController => TextEditingController(); +} + +void main() { + late TasbihController tasbihController; + const tasbihView = GetMaterialApp( + home: TasbihView(), + ); + + setUp(() { + tasbihController = Get.put(TasbihController()); + }); + tearDown(() { + Get.delete(); + }); + testWidgets('initial state of TasbihView', (widgetTester) async { + await widgetTester.pumpWidget(tasbihView); + final counter = find.text('0'); + expect(counter, findsOneWidget); + }); + testWidgets('Should increase counter', (widgetTester) async { + // act + await widgetTester.pumpWidget(tasbihView); + final counterButton = find.byKey(const Key('IncreaseButton')); + await widgetTester.tap(counterButton); + await widgetTester.pump(); + final counter = find.text('1'); + + // assert + expect(counterButton, findsOneWidget); + expect(counter, findsOneWidget); + }); + + testWidgets('Should decrease counter', (widgetTester) async { + // act + await widgetTester.pumpWidget(tasbihView); + final counterButton = find.byKey(const Key('DecreaseButton')); + await widgetTester.tap(counterButton); + await widgetTester.pump(); + final counter = find.text('0'); + + // assert + expect(counterButton, findsOneWidget); + expect(counter, findsOneWidget); + }); + + testWidgets('Should reset counter', (widgetTester) async { + // act + await widgetTester.pumpWidget(tasbihView); + final counterButton = find.byKey(const Key('ResetButton')); + await widgetTester.tap(counterButton); + await widgetTester.pump(); + final counter = find.text('0'); + + // assert + expect(counterButton, findsOneWidget); + expect(counter, findsOneWidget); + }); + testWidgets('Should change target by selected button', (widgetTester) async { + // act + await widgetTester.pumpWidget(tasbihView); + final targetButton = find.byKey(const Key('TargetButton99')); + await widgetTester.tap(targetButton); + await widgetTester.pump(); + final target = find.text('99'); + + // assert + expect(targetButton, findsOneWidget); + expect(target, findsNWidgets(2)); + expect(tasbihController.target, 99); + expect(tasbihController.textEditingController.text, '99'); + }); +} diff --git a/test/helper/test_helper.dart b/test/helper/test_helper.dart index 8aad3f8..2db1ba0 100644 --- a/test/helper/test_helper.dart +++ b/test/helper/test_helper.dart @@ -23,4 +23,4 @@ import 'package:suji/app/domain/usescases/get_asmaul_husna_usecase.dart'; // Domain GetAsmaulHusnaUsecase ]) -void main() {} \ No newline at end of file +void main() {} diff --git a/test/json_reader.dart b/test/json_reader.dart index 85025df..055cb99 100644 --- a/test/json_reader.dart +++ b/test/json_reader.dart @@ -6,4 +6,4 @@ String readJson(String name) { dir = dir.replaceAll('/test', ''); } return File('$dir/assets/model/$name').readAsStringSync(); -} \ No newline at end of file +} diff --git a/test/widget_test.dart b/test/widget_test.dart deleted file mode 100644 index e69de29..0000000