diff --git a/assets/icons/cancel.svg b/assets/icons/cancel.svg new file mode 100644 index 0000000..d380bd7 --- /dev/null +++ b/assets/icons/cancel.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart index 06814cb..056d287 100644 --- a/lib/api/tangheem_user_api_client.dart +++ b/lib/api/tangheem_user_api_client.dart @@ -29,6 +29,18 @@ class TangheemUserApiClient { return await ApiClient().postJsonForObject((json) => AyatTangheemTypeMapped.fromJson(json), url, postParams); } + Future getAyaByFilter(int surahID, int ayahFrom, int ayahTo) async { + String url = "${ApiConsts.tangheemUsers}AyatByRange_Get"; + var postParams = {"surahID": surahID, "ayahFrom": ayahFrom, "ayahTo": ayahTo}; + return await ApiClient().postJsonForObject((json) => AyaModel.fromJson(json), url, postParams); + } + + Future getQuranByPageNo(int pageNo) async { + String url = "${ApiConsts.tangheemUsers}Quran_Get"; + var postParams = {"pageNo": pageNo}; + return await ApiClient().postJsonForObject((json) => AyaModel.fromJson(json), url, postParams); + } + Future getAyaByRange(int itemsPerPage, int currentPageNo, int surahID, int ayahFrom, int ayahTo) async { String url = "${ApiConsts.tangheemUsers}AyatByRange_Get"; var postParams = {"itemsPerPage": itemsPerPage, "currentPageNo": currentPageNo, "surahID": surahID, "ayahFrom": ayahFrom, "ayahTo": ayahTo}; diff --git a/lib/models/surah_model.dart b/lib/models/surah_model.dart index 4fb54b6..ffb364f 100644 --- a/lib/models/surah_model.dart +++ b/lib/models/surah_model.dart @@ -1,7 +1,7 @@ class SurahModel { int totalItemsCount; int statusCode; - String message; + Null message; List data; SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data}); @@ -39,6 +39,8 @@ class SurahModelData { String englishNameTranslation; int revelationID; String revelationType; + int startPageNo; + int endPageNo; SurahModelData( {this.id, @@ -48,7 +50,9 @@ class SurahModelData { this.numberOfAyahs, this.englishNameTranslation, this.revelationID, - this.revelationType}); + this.revelationType, + this.startPageNo, + this.endPageNo}); SurahModelData.fromJson(Map json) { id = json['id']; @@ -59,6 +63,8 @@ class SurahModelData { englishNameTranslation = json['englishNameTranslation']; revelationID = json['revelation_ID']; revelationType = json['revelationType']; + startPageNo = json['startPageNo']; + endPageNo = json['endPageNo']; } Map toJson() { @@ -71,6 +77,8 @@ class SurahModelData { data['englishNameTranslation'] = this.englishNameTranslation; data['revelation_ID'] = this.revelationID; data['revelationType'] = this.revelationType; + data['startPageNo'] = this.startPageNo; + data['endPageNo'] = this.endPageNo; return data; } } diff --git a/lib/ui/screens/quran_screen.dart b/lib/ui/screens/quran_screen.dart index 2767712..4c7b034 100644 --- a/lib/ui/screens/quran_screen.dart +++ b/lib/ui/screens/quran_screen.dart @@ -31,10 +31,11 @@ class QuranScreen extends StatefulWidget { class _QuranScreenState extends State { GlobalKey _globalKey = GlobalKey(); - int _selectedSurah = 0; - int _selectedFromAya = 0; - int _selectedToAya = 0; + int _selectedSurah = -1; + int _selectedFromAya = -1; + int _selectedToAya = -1; + int _currentSurahIndex = -1; int _currentPage = 0; int _ayaInPage = 5; List _surahList = []; @@ -63,12 +64,15 @@ class _QuranScreenState extends State { _surahModel = widget.surahModel; } _surahList = _surahModel.data.map((element) => element.nameAR).toList(); - filterData(); + + //filterData(); } catch (ex, tr) { Utils.handleException(ex, null); } finally { Utils.hideLoading(context); } + setState(() {}); + getQuranByPageNo(); } int numberOfAyah = 0; @@ -77,10 +81,11 @@ class _QuranScreenState extends State { var filteredAyahList = List.generate(getNextMultiple(numberOfAyah), (index) => index + 1).toList().where((element) => element == 1 || (element % 5) == 0).toList() ?? []; _fromAyaList = filteredAyahList.getRange(0, filteredAyahList.length - 1)?.toList() ?? []; _toAyaList = filteredAyahList.getRange(1, filteredAyahList.length)?.toList() ?? []; - _currentPage = 0; - _selectedFromAya = 0; - _selectedToAya = 0; - getTangheemBySurahId(); + // _currentPage = 0; + // _selectedFromAya = 0; + // _selectedToAya = 0; + setState(() {}); + //getTangheemBySurahId(); } void getTangheemBySurahId() async { @@ -93,13 +98,28 @@ class _QuranScreenState extends State { } finally { Utils.hideLoading(context); } - getAyaByRange(); + setState(() {}); + //getAyaByRange(); } void getAyaByRange() async { Utils.showLoading(context); try { - _ayaModel = await TangheemUserApiClient().getAyaByRange(_ayaInPage, 1, _selectedSurah + 1, _fromAyaList[_selectedFromAya], _toAyaList[_selectedToAya]); + _ayaModel = await TangheemUserApiClient().getAyaByFilter(_selectedSurah + 1, _fromAyaList[_selectedFromAya], _toAyaList[_selectedToAya]); + setState(() {}); + } catch (ex, tr) { + Utils.handleException(ex, null); + } finally { + Utils.hideLoading(context); + } + scrollToId.animateTo("$_currentPage", duration: Duration(milliseconds: 300), curve: Curves.ease); + } + + void getQuranByPageNo() async { + Utils.showLoading(context); + try { + // _currentPage = 603; + _ayaModel = await TangheemUserApiClient().getQuranByPageNo(_currentPage + 1); setState(() {}); } catch (ex, tr) { Utils.handleException(ex, null); @@ -124,9 +144,41 @@ class _QuranScreenState extends State { final ScrollController scrollController = ScrollController(); ScrollToId scrollToId; + String getBismillahWithSurahName(String _surahName, bool isShowBismillah, bool isFirstIsAya) { + if (isFirstIsAya && isShowBismillah) { + return "" + _surahName + "\n بِسۡمِ ٱللَّهِ ٱلرَّحۡمَٰنِ ٱلرَّحِيمِ \n"; + } else if (isShowBismillah) { + return "\n" + _surahName + "\n بِسۡمِ ٱللَّهِ ٱلرَّحۡمَٰنِ ٱلرَّحِيمِ \n"; + } + return "" + _surahName + "\n"; + } + + String getNotNullValue(List list, int index) { + try { + return list[index]; + } catch (ex) { + return ""; + } + } + @override Widget build(BuildContext context) { - String _surahAya = _ayaModel?.data?.map((e) => e.ayahText)?.toList()?.fold("", (value, element) => value + element) ?? ""; + var tempList = _ayaModel?.data?.map((e) => e.surahNameEN)?.toList()?.toSet()?.toList() ?? []; + + String _surahName = ""; + _surahName = tempList.isEmpty ? "" : tempList?.last ?? ""; + int index = _surahList.indexWhere((element) => element == _surahName); + if (index != null) { + _currentSurahIndex = index; + } + + String _surahAya = ""; + + _ayaModel?.data?.forEach((element) { + var temp = element.numberInSurah == 1 ? getBismillahWithSurahName(element.surahNameEN, element.surahID != 1, _surahAya.length <= 1) + element.ayahText : element.ayahText; + _surahAya = _surahAya + temp; + }); + return Container( padding: EdgeInsets.fromLTRB(16, 24, 16, 0), width: double.infinity, @@ -141,181 +193,249 @@ class _QuranScreenState extends State { Row( children: [ Expanded( - child: CommonDropDownButton(_selectedSurah, list: _surahList, onSelect: (index) { + child: CommonDropDownButton(_selectedSurah, hintText: "السورة", list: _surahList, onSelect: (index) { if (_selectedSurah != index) { _selectedSurah = index; - _selectedToAya = 0; - _selectedFromAya = 0; + _selectedToAya = -1; + _selectedFromAya = -1; filterData(); } }), ), SizedBox(width: 4), Expanded( - child: CommonDropDownButton(_selectedFromAya, list: _fromAyaList.map((e) => "من الاية" + " $e").toList(), onSelect: (index) { + child: CommonDropDownButton(_selectedFromAya, hintText: "من الاية", list: _fromAyaList.map((e) => "من الاية" + " $e").toList(), onSelect: (index) { if (_selectedFromAya != index) { _selectedFromAya = index; - _selectedToAya = index; - _currentPage = index; - getAyaByRange(); + setState(() {}); + + /// _selectedToAya = index; + // _currentPage = index; + // getAyaByRange(); } }), ), SizedBox(width: 4), Expanded( - child: CommonDropDownButton(_selectedToAya, list: _toAyaList.map((e) => "الى الاية" + " $e").toList(), onSelect: (index) { + child: CommonDropDownButton(_selectedToAya, hintText: "الى الاية", list: _toAyaList.map((e) => "الى الاية" + " $e").toList(), onSelect: (index) { if (_selectedToAya != index) { _selectedToAya = index; - _currentPage = index; - getAyaByRange(); + setState(() {}); + // _currentPage = index; + // getAyaByRange(); } }), ), ], ), + SizedBox(height: 8), + Row( + children: [ + commonIconButton("ابدأ البحث", "assets/icons/go_forward.svg", () { + if (_selectedSurah < 0) { + Utils.showToast("الرجاء اختيار السورة"); + return; + } + if (_selectedFromAya < 0) { + Utils.showToast("لم تحدد بداية الآية"); + return; + } + if (_selectedToAya < 0) { + Utils.showToast("لم تحدد الآية المنتهية"); + return; + } + getAyaByRange(); + }), + SizedBox(width: 8), + commonIconButton( + "مسح البحث", + "assets/icons/cancel.svg", + (_selectedSurah == -1 || _selectedFromAya == -1 || _selectedToAya == -1) + ? null + : () { + _selectedSurah = -1; + _selectedFromAya = -1; + _selectedToAya = -1; + getQuranByPageNo(); + }), + ], + ), SizedBox(height: 16), - Expanded( - child: Container( - margin: EdgeInsets.only(top: 4, bottom: 4), - padding: EdgeInsets.only(top: 16, bottom: 4, right: 16, left: 16), - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - nextOptionButton( - "assets/icons/prev.svg", - _selectedSurah == 0 ? "" : _surahList[_selectedSurah - 1], - _selectedSurah == 0 - ? null - : () { - _selectedSurah = _selectedSurah - 1; - filterData(); - }), - previousOptionButton( - "assets/icons/next.svg", - _selectedSurah == (_surahList.isNotEmpty ? (_surahList.length - 1) : 0) ? "" : _surahList[_selectedSurah + 1], - _selectedSurah == (_surahList.isNotEmpty ? (_surahList.length - 1) : 0) - ? null - : () { - _selectedSurah = _selectedSurah + 1; - filterData(); - }), - ], - ), - Expanded( - child: SingleChildScrollView( - physics: BouncingScrollPhysics(), - child: RepaintBoundary( - key: _globalKey, - child: Material( - color: Colors.white, - child: ListView( - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: EdgeInsets.only(top: 16, bottom: 8), - children: [ - // Text( - // "بسم الله الرحمن الرحيم", - // textAlign: TextAlign.center, - // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: ColorConsts.primaryBlue, height: 1), - // ), - // SizedBox(height: 8), - Container( - padding: EdgeInsets.only(left: 4, right: 4), - child: Text( - _surahAya, - textAlign: TextAlign.center, - style: TextStyle( - fontFamily: "UthmanicHafs", - fontSize: 18, - color: ColorConsts.primaryBlue, - fontWeight: FontWeight.bold, + if (_surahAya.isNotEmpty) + Expanded( + child: Container( + margin: EdgeInsets.only(top: 4, bottom: 4), + padding: EdgeInsets.only(top: 16, bottom: 4, right: 16, left: 16), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(8), + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + nextOptionButton( + "assets/icons/prev.svg", + _currentSurahIndex <= 0 ? "" : getNotNullValue(_surahList, _currentSurahIndex - 1), + _currentSurahIndex <= 0 + ? null + : () { + // _selectedSurah = _selectedSurah - 1; + // filterData(); + }), + previousOptionButton( + "assets/icons/next.svg", + _currentSurahIndex >= (_surahList.isNotEmpty ? (_surahList.length - 1) : 0) ? "" : getNotNullValue(_surahList, _currentSurahIndex + 1), + _currentSurahIndex >= (_surahList.isNotEmpty ? (_surahList.length - 1) : 0) + ? null + : () { + // _selectedSurah = _selectedSurah + 1; + // filterData(); + }), + ], + ), + Expanded( + child: SingleChildScrollView( + physics: BouncingScrollPhysics(), + child: RepaintBoundary( + key: _globalKey, + child: Material( + color: Colors.white, + child: ListView( + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.only(top: 16, bottom: 8), + children: [ + // Text( + // "بسم الله الرحمن الرحيم", + // textAlign: TextAlign.center, + // style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20, color: ColorConsts.primaryBlue, height: 1), + // ), + // SizedBox(height: 8), + Container( + padding: EdgeInsets.only(left: 4, right: 4), + child: Text( + _surahAya, + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: "UthmanicHafs", + fontSize: 18, + color: ColorConsts.primaryBlue, + fontWeight: FontWeight.bold, + ), ), + // todo "sikander" : lines commented for future + // TextHighLightWidget( + // text: _surahAya, + // valueColor: ColorConsts.primaryBlue, + // highlights: _tangheemWords, + // onTap: (value) { + // List _ayatList = _ayatTangheemTypeMapped.data?.where((element) => element.highlightText == value)?.toList() ?? []; + // if (_ayatList.length > 1) { + // _selectTangheemType(_ayatList); + // } else { + // Navigator.pushNamed(context, TangheemDetailScreen.routeName, arguments: _ayatList.first); + // } + // }, + // style: TextStyle( + // fontFamily: "UthmanicHafs", + // fontSize: 18, + // fontWeight: FontWeight.bold, + // ), + // ), ), - // todo "sikander" : lines commented for future - // TextHighLightWidget( - // text: _surahAya, - // valueColor: ColorConsts.primaryBlue, - // highlights: _tangheemWords, - // onTap: (value) { - // List _ayatList = _ayatTangheemTypeMapped.data?.where((element) => element.highlightText == value)?.toList() ?? []; - // if (_ayatList.length > 1) { - // _selectTangheemType(_ayatList); - // } else { - // Navigator.pushNamed(context, TangheemDetailScreen.routeName, arguments: _ayatList.first); - // } - // }, - // style: TextStyle( - // fontFamily: "UthmanicHafs", - // fontSize: 18, - // fontWeight: FontWeight.bold, - // ), - // ), - ), - ], + ], + ), ), ), ), ), - ), - SizedBox(height: 8), - AyaScrollViewer( - scrollDirection: Axis.horizontal, - scrollToId: scrollToId, - children: [ - for (int i = 0; i < _fromAyaList.length; i++) - ScrollContent( - id: '$i', - child: Text( - " ${i + 1} ", - style: TextStyle(fontSize: 16, color: _currentPage == i ? ColorConsts.secondaryOrange : ColorConsts.textHintGrey), - ), - ), - ], - ), - SizedBox(height: 4), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - nextOptionButton( - "assets/icons/prev_single.svg", - "الآيات السابقة", - _currentPage == 0 - ? null - : () { - _currentPage = _currentPage - 1; - _selectedFromAya = _selectedFromAya - 1; - _selectedToAya = _selectedToAya - 1; - getAyaByRange(); - }), - previousOptionButton( - "assets/icons/next_single.svg", - "الآيات التالية", - _currentPage == (_toAyaList.isNotEmpty ? (_toAyaList.length - 1) : 0) - ? null - : () { - _currentPage = _currentPage + 1; - _selectedFromAya = _selectedFromAya + 1; - _selectedToAya = _selectedToAya + 1; - getAyaByRange(); - }), - ], - ), - ], + // SizedBox(height: 8), + // AyaScrollViewer( + // scrollDirection: Axis.horizontal, + // scrollToId: scrollToId, + // children: [ + // for (int i = 0; i < _fromAyaList.length; i++) + // ScrollContent( + // id: '$i', + // child: Text( + // " ${i + 1} ", + // style: TextStyle(fontSize: 16, color: _currentPage == i ? ColorConsts.secondaryOrange : ColorConsts.textHintGrey), + // ), + // ), + // ], + // ), + SizedBox(height: 4), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + nextOptionButton( + "assets/icons/prev_single.svg", + "الآيات السابقة", + _currentPage == 0 + ? null + : () { + _currentPage = _currentPage - 1; + _selectedSurah = -1; + _selectedFromAya = -1; + _selectedToAya = -1; + getQuranByPageNo(); + }), + previousOptionButton( + "assets/icons/next_single.svg", + "الآيات التالية", + _currentPage == 604 + ? null + : () { + _currentPage = _currentPage + 1; + _selectedSurah = -1; + _selectedFromAya = -1; + _selectedToAya = -1; + getQuranByPageNo(); + }), + ], + ), + ], + ), ), ), - ), // AyaPlayerWidget(surahName: _surahList.isNotEmpty ? _surahList[_selectedSurah] : "", globalKey: _globalKey) ], ), ); } + Widget commonIconButton(String title, String iconString, VoidCallback callback) { + return InkWell( + splashColor: Colors.transparent, + highlightColor: Colors.transparent, + onTap: callback, + child: Container( + height: 36, + decoration: BoxDecoration( + color: callback == null ? ColorConsts.secondaryPink.withOpacity(.5) : ColorConsts.secondaryPink, + borderRadius: BorderRadius.circular(6), + ), + padding: EdgeInsets.fromLTRB(8, 2, 8, 2), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Text( + title, + maxLines: 1, + style: TextStyle(fontSize: 12, color: Colors.white), + ), + SizedBox(width: 12), + SvgPicture.asset(iconString, width: 20, height: 20, color: Colors.white), + ], + ), + ), + ); + } + Widget nextOptionButton(String icon, String text, VoidCallback onPressed) { return InkWell( onTap: onPressed,