diff --git a/lib/views/home/home.dart b/lib/views/home/home.dart index 4442229..3192715 100644 --- a/lib/views/home/home.dart +++ b/lib/views/home/home.dart @@ -142,9 +142,10 @@ class _HomeState extends State @override void initState() { - if (widget.showDialogs ?? false) { - _showDialog(context); - } + // Remove dialog showing logic to prevent welcome popups + // if (widget.showDialogs ?? false) { + // _showDialog(context); + // } final state = context.read(); DesignConfig.updateSystemUiOverlayStyle(); diff --git a/lib/views/news/news_details/news_details.dart b/lib/views/news/news_details/news_details.dart index fda8eb9..d6a021e 100644 --- a/lib/views/news/news_details/news_details.dart +++ b/lib/views/news/news_details/news_details.dart @@ -31,7 +31,7 @@ class _NewsDetailsState extends State { Future.delayed(Duration.zero, () { state.getNewsDetails(widget.pageData['id']); }); - if(widget.pageData['goToComment'] != null){ + if (widget.pageData['goToComment'] != null) { state.openComments = widget.pageData['goToComment']; } super.initState(); @@ -42,7 +42,8 @@ class _NewsDetailsState extends State { return Scaffold( body: Consumer( builder: (context, state, child) => StateHandler( - onRetry: () => state.getNewsDetails(state.currentNews.id), + onRetry: () => + state.getNewsDetails(widget.pageData['id']), state: state, builder: (context, state) => Stack( children: [ diff --git a/lib/views/news/news_details/news_details_state.dart b/lib/views/news/news_details/news_details_state.dart index 333d2bb..c4c2dea 100644 --- a/lib/views/news/news_details/news_details_state.dart +++ b/lib/views/news/news_details/news_details_state.dart @@ -1,5 +1,3 @@ -// lib/views/news/news_details/news_details_state.dart - import 'dart:async'; import 'dart:math'; @@ -10,8 +8,6 @@ import 'package:didvan/models/requests/news.dart'; import 'package:didvan/providers/core.dart'; import 'package:didvan/services/network/request.dart'; import 'package:didvan/services/network/request_helper.dart'; -import 'package:didvan/services/storage/storage.dart'; -import 'package:flutter/material.dart'; class NewsDetailsState extends CoreProvier { final List news = []; @@ -21,6 +17,7 @@ class NewsDetailsState extends CoreProvier { int _trackingTimerCounter = 0; bool isFetchingNewItem = false; final List relatedQueue = []; + bool _isRequestInProgress = false; int _currentIndex = 0; int get currentIndex => _currentIndex; @@ -29,77 +26,96 @@ class NewsDetailsState extends CoreProvier { NewsDetailsData get currentNews => news[_currentIndex]!; Future getNewsDetails(int id, {bool? isForward}) async { - debugPrint('requset token ${RequestService.token}'); - // **FIX: Ensure the token is available before making a request.** - if (RequestService.token == null) { - final token = await StorageService.getValue(key: 'token'); - if (token != null) { - RequestService.token = token; - } else { - // If no token, fail gracefully. You might want to navigate - // to the login screen here in a real-world scenario. - appState = AppState.failed; - notifyListeners(); - return; - } - } - - isFetchingNewItem = true; - notifyListeners(); - - final service = RequestService(RequestHelper.newsDetails(id, args)); - await service.httpGet(); - _handleTracking(sendRequest: isForward != null); - if (service.isSuccess) { - final result = service.result; - final newsItem = NewsDetailsData.fromJson(result['news']); - if (args.page == 0) { - news.add(newsItem); - initialIndex = 0; - appState = AppState.idle; - notifyListeners(); // Notify listeners after state change - return; - } - NewsDetailsData? prevNews; - if (result['prevNews'].isNotEmpty) { - prevNews = NewsDetailsData.fromJson(result['prevNews']); - } - NewsDetailsData? nextNews; - if (result['nextNews'].isNotEmpty) { - nextNews = NewsDetailsData.fromJson(result['nextNews']); - } - if (isForward == null) { - news.addAll(List.generate(max(newsItem.order - 2, 0), (index) => null)); - if (prevNews != null) { - news.add(prevNews); - } - news.add(newsItem); - if (nextNews != null) { - news.add(nextNews); - } - _currentIndex = initialIndex = newsItem.order - 1; - } else if (isForward) { - if (!exists(nextNews) && nextNews != null) { - news.add(nextNews); - } - _currentIndex++; - } else if (!isForward) { - if (!exists(prevNews) && prevNews != null) { - news[_currentIndex - 2] = prevNews; - } - _currentIndex--; - } - isFetchingNewItem = false; - if (currentNews.contents.length == 1) { - getRelatedContents(); - } - appState = AppState.idle; - notifyListeners(); // Notify listeners after state change + // Prevent duplicate requests + if (_isRequestInProgress) { return; } - - appState = AppState.failed; - notifyListeners(); // Notify listeners on failure + _isRequestInProgress = true; + + // Set loading state + if (isForward == null) { + appState = AppState.busy; + } else { + isFetchingNewItem = true; + notifyListeners(); + } + + try { + // Wait for token to be ready + if (RequestService.token == null || RequestService.token!.isEmpty) { + await Future.delayed(const Duration(milliseconds: 500)); + if (RequestService.token == null || RequestService.token!.isEmpty) { + throw Exception('Token not available'); + } + } + + final service = RequestService(RequestHelper.newsDetails(id, args)); + await service.httpGet(); + _handleTracking(sendRequest: isForward != null); + + if (service.isSuccess) { + final result = service.result; + final newsItem = NewsDetailsData.fromJson(result['news']); + if (args.page == 0) { + news.add(newsItem); + initialIndex = 0; + appState = AppState.idle; + isFetchingNewItem = false; + _isRequestInProgress = false; + return; + } + NewsDetailsData? prevNews; + if (result['prevNews'].isNotEmpty) { + prevNews = NewsDetailsData.fromJson(result['prevNews']); + } + NewsDetailsData? nextNews; + if (result['nextNews'].isNotEmpty) { + nextNews = NewsDetailsData.fromJson(result['nextNews']); + } + if (isForward == null) { + news.addAll(List.generate(max(newsItem.order - 2, 0), (index) => null)); + if (prevNews != null) { + news.add(prevNews); + } + news.add(newsItem); + if (nextNews != null) { + news.add(nextNews); + } + _currentIndex = initialIndex = newsItem.order - 1; + } else if (isForward) { + if (!exists(nextNews) && nextNews != null) { + news.add(nextNews); + } + _currentIndex++; + } else if (!isForward) { + if (!exists(prevNews) && prevNews != null) { + news[_currentIndex - 2] = prevNews; + } + _currentIndex--; + } + isFetchingNewItem = false; + if (currentNews.contents.length == 1) { + getRelatedContents(); + } + appState = AppState.idle; + } else { + isFetchingNewItem = false; + if (isForward == null) { + appState = AppState.failed; + } else { + notifyListeners(); + } + } + } catch (e) { + print('Error fetching news details: $e'); + isFetchingNewItem = false; + if (isForward == null) { + appState = AppState.failed; + } + notifyListeners(); + } finally { + _isRequestInProgress = false; + } } bool exists(NewsDetailsData? newsItem) => @@ -171,4 +187,4 @@ class NewsDetailsState extends CoreProvier { _trackingTimer.cancel(); super.dispose(); } -} +} \ No newline at end of file diff --git a/lib/views/profile/general_settings/settings.dart b/lib/views/profile/general_settings/settings.dart index 4658ac6..c7cad4d 100644 --- a/lib/views/profile/general_settings/settings.dart +++ b/lib/views/profile/general_settings/settings.dart @@ -56,7 +56,8 @@ class _GeneralSettingsState extends State { appBarData: AppBarData(hasBack: true, title: 'تنظیمات'), children: [ DidvanCard( - child: MenuOption( + child: + MenuOption( title: 'زمان دریافت اعلان', onTap: () => Navigator.of(context).pushNamed( Routes.notificationTime, diff --git a/lib/views/profile/profile.dart b/lib/views/profile/profile.dart index 927b1ac..75c4eeb 100644 --- a/lib/views/profile/profile.dart +++ b/lib/views/profile/profile.dart @@ -94,47 +94,47 @@ class _ProfilePageState extends State { padding: const EdgeInsets.only(right: 8.0, top: 8), child: Column( children: [ - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0), - child: MenuOption( - title: 'زمان دریافت اعلان', - onTap: () => - Navigator.of(context).pushNamed( - Routes.notificationTime, - arguments: { - "fromFav": false, - 'onTimeChanged': () => Future.delayed( - Duration.zero, - () => state.getTime(), - ) - }, - ), - icon: DidvanIcons.notification_regular, - suffix: state.time, - // suffix: 'از${DateTimeUtils.normalizeTimeDuration( - // Duration(minutes: state.notificationTimeRange[0]), - // )} تا ${DateTimeUtils.normalizeTimeDuration( - // Duration(minutes: state.notificationTimeRange[1]), - // )}', - ), - ), - Padding( - padding: const EdgeInsets.symmetric( - vertical: 12.0), - child: MenuOption( - title: 'شخصی سازی محتوا', - onTap: () => Navigator.of(context) - .pushNamed(Routes.favouritesStep, - arguments: {"toTimer": false}), - icon: DidvanIcons.note_regular, - // suffix: 'از${DateTimeUtils.normalizeTimeDuration( - // Duration(minutes: state.notificationTimeRange[0]), - // )} تا ${DateTimeUtils.normalizeTimeDuration( - // Duration(minutes: state.notificationTimeRange[1]), - // )}', - ), - ), + // Padding( + // padding: const EdgeInsets.symmetric( + // vertical: 12.0), + // child: MenuOption( + // title: 'زمان دریافت اعلان', + // onTap: () => + // Navigator.of(context).pushNamed( + // Routes.notificationTime, + // arguments: { + // "fromFav": false, + // 'onTimeChanged': () => Future.delayed( + // Duration.zero, + // () => state.getTime(), + // ) + // }, + // ), + // icon: DidvanIcons.notification_regular, + // suffix: state.time, + // // suffix: 'از${DateTimeUtils.normalizeTimeDuration( + // // Duration(minutes: state.notificationTimeRange[0]), + // // )} تا ${DateTimeUtils.normalizeTimeDuration( + // // Duration(minutes: state.notificationTimeRange[1]), + // // )}', + // ), + // ), + // Padding( + // padding: const EdgeInsets.symmetric( + // vertical: 12.0), + // child: MenuOption( + // title: 'شخصی سازی محتوا', + // onTap: () => Navigator.of(context) + // .pushNamed(Routes.favouritesStep, + // arguments: {"toTimer": false}), + // icon: DidvanIcons.note_regular, + // // suffix: 'از${DateTimeUtils.normalizeTimeDuration( + // // Duration(minutes: state.notificationTimeRange[0]), + // // )} تا ${DateTimeUtils.normalizeTimeDuration( + // // Duration(minutes: state.notificationTimeRange[1]), + // // )}', + // ), + // ), Padding( padding: const EdgeInsets.symmetric( vertical: 12.0), diff --git a/lib/views/radar/radar_details/radar_details_state.dart b/lib/views/radar/radar_details/radar_details_state.dart index 1c9c6e3..ef3e3f8 100644 --- a/lib/views/radar/radar_details/radar_details_state.dart +++ b/lib/views/radar/radar_details/radar_details_state.dart @@ -18,6 +18,7 @@ class RadarDetailsState extends CoreProvier { bool isFetchingNewItem = false; final List relatedQueue = []; bool openComments = false; + bool _isRequestInProgress = false; int _currentIndex = 0; int get currentIndex => _currentIndex; @@ -31,66 +32,98 @@ class RadarDetailsState extends CoreProvier { } Future getRadarDetails(int id, {bool? isForward}) async { + // Prevent duplicate requests + if (_isRequestInProgress) { + return; + } + _isRequestInProgress = true; + + // Set loading state if (isForward == null) { appState = AppState.busy; } else { isFetchingNewItem = true; notifyListeners(); } - final service = RequestService(RequestHelper.radarDetails(id, args)); - await service.httpGet(); - _handleTracking(sendRequest: isForward != null); - if (service.isSuccess) { - final result = service.result; - final radar = RadarDetailsData.fromJson(result['radar']); - if (args.page == 0) { - radars.add(radar); - initialIndex = 0; + + try { + // Wait for token to be ready + if (RequestService.token == null || RequestService.token!.isEmpty) { + await Future.delayed(const Duration(milliseconds: 500)); + if (RequestService.token == null || RequestService.token!.isEmpty) { + throw Exception('Token not available'); + } + } + + final service = RequestService(RequestHelper.radarDetails(id, args)); + await service.httpGet(); + _handleTracking(sendRequest: isForward != null); + + if (service.isSuccess) { + final result = service.result; + final radar = RadarDetailsData.fromJson(result['radar']); + if (args.page == 0) { + radars.add(radar); + initialIndex = 0; + appState = AppState.idle; + isFetchingNewItem = false; + _isRequestInProgress = false; + return; + } + + RadarDetailsData? prevRadar; + if (result['prevRadar'].isNotEmpty) { + prevRadar = RadarDetailsData.fromJson(result['prevRadar']); + } + + RadarDetailsData? nextRadar; + if (result['nextRadar'].isNotEmpty) { + nextRadar = RadarDetailsData.fromJson(result['nextRadar']); + } + + if (isForward == null) { + radars.addAll(List.generate(max(radar.order - 2, 0), (index) => null)); + if (prevRadar != null) { + radars.add(prevRadar); + } + radars.add(radar); + if (nextRadar != null) { + radars.add(nextRadar); + } + _currentIndex = initialIndex = radar.order - 1; + } else if (isForward) { + if (!exists(nextRadar) && nextRadar != null) { + radars.add(nextRadar); + } + _currentIndex++; + } else if (!isForward) { + if (!exists(prevRadar) && prevRadar != null) { + radars[_currentIndex - 2] = prevRadar; + } + _currentIndex--; + } + isFetchingNewItem = false; + if (currentRadar.contents.length == 1) { + getRelatedContents(); + } appState = AppState.idle; - return; - } - - RadarDetailsData? prevRadar; - if (result['prevRadar'].isNotEmpty) { - prevRadar = RadarDetailsData.fromJson(result['prevRadar']); - } - - RadarDetailsData? nextRadar; - if (result['nextRadar'].isNotEmpty) { - nextRadar = RadarDetailsData.fromJson(result['nextRadar']); - } - - if (isForward == null) { - radars.addAll(List.generate(max(radar.order - 2, 0), (index) => null)); - if (prevRadar != null) { - radars.add(prevRadar); + } else { + isFetchingNewItem = false; + if (isForward == null) { + appState = AppState.failed; + } else { + notifyListeners(); } - radars.add(radar); - if (nextRadar != null) { - radars.add(nextRadar); - } - _currentIndex = initialIndex = radar.order - 1; - } else if (isForward) { - if (!exists(nextRadar) && nextRadar != null) { - radars.add(nextRadar); - } - _currentIndex++; - } else if (!isForward) { - if (!exists(prevRadar) && prevRadar != null) { - radars[_currentIndex - 2] = prevRadar; - } - _currentIndex--; } + } catch (e) { + print('Error fetching radar details: $e'); isFetchingNewItem = false; - if (currentRadar.contents.length == 1) { - getRelatedContents(); + if (isForward == null) { + appState = AppState.failed; } - appState = AppState.idle; - return; - } - //why? total page state shouldn't die! - if (isForward == null) { - appState = AppState.failed; + notifyListeners(); + } finally { + _isRequestInProgress = false; } } @@ -164,4 +197,4 @@ class RadarDetailsState extends CoreProvier { _trackingTimer.cancel(); super.dispose(); } -} +} \ No newline at end of file diff --git a/lib/views/splash/splash.dart b/lib/views/splash/splash.dart index fb62895..6ac155c 100644 --- a/lib/views/splash/splash.dart +++ b/lib/views/splash/splash.dart @@ -135,10 +135,11 @@ class _SplashState extends State { await ServerDataProvider.getData(); } - print("token route is $token, initalURI.path: ${initialURI?.path}, intitlPath: ${initialURI?.path}"); + print("token route is $token"); String extractedPath = initialURI?.path.toString() == '/' ? Routes.home : initialURI?.path.toString() ?? Routes.home; final String destinationRoute = token == null ? Routes.authenticaion : extractedPath; - dynamic routeArguments = token == null ? {'isResetPassword': false} : {'showDialogs': true}; + // Set showDialogs to false to prevent welcome popups + dynamic routeArguments = token == null ? {'isResetPassword': false} : {'showDialogs': false}; if (destinationRoute == Routes.home) { @@ -155,7 +156,7 @@ class _SplashState extends State { print("destination route: $destinationRoute, route args: $routeArguments"); await navigatorKey.currentState!.pushReplacementNamed( destinationRoute, - arguments: token == null ? false : null, + arguments: routeArguments, ); } catch (e) { setState(() { diff --git a/lib/views/webview/web_view.dart b/lib/views/webview/web_view.dart index 84ac7d8..b8feeaf 100644 --- a/lib/views/webview/web_view.dart +++ b/lib/views/webview/web_view.dart @@ -26,12 +26,14 @@ class _WebViewState extends State { }; void _onProgress(int progress) { + print('🌐 WebView loading progress: $progress%'); // Add logging setState(() { this.progress = progress; }); } void _onPageFinished(String url) async { + print('✅ WebView finished loading: $url'); // Add logging await Future.delayed(const Duration(seconds: 2)); setState(() { if (progress == 100) loading = false; @@ -40,21 +42,24 @@ class _WebViewState extends State { @override void initState() { + print('🔄 Initializing WebView with URL: ${widget.src}'); // Add logging controller = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate( NavigationDelegate( onProgress: _onProgress, - onPageStarted: (String url) {}, + onPageStarted: (String url) { + print('▶️ WebView started loading: $url'); // Add logging + }, onPageFinished: _onPageFinished, - onHttpError: (HttpResponseError error) {}, + onHttpError: (HttpResponseError error) { + // print('❌ WebView HTTP error: ${error.statusCode} on ${error.url}'); // Add logging + }, onWebResourceError: (WebResourceError error) { - // navigatorKey.currentState!.pop(); + // print('❌ WebView resource error: ${error.description} on ${error.failingUrl}'); // Add logging }, onNavigationRequest: (NavigationRequest request) { - // if (request.url.startsWith('https://www.youtube.com/')) { - // return NavigationDecision.prevent; - // } + print('🔀 WebView navigation request to: ${request.url}'); // Add logging return NavigationDecision.navigate; }, ), @@ -77,7 +82,7 @@ class _WebViewState extends State { child: Scaffold( appBar: AppBar( title: const DidvanText( - 'بازگشت به دیدوان', + 'بازگشت', ), leading: const BackButton(), ),