From 98fabafbdbd62f2e929d22993338d4628d61a72e Mon Sep 17 00:00:00 2001 From: tommyxchow Date: Sat, 15 Jan 2022 13:16:43 -0500 Subject: [PATCH] Tweak search results error handling --- lib/api/twitch_api.dart | 15 +++++++++------ .../home/search/search_results_categories.dart | 6 +++--- .../home/search/search_results_channels.dart | 12 +++++++----- lib/screens/home/stores/search_store.dart | 12 +++--------- 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/lib/api/twitch_api.dart b/lib/api/twitch_api.dart index c75b3981..c6f7d715 100644 --- a/lib/api/twitch_api.dart +++ b/lib/api/twitch_api.dart @@ -243,16 +243,18 @@ class TwitchApi { final url = Uri.parse(id != null ? 'https://api.twitch.tv/helix/users?id=$id' : 'https://api.twitch.tv/helix/users?login=$userLogin'); final response = await _client.get(url, headers: headers); + final decoded = jsonDecode(response.body); + if (response.statusCode == 200) { - final userData = jsonDecode(response.body)['data'] as List; + final userData = decoded['data'] as List; if (userData.isNotEmpty) { return UserTwitch.fromJson(userData.first); } else { - throw Exception('User does not exist.'); + return Future.error('User does not exist'); } } else { - throw Exception('Failed to get user.'); + return Future.error('Failed to get user: ${decoded['message']}'); } } @@ -264,16 +266,17 @@ class TwitchApi { final url = Uri.parse('https://api.twitch.tv/helix/channels?broadcaster_id=$userId'); final response = await _client.get(url, headers: headers); + final decoded = jsonDecode(response.body); if (response.statusCode == 200) { - final channelData = jsonDecode(response.body)['data'] as List; + final channelData = decoded['data'] as List; if (channelData.isNotEmpty) { return Channel.fromJson(channelData.first); } else { - throw Exception('Channel does not exist'); + return Future.error('Channel does not exist'); } } else { - throw Exception('Failed to get channel.'); + return Future.error('Failed to get channel: ${decoded['message']}'); } } diff --git a/lib/screens/home/search/search_results_categories.dart b/lib/screens/home/search/search_results_categories.dart index b86a28ce..579e2581 100644 --- a/lib/screens/home/search/search_results_categories.dart +++ b/lib/screens/home/search/search_results_categories.dart @@ -27,7 +27,7 @@ class SearchResultsCategories extends StatelessWidget { case FutureStatus.rejected: return const SliverToBoxAdapter( child: Center( - child: Text('Failed to get categories.'), + child: Text('Failed to get categories'), ), ); case FutureStatus.fulfilled: @@ -36,7 +36,7 @@ class SearchResultsCategories extends StatelessWidget { if (categories == null) { return const SliverToBoxAdapter( child: Center( - child: Text('Failed to get categories.'), + child: Text('Failed to get categories'), ), ); } @@ -45,7 +45,7 @@ class SearchResultsCategories extends StatelessWidget { return const SliverToBoxAdapter( child: SizedBox( height: 100.0, - child: Center(child: Text('No matching categories.')), + child: Center(child: Text('No matching categories')), ), ); } diff --git a/lib/screens/home/search/search_results_channels.dart b/lib/screens/home/search/search_results_channels.dart index e1d9938d..2f0bbdb7 100644 --- a/lib/screens/home/search/search_results_channels.dart +++ b/lib/screens/home/search/search_results_channels.dart @@ -33,7 +33,7 @@ class SearchResultsChannels extends StatelessWidget { context, MaterialPageRoute( builder: (context) => VideoChat( - displayName: channelInfo!.broadcasterName, + displayName: channelInfo.broadcasterName, chatStore: ChatStore( chatDetailsStore: ChatDetailsStore( twitchApi: context.read(), @@ -52,8 +52,8 @@ class SearchResultsChannels extends StatelessWidget { ), ); } catch (e) { - const snackBar = SnackBar( - content: Text('Failed to get channel info :('), + final snackBar = SnackBar( + content: Text(e.toString()), behavior: SnackBarBehavior.floating, ); ScaffoldMessenger.of(context).showSnackBar(snackBar); @@ -76,7 +76,7 @@ class SearchResultsChannels extends StatelessWidget { case FutureStatus.rejected: return const SliverToBoxAdapter( child: Center( - child: Text('Failed to fetch streams.'), + child: Text('Failed to get channels'), ), ); case FutureStatus.fulfilled: @@ -101,7 +101,9 @@ class SearchResultsChannels extends StatelessWidget { ), ) : null, - subtitle: channel.isLive ? Text('Uptime: ${DateTime.now().difference(DateTime.parse(channel.startedAt)).toString().split('.')[0]}') : null, + subtitle: channel.isLive + ? Text('Uptime: ${DateTime.now().difference(DateTime.parse(channel.startedAt)).toString().split('.')[0]}') + : null, onTap: () => Navigator.push( context, MaterialPageRoute( diff --git a/lib/screens/home/stores/search_store.dart b/lib/screens/home/stores/search_store.dart index c5c52eaf..8b26ac85 100644 --- a/lib/screens/home/stores/search_store.dart +++ b/lib/screens/home/stores/search_store.dart @@ -1,4 +1,3 @@ -import 'package:flutter/material.dart'; import 'package:frosty/api/twitch_api.dart'; import 'package:frosty/core/auth/auth_store.dart'; import 'package:frosty/models/category.dart'; @@ -68,13 +67,8 @@ abstract class _SearchStoreBase with Store { .asObservable(); } - Future searchChannel(String query) async { - try { - final user = await twitchApi.getUser(userLogin: query, headers: authStore.headersTwitch); - return await twitchApi.getChannel(userId: user!.id, headers: authStore.headersTwitch); - } catch (e) { - debugPrint(e.toString()); - rethrow; - } + Future searchChannel(String query) async { + final user = await twitchApi.getUser(userLogin: query, headers: authStore.headersTwitch); + return await twitchApi.getChannel(userId: user.id, headers: authStore.headersTwitch); } }