From 68ae231c7d08d2c69c60d3ce4239c32b0d69bb53 Mon Sep 17 00:00:00 2001 From: biso Date: Sat, 2 May 2026 13:46:57 +0300 Subject: [PATCH 1/7] fix: some randoms --- .../presentation/pages/public_profile_page.dart | 2 +- .../dynamic_app_icon_flutter_plus/pubspec.lock | 8 ++++---- pubspec.lock | 16 ++++++++-------- pubspec.yaml | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/features/profile/presentation/pages/public_profile_page.dart b/lib/features/profile/presentation/pages/public_profile_page.dart index 531a1dfd..f33c437d 100644 --- a/lib/features/profile/presentation/pages/public_profile_page.dart +++ b/lib/features/profile/presentation/pages/public_profile_page.dart @@ -716,7 +716,7 @@ class _PublicProfilePageState extends ConsumerState { Text( 'Artist Pro', style: AppTheme.labelSmall.copyWith( - color: const Color(0xFFFBC02D), + color: const Color(0xFFFFFFFF), fontWeight: FontWeight.bold, letterSpacing: 0.5, ), diff --git a/packages/dynamic_app_icon_flutter_plus/pubspec.lock b/packages/dynamic_app_icon_flutter_plus/pubspec.lock index 90c92c29..c31f3d6f 100644 --- a/packages/dynamic_app_icon_flutter_plus/pubspec.lock +++ b/packages/dynamic_app_icon_flutter_plus/pubspec.lock @@ -103,10 +103,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.18" material_color_utilities: dependency: transitive description: @@ -188,10 +188,10 @@ packages: dependency: transitive description: name: test_api - sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.9" vector_math: dependency: transitive description: diff --git a/pubspec.lock b/pubspec.lock index 375d08ec..ab37d5e8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1155,10 +1155,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 + sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" url: "https://pub.dev" source: hosted - version: "0.12.19" + version: "0.12.18" material_color_utilities: dependency: transitive description: @@ -1816,26 +1816,26 @@ packages: dependency: transitive description: name: test - sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7" + sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" url: "https://pub.dev" source: hosted - version: "1.30.0" + version: "1.29.0" test_api: dependency: transitive description: name: test_api - sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" + sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.9" test_core: dependency: transitive description: name: test_core - sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51" + sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" url: "https://pub.dev" source: hosted - version: "0.6.16" + version: "0.6.15" timezone: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 17341cd8..7b52a691 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: # Authentication dartz: ^0.10.1 sign_in_with_apple: ^6.1.1 - firebase_core: ^3.6.0 + firebase_core: ^3.8.0 google_sign_in: ^6.2.1 firebase_auth: ^5.3.1 # Navigation & Routing From 2ee40da6f57b15989486fa45095c72652afb9983 Mon Sep 17 00:00:00 2001 From: biso Date: Sat, 2 May 2026 20:24:30 +0300 Subject: [PATCH 2/7] Fix: fixed minor infos --- ai_scan.py | 146 ------------------ .../widget/likes_widget_sync_provider.dart | 3 +- .../data_sources_sockets_test.dart | 13 -- 3 files changed, 1 insertion(+), 161 deletions(-) delete mode 100644 ai_scan.py diff --git a/ai_scan.py b/ai_scan.py deleted file mode 100644 index 73ae04f7..00000000 --- a/ai_scan.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -AI detection scanner using HuggingFace Inference API (free). -Model: Hello-SimpleAI/chatgpt-detector-roberta - -Usage: - python ai_scan.py [folder2 ...] - -Example: - python ai_scan.py hf_abc123 lib/features/messaging lib/features/settings - -Get a free token at: huggingface.co/settings/tokens -""" - -import sys -import time -import requests -from pathlib import Path - -API_URL = "https://api-inference.huggingface.co/models/Hello-SimpleAI/chatgpt-detector-roberta" -EXTENSIONS = {".dart", ".kt", ".swift", ".java"} -MAX_CHARS = 512 # RoBERTa token limit (keep to ~500 chars to be safe) -RATE_DELAY = 1.5 # seconds between requests - - -def scan_file(api_key: str, file_path: Path) -> float | None: - text = file_path.read_text(encoding="utf-8", errors="ignore").strip() - if len(text) < 80: - return None # too short to be meaningful - - # Truncate to model limit - if len(text) > MAX_CHARS: - text = text[:MAX_CHARS] - - try: - resp = requests.post( - API_URL, - headers={"Authorization": f"Bearer {api_key}"}, - json={"inputs": text}, - timeout=30, - ) - if resp.status_code == 503: - # Model is loading — wait and retry once - print(" model loading, waiting 20s...") - time.sleep(20) - resp = requests.post( - API_URL, - headers={"Authorization": f"Bearer {api_key}"}, - json={"inputs": text}, - timeout=30, - ) - resp.raise_for_status() - - # Response: [[{"label": "ChatGPT", "score": 0.87}, {"label": "Human", "score": 0.13}]] - labels = resp.json()[0] - ai_score = next((x["score"] for x in labels if x["label"].lower() != "human"), None) - if ai_score is None: - # fallback: 1 - human score - human = next((x["score"] for x in labels if x["label"].lower() == "human"), 0) - ai_score = 1 - human - return round(ai_score * 100, 1) - - except requests.HTTPError as e: - if resp.status_code == 429: - print(" rate limited — waiting 60s...") - time.sleep(60) - else: - print(f" HTTP {resp.status_code}: {e}") - return None - except Exception as e: - print(f" error: {e}") - return None - - -def scan_folder(api_key: str, folder: str) -> list[tuple[str, float]]: - root = Path(folder) - if not root.exists(): - print(f"Folder not found: {folder}") - return [] - - files = sorted( - f for f in root.rglob("*") if f.suffix in EXTENSIONS and f.is_file() - ) - if not files: - print(f"No supported files found in {folder}") - return [] - - print(f"\nScanning {len(files)} files in '{folder}'\n") - col = 68 - print(f"{'File':<{col}} {'AI %':>6}") - print("─" * (col + 8)) - - results = [] - for i, fp in enumerate(files): - label = str(fp.relative_to(root.parent)) - pct = scan_file(api_key, fp) - - if pct is not None: - results.append((label, pct)) - print(f"{label:<{col}} {pct:>5.1f}%") - else: - print(f"{label:<{col}} {'skip':>6}") - - if i < len(files) - 1: - time.sleep(RATE_DELAY) - - return results - - -def main(): - if len(sys.argv) < 3: - print(__doc__) - sys.exit(1) - - api_key = sys.argv[1] - folders = sys.argv[2:] - - all_results: list[tuple[str, float]] = [] - for folder in folders: - all_results.extend(scan_folder(api_key, folder)) - - if not all_results: - print("Nothing scanned.") - return - - col = 68 - print("\n" + "═" * (col + 8)) - print(f"{'SUMMARY':<{col}}") - print("═" * (col + 8)) - - all_results.sort(key=lambda x: x[1], reverse=True) - for label, pct in all_results: - bar = "█" * int(pct / 5) - print(f"{label:<{col}} {pct:>5.1f}% {bar}") - - avg = sum(p for _, p in all_results) / len(all_results) - print("─" * (col + 8)) - print(f"\n Overall average : {avg:.1f}% AI") - print(f" Files scanned : {len(all_results)}") - highest = max(all_results, key=lambda x: x[1]) - lowest = min(all_results, key=lambda x: x[1]) - print(f" Highest : {highest[1]:.1f}% ({highest[0]})") - print(f" Lowest : {lowest[1]:.1f}% ({lowest[0]})\n") - - -if __name__ == "__main__": - main() diff --git a/lib/core/widget/likes_widget_sync_provider.dart b/lib/core/widget/likes_widget_sync_provider.dart index c49fb152..c21ce2c3 100644 --- a/lib/core/widget/likes_widget_sync_provider.dart +++ b/lib/core/widget/likes_widget_sync_provider.dart @@ -1,10 +1,9 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:home_widget/home_widget.dart'; import 'likes_widget_updater.dart'; import '../../features/authentication/presentation/providers/auth_provider.dart'; import '../../features/authentication/presentation/providers/auth_state.dart'; import '../../features/library/presentation/providers/library_providers.dart'; -import '../routing/app_router.dart'; + final likesWidgetSyncProvider = NotifierProvider( LikesWidgetSyncNotifier.new, diff --git a/test/features/messaging/data/datasources/data_sources_sockets_test.dart b/test/features/messaging/data/datasources/data_sources_sockets_test.dart index 4ba2647d..d18ba711 100644 --- a/test/features/messaging/data/datasources/data_sources_sockets_test.dart +++ b/test/features/messaging/data/datasources/data_sources_sockets_test.dart @@ -88,19 +88,6 @@ void main() { /// Waits until [condition] is true, polling every [interval]. /// Fails (throws) after [timeout] if condition is never met. - Future waitFor( - bool Function() condition, { - Duration timeout = const Duration(seconds: 5), - Duration interval = const Duration(milliseconds: 20), - }) async { - final deadline = DateTime.now().add(timeout); - while (!condition()) { - if (DateTime.now().isAfter(deadline)) { - throw TimeoutException('waitFor condition not met within $timeout'); - } - await Future.delayed(interval); - } - } // ── without connect ──────────────────────────────────────────────────────── From 018db98003e2723831db586de171e89656565375 Mon Sep 17 00:00:00 2001 From: biso Date: Sat, 2 May 2026 23:28:25 +0300 Subject: [PATCH 3/7] Fix: fixed all interactions in the app --- lib/features/comments/data/models/comment_dto.dart | 2 +- .../comments/presentation/pages/comments_screen.dart | 3 --- .../feed/presentation/widgets/feed_card_side_actions.dart | 1 + lib/features/feed/presentation/widgets/feed_list.dart | 4 ++-- .../presentation/providers/fan_leaderboard_provider.dart | 4 +++- .../track/presentation/widgets/fans_leaderboard.dart | 8 ++++---- .../track/presentation/widgets/track_action_bar.dart | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/features/comments/data/models/comment_dto.dart b/lib/features/comments/data/models/comment_dto.dart index 948f9715..13a482b9 100644 --- a/lib/features/comments/data/models/comment_dto.dart +++ b/lib/features/comments/data/models/comment_dto.dart @@ -80,7 +80,7 @@ class CommentDto { isLikedByMe: json['is_liked_by_me'] as bool? ?? false, replyCount: json['reply_count'] as int? ?? 0, parentCommentId: json['parent_comment_id'] as String?, - isAuthorBlocked: json['is_author_blocked'] as bool? ?? false, + isAuthorBlocked: json['is_user_blocked'] as bool? ?? false, ); } diff --git a/lib/features/comments/presentation/pages/comments_screen.dart b/lib/features/comments/presentation/pages/comments_screen.dart index 37ae75b9..d4f832ac 100644 --- a/lib/features/comments/presentation/pages/comments_screen.dart +++ b/lib/features/comments/presentation/pages/comments_screen.dart @@ -52,9 +52,6 @@ class _CommentsScreenState extends ConsumerState { }); WidgetsBinding.instance.addPostFrameCallback((_) { - // Ensure the track is in the sync map for global count synchronization - ref.read(trackSyncProvider.notifier).syncTrack(widget.track); - ref .read(trackCommentsProvider(widget.track.id).notifier) .setInitialTrack(widget.track); diff --git a/lib/features/feed/presentation/widgets/feed_card_side_actions.dart b/lib/features/feed/presentation/widgets/feed_card_side_actions.dart index 5c02a73d..1443d0bb 100644 --- a/lib/features/feed/presentation/widgets/feed_card_side_actions.dart +++ b/lib/features/feed/presentation/widgets/feed_card_side_actions.dart @@ -108,6 +108,7 @@ class _ActionButton extends StatelessWidget { Widget build(BuildContext context) { return GestureDetector( key: const Key('action_button_gesture'), + behavior: HitTestBehavior.opaque, onTap: onTap, child: Column( key: const Key('action_button_column'), diff --git a/lib/features/feed/presentation/widgets/feed_list.dart b/lib/features/feed/presentation/widgets/feed_list.dart index e465b533..9c702ad2 100644 --- a/lib/features/feed/presentation/widgets/feed_list.dart +++ b/lib/features/feed/presentation/widgets/feed_list.dart @@ -192,7 +192,7 @@ class FeedListState extends ConsumerState { Positioned( top: 0, left: 0, - right: 0, + right: 80, bottom: 350, child: GestureDetector( behavior: HitTestBehavior.translucent, @@ -255,7 +255,7 @@ class FeedListState extends ConsumerState { Positioned( top: 0, left: 0, - right: 0, + right: 80, bottom: 350, child: GestureDetector( behavior: HitTestBehavior.translucent, diff --git a/lib/features/track/presentation/providers/fan_leaderboard_provider.dart b/lib/features/track/presentation/providers/fan_leaderboard_provider.dart index bf574538..fc2058f1 100644 --- a/lib/features/track/presentation/providers/fan_leaderboard_provider.dart +++ b/lib/features/track/presentation/providers/fan_leaderboard_provider.dart @@ -27,5 +27,7 @@ final fanLeaderboardProvider = FutureProvider.family(( final period = ref.watch(fanLeaderboardPeriodProvider(trackId)); final useCase = ref.watch(getFanLeaderboardUseCaseProvider); - return useCase(trackId, period.value); + return useCase(trackId, period.value).timeout( + const Duration(seconds: 5), + ); }); diff --git a/lib/features/track/presentation/widgets/fans_leaderboard.dart b/lib/features/track/presentation/widgets/fans_leaderboard.dart index 95a9fa33..43522308 100644 --- a/lib/features/track/presentation/widgets/fans_leaderboard.dart +++ b/lib/features/track/presentation/widgets/fans_leaderboard.dart @@ -136,14 +136,14 @@ class FansLeaderboard extends ConsumerWidget { padding: EdgeInsets.symmetric(vertical: 40.0), child: CircularProgressIndicator(), ), - error: (err, stack) => Padding( - padding: const EdgeInsets.symmetric( + error: (err, stack) => const Padding( + padding: EdgeInsets.symmetric( vertical: 40.0, horizontal: 24, ), child: Text( - "Error loading leaderboard: $err", - style: const TextStyle(color: Colors.red), + "Leaderboard is currently unavailable. Please check back later.", + style: TextStyle(color: AppTheme.textSecondary), textAlign: TextAlign.center, ), ), diff --git a/lib/features/track/presentation/widgets/track_action_bar.dart b/lib/features/track/presentation/widgets/track_action_bar.dart index 0cb78d42..ea54afb9 100644 --- a/lib/features/track/presentation/widgets/track_action_bar.dart +++ b/lib/features/track/presentation/widgets/track_action_bar.dart @@ -94,7 +94,7 @@ class TrackActionBar extends ConsumerWidget { Formatters.formatCount(syncedTrack.commentCount), onTap: () { context.push( - '/home/comments/${syncedTrack.id}', + '/comments/${syncedTrack.id}', extra: syncedTrack, ); }, From 6f8c6c6c1f8b832c7983f99a536479ea643cd37f Mon Sep 17 00:00:00 2001 From: biso Date: Sat, 2 May 2026 23:56:53 +0300 Subject: [PATCH 4/7] Fix: fixed some ui glitches --- .../pages/likes_playlists_screen.dart | 10 ++++++++-- .../widgets/shared_embed_tile_widget.dart | 16 ++++++++++++---- .../screens/cancellation_screen.dart | 4 ++-- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/lib/features/messaging/presentation/pages/likes_playlists_screen.dart b/lib/features/messaging/presentation/pages/likes_playlists_screen.dart index f39582fb..0023df8e 100644 --- a/lib/features/messaging/presentation/pages/likes_playlists_screen.dart +++ b/lib/features/messaging/presentation/pages/likes_playlists_screen.dart @@ -103,8 +103,11 @@ class _LikesPlaylistsScreenState extends ConsumerState //Tracks Tab data: (tracks) => ListView.builder( key: const Key('likes_playlists_tracks_list'), - itemCount: tracks.length, + itemCount: tracks.length + 1, itemBuilder: (context, index) { + if (index == tracks.length) { + return const SizedBox(height: 50); + } final track = tracks[index]; return SharedEmbedTileWidget( key: Key('likes_playlists_track_${track.embedId}_tile'), @@ -137,8 +140,11 @@ class _LikesPlaylistsScreenState extends ConsumerState //Playlists Tab, Note: this tab has both liked/created playlists/albums data: (embeds) => ListView.builder( key: const Key('likes_playlists_playlists_albums_list'), - itemCount: embeds.length, + itemCount: embeds.length + 1, itemBuilder: (context, index) { + if (index == embeds.length) { + return const SizedBox(height: 50); + } final embed = embeds[index]; return SharedEmbedTileWidget( key: Key('likes_playlists_embed_${embed.embedId}_tile'), diff --git a/lib/features/messaging/presentation/widgets/shared_embed_tile_widget.dart b/lib/features/messaging/presentation/widgets/shared_embed_tile_widget.dart index 0da1294c..e4aef771 100644 --- a/lib/features/messaging/presentation/widgets/shared_embed_tile_widget.dart +++ b/lib/features/messaging/presentation/widgets/shared_embed_tile_widget.dart @@ -37,20 +37,28 @@ class SharedEmbedTileWidget extends StatelessWidget { tileColor: isSelected ? const Color(0xFF2F2F2F) : Colors.transparent, leading: ClipRRect( borderRadius: BorderRadius.circular(4), - child: embed.thumbnailUrl != null + child: (embed.thumbnailUrl != null && embed.thumbnailUrl!.isNotEmpty) ? Image.network( embed.thumbnailUrl!, width: 48, height: 48, fit: BoxFit.cover, + errorBuilder: (context, error, stackTrace) => Container( + width: 48, + height: 48, + color: const Color(0xFF2F2F2F), + child: embed.embedType == 'track' + ? const Icon(Icons.music_note, color: Colors.white54) + : const Icon(Icons.queue_music, color: Colors.white54), + ), ) : Container( width: 48, height: 48, - color: Color(0xFF2F2F2F), + color: const Color(0xFF2F2F2F), child: embed.embedType == 'track' - ? Icon(Icons.music_note, color: Colors.white54) - : Icon(Icons.queue_music, color: Colors.white54), + ? const Icon(Icons.music_note, color: Colors.white54) + : const Icon(Icons.queue_music, color: Colors.white54), ), ), title: Text( diff --git a/lib/features/premium/presentation/screens/cancellation_screen.dart b/lib/features/premium/presentation/screens/cancellation_screen.dart index 27df4b4c..854c65ba 100644 --- a/lib/features/premium/presentation/screens/cancellation_screen.dart +++ b/lib/features/premium/presentation/screens/cancellation_screen.dart @@ -113,7 +113,7 @@ class _CancellationScreenState extends ConsumerState { builder: (_) => _ConfirmDialog(), ); if (confirm != true || !mounted) return; - _timer?.cancel(); + setState(() => _isCanceled = true); await ref.read(premiumProvider.notifier).cancel(); } @@ -477,7 +477,7 @@ class _CancellationScreenState extends ConsumerState { elevation: 0, shape: const RoundedRectangleBorder(), ), - onPressed: () => context.push('/upgrade/plans'), + onPressed: () => context.go('/upgrade/plans'), child: Text( 'Resubscribe', style: GoogleFonts.inter( From 63510d58f3758fc37a8536b10a4f1cd0565e8522 Mon Sep 17 00:00:00 2001 From: biso Date: Sun, 3 May 2026 00:02:13 +0300 Subject: [PATCH 5/7] Fix: Some UI fixes --- lib/core/widget/likes_widget_sync_provider.dart | 1 - .../premium/presentation/screens/cancellation_screen.dart | 2 +- .../profile/presentation/pages/public_profile_page.dart | 5 ----- .../presentation/providers/fan_leaderboard_provider.dart | 4 +--- .../track/presentation/widgets/fans_leaderboard.dart | 5 +---- .../track/presentation/widgets/track_action_bar.dart | 5 +---- 6 files changed, 4 insertions(+), 18 deletions(-) diff --git a/lib/core/widget/likes_widget_sync_provider.dart b/lib/core/widget/likes_widget_sync_provider.dart index c21ce2c3..22a7e604 100644 --- a/lib/core/widget/likes_widget_sync_provider.dart +++ b/lib/core/widget/likes_widget_sync_provider.dart @@ -4,7 +4,6 @@ import '../../features/authentication/presentation/providers/auth_provider.dart' import '../../features/authentication/presentation/providers/auth_state.dart'; import '../../features/library/presentation/providers/library_providers.dart'; - final likesWidgetSyncProvider = NotifierProvider( LikesWidgetSyncNotifier.new, ); diff --git a/lib/features/premium/presentation/screens/cancellation_screen.dart b/lib/features/premium/presentation/screens/cancellation_screen.dart index 854c65ba..89af02ce 100644 --- a/lib/features/premium/presentation/screens/cancellation_screen.dart +++ b/lib/features/premium/presentation/screens/cancellation_screen.dart @@ -113,7 +113,7 @@ class _CancellationScreenState extends ConsumerState { builder: (_) => _ConfirmDialog(), ); if (confirm != true || !mounted) return; - + setState(() => _isCanceled = true); await ref.read(premiumProvider.notifier).cancel(); } diff --git a/lib/features/profile/presentation/pages/public_profile_page.dart b/lib/features/profile/presentation/pages/public_profile_page.dart index f33c437d..3dd0de4f 100644 --- a/lib/features/profile/presentation/pages/public_profile_page.dart +++ b/lib/features/profile/presentation/pages/public_profile_page.dart @@ -63,11 +63,6 @@ class _PublicProfilePageState extends ConsumerState { : widget.userId; Future.microtask(() async { - if (_resolvedUserId == 'me') { - final currentState = ref.read(ownProfileProvider); - if (currentState is ProfileLoaded) return; - } - if (_resolvedUserId == 'me') { await ref .read(ownProfileProvider.notifier) diff --git a/lib/features/track/presentation/providers/fan_leaderboard_provider.dart b/lib/features/track/presentation/providers/fan_leaderboard_provider.dart index fc2058f1..e6534581 100644 --- a/lib/features/track/presentation/providers/fan_leaderboard_provider.dart +++ b/lib/features/track/presentation/providers/fan_leaderboard_provider.dart @@ -27,7 +27,5 @@ final fanLeaderboardProvider = FutureProvider.family(( final period = ref.watch(fanLeaderboardPeriodProvider(trackId)); final useCase = ref.watch(getFanLeaderboardUseCaseProvider); - return useCase(trackId, period.value).timeout( - const Duration(seconds: 5), - ); + return useCase(trackId, period.value).timeout(const Duration(seconds: 5)); }); diff --git a/lib/features/track/presentation/widgets/fans_leaderboard.dart b/lib/features/track/presentation/widgets/fans_leaderboard.dart index 43522308..61bfaeda 100644 --- a/lib/features/track/presentation/widgets/fans_leaderboard.dart +++ b/lib/features/track/presentation/widgets/fans_leaderboard.dart @@ -137,10 +137,7 @@ class FansLeaderboard extends ConsumerWidget { child: CircularProgressIndicator(), ), error: (err, stack) => const Padding( - padding: EdgeInsets.symmetric( - vertical: 40.0, - horizontal: 24, - ), + padding: EdgeInsets.symmetric(vertical: 40.0, horizontal: 24), child: Text( "Leaderboard is currently unavailable. Please check back later.", style: TextStyle(color: AppTheme.textSecondary), diff --git a/lib/features/track/presentation/widgets/track_action_bar.dart b/lib/features/track/presentation/widgets/track_action_bar.dart index ea54afb9..06529ace 100644 --- a/lib/features/track/presentation/widgets/track_action_bar.dart +++ b/lib/features/track/presentation/widgets/track_action_bar.dart @@ -93,10 +93,7 @@ class TrackActionBar extends ConsumerWidget { Icons.chat_outlined, Formatters.formatCount(syncedTrack.commentCount), onTap: () { - context.push( - '/comments/${syncedTrack.id}', - extra: syncedTrack, - ); + context.push('/comments/${syncedTrack.id}', extra: syncedTrack); }, ), const SizedBox(width: 20), From 057159b32dda9e7e7e73c8ed204f7ed31319d73a Mon Sep 17 00:00:00 2001 From: biso Date: Sun, 3 May 2026 00:15:31 +0300 Subject: [PATCH 6/7] Fix: fixed the cancellation --- .../screens/cancellation_screen.dart | 28 ++++++++++++++++++- .../presentation/screens/checkout_screen.dart | 8 +++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/lib/features/premium/presentation/screens/cancellation_screen.dart b/lib/features/premium/presentation/screens/cancellation_screen.dart index 89af02ce..d487ed9b 100644 --- a/lib/features/premium/presentation/screens/cancellation_screen.dart +++ b/lib/features/premium/presentation/screens/cancellation_screen.dart @@ -477,7 +477,33 @@ class _CancellationScreenState extends ConsumerState { elevation: 0, shape: const RoundedRectangleBorder(), ), - onPressed: () => context.go('/upgrade/plans'), + onPressed: () { + final currentPlan = ref.read(premiumProvider).subscription?.plan; + final premiumPlans = ref.read(premiumProvider).plans.where((p) => p.isPremium).toList(); + + final targetPlan = currentPlan ?? (premiumPlans.isNotEmpty ? premiumPlans.first : null); + + if (targetPlan != null) { + context.go( + '/upgrade/checkout', + extra: { + 'planId': targetPlan.planId, + 'planName': targetPlan.name == 'premium' ? 'Artist Pro' : targetPlan.name, + 'price': targetPlan.price, + 'features': [ + 'Unlimited track uploads', + 'Unlimited playlists', + 'Offline listening', + 'No ads', + 'Priority support', + ], + }, + ); + } else { + // Fallback to plans if no plan found + context.go('/upgrade/plans'); + } + }, child: Text( 'Resubscribe', style: GoogleFonts.inter( diff --git a/lib/features/premium/presentation/screens/checkout_screen.dart b/lib/features/premium/presentation/screens/checkout_screen.dart index 75d8dc59..a3b3dd1c 100644 --- a/lib/features/premium/presentation/screens/checkout_screen.dart +++ b/lib/features/premium/presentation/screens/checkout_screen.dart @@ -89,7 +89,13 @@ class _CheckoutScreenState extends ConsumerState { color: Colors.white, size: 18, ), - onPressed: () => Navigator.pop(context), + onPressed: () { + if (context.canPop()) { + context.pop(); + } else { + context.go('/upgrade/plans'); + } + }, ), title: Text( 'Complete your order', From bd88e0b8c5d956e7535afcf307f2811b8046ba42 Mon Sep 17 00:00:00 2001 From: biso Date: Sun, 3 May 2026 00:16:26 +0300 Subject: [PATCH 7/7] format --- .../screens/cancellation_screen.dart | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/lib/features/premium/presentation/screens/cancellation_screen.dart b/lib/features/premium/presentation/screens/cancellation_screen.dart index d487ed9b..2243b7d7 100644 --- a/lib/features/premium/presentation/screens/cancellation_screen.dart +++ b/lib/features/premium/presentation/screens/cancellation_screen.dart @@ -478,17 +478,30 @@ class _CancellationScreenState extends ConsumerState { shape: const RoundedRectangleBorder(), ), onPressed: () { - final currentPlan = ref.read(premiumProvider).subscription?.plan; - final premiumPlans = ref.read(premiumProvider).plans.where((p) => p.isPremium).toList(); - - final targetPlan = currentPlan ?? (premiumPlans.isNotEmpty ? premiumPlans.first : null); - + final currentPlan = ref + .read(premiumProvider) + .subscription + ?.plan; + final premiumPlans = ref + .read(premiumProvider) + .plans + .where((p) => p.isPremium) + .toList(); + + final targetPlan = + currentPlan ?? + (premiumPlans.isNotEmpty + ? premiumPlans.first + : null); + if (targetPlan != null) { context.go( '/upgrade/checkout', extra: { 'planId': targetPlan.planId, - 'planName': targetPlan.name == 'premium' ? 'Artist Pro' : targetPlan.name, + 'planName': targetPlan.name == 'premium' + ? 'Artist Pro' + : targetPlan.name, 'price': targetPlan.price, 'features': [ 'Unlimited track uploads',