From 0a729fbfa7da640cbca82ba42c1f6b1995d901ff Mon Sep 17 00:00:00 2001 From: Tommy Chow Date: Sun, 2 Jan 2022 22:52:57 -0500 Subject: [PATCH] Combine top streams and categories into one tab --- lib/main.dart | 8 ++- .../followed_streams.dart | 4 +- .../followed_streams_store.dart | 0 .../followed_streams_store.g.dart | 0 lib/screens/home/home.dart | 53 ++++++++++--------- lib/screens/home/home_store.dart | 17 ------ lib/screens/home/home_store.g.dart | 47 ---------------- .../search/search_results_categories.dart | 2 +- .../{ => top}/categories/categories.dart | 4 +- .../categories/categories_store.dart | 0 .../categories/categories_store.g.dart | 0 .../{ => top}/categories/category_card.dart | 4 +- .../category_streams.dart | 4 +- .../category_streams_store.dart | 0 .../category_streams_store.g.dart | 0 .../streams}/top_streams.dart | 4 +- .../streams}/top_streams_store.dart | 0 .../streams}/top_streams_store.g.dart | 0 lib/screens/top/top_section.dart | 41 ++++++++++++++ .../stream_list => widgets}/stream_card.dart | 0 20 files changed, 84 insertions(+), 104 deletions(-) rename lib/screens/{stream_list/streams_followed => followed_streams}/followed_streams.dart (87%) rename lib/screens/{stream_list/streams_followed => followed_streams}/followed_streams_store.dart (100%) rename lib/screens/{stream_list/streams_followed => followed_streams}/followed_streams_store.g.dart (100%) delete mode 100644 lib/screens/home/home_store.dart delete mode 100644 lib/screens/home/home_store.g.dart rename lib/screens/{ => top}/categories/categories.dart (86%) rename lib/screens/{ => top}/categories/categories_store.dart (100%) rename lib/screens/{ => top}/categories/categories_store.g.dart (100%) rename lib/screens/{ => top}/categories/category_card.dart (90%) rename lib/screens/{ => top}/categories/category_streams_list/category_streams.dart (93%) rename lib/screens/{ => top}/categories/category_streams_list/category_streams_store.dart (100%) rename lib/screens/{ => top}/categories/category_streams_list/category_streams_store.g.dart (100%) rename lib/screens/{stream_list/streams_top => top/streams}/top_streams.dart (87%) rename lib/screens/{stream_list/streams_top => top/streams}/top_streams_store.dart (100%) rename lib/screens/{stream_list/streams_top => top/streams}/top_streams_store.g.dart (100%) create mode 100644 lib/screens/top/top_section.dart rename lib/{screens/stream_list => widgets}/stream_card.dart (100%) diff --git a/lib/main.dart b/lib/main.dart index c343e874..2ccb43af 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,12 +4,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/core/auth/auth_store.dart'; import 'package:frosty/core/settings/settings_store.dart'; -import 'package:frosty/screens/categories/categories_store.dart'; +import 'package:frosty/screens/followed_streams/followed_streams_store.dart'; import 'package:frosty/screens/home/home.dart'; -import 'package:frosty/screens/home/home_store.dart'; import 'package:frosty/screens/search/search_store.dart'; -import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart'; -import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart'; +import 'package:frosty/screens/top/categories/categories_store.dart'; +import 'package:frosty/screens/top/streams/top_streams_store.dart'; import 'package:provider/provider.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -86,7 +85,6 @@ class MyApp extends StatelessWidget { title: 'Frosty', theme: settingsStore.oledTheme ? oledTheme : defaultTheme, home: Home( - homeStore: HomeStore(), topStreamsStore: TopStreamsStore(authStore: authStore), followedStreamsStore: FollowedStreamsStore(authStore: authStore), categoriesStore: CategoriesStore(authStore: authStore), diff --git a/lib/screens/stream_list/streams_followed/followed_streams.dart b/lib/screens/followed_streams/followed_streams.dart similarity index 87% rename from lib/screens/stream_list/streams_followed/followed_streams.dart rename to lib/screens/followed_streams/followed_streams.dart index 72872daf..fded8986 100644 --- a/lib/screens/stream_list/streams_followed/followed_streams.dart +++ b/lib/screens/followed_streams/followed_streams.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/screens/stream_list/stream_card.dart'; -import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart'; +import 'package:frosty/screens/followed_streams/followed_streams_store.dart'; import 'package:frosty/widgets/loading_indicator.dart'; +import 'package:frosty/widgets/stream_card.dart'; class FollowedStreams extends StatelessWidget { final FollowedStreamsStore store; diff --git a/lib/screens/stream_list/streams_followed/followed_streams_store.dart b/lib/screens/followed_streams/followed_streams_store.dart similarity index 100% rename from lib/screens/stream_list/streams_followed/followed_streams_store.dart rename to lib/screens/followed_streams/followed_streams_store.dart diff --git a/lib/screens/stream_list/streams_followed/followed_streams_store.g.dart b/lib/screens/followed_streams/followed_streams_store.g.dart similarity index 100% rename from lib/screens/stream_list/streams_followed/followed_streams_store.g.dart rename to lib/screens/followed_streams/followed_streams_store.g.dart diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index 6a7e8533..accfc198 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -3,19 +3,16 @@ import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:frosty/core/auth/auth_store.dart'; import 'package:frosty/core/settings/settings.dart'; import 'package:frosty/core/settings/settings_store.dart'; -import 'package:frosty/screens/categories/categories.dart'; -import 'package:frosty/screens/categories/categories_store.dart'; -import 'package:frosty/screens/home/home_store.dart'; +import 'package:frosty/screens/followed_streams/followed_streams.dart'; +import 'package:frosty/screens/followed_streams/followed_streams_store.dart'; import 'package:frosty/screens/search/search.dart'; import 'package:frosty/screens/search/search_store.dart'; -import 'package:frosty/screens/stream_list/streams_followed/followed_streams.dart'; -import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart'; -import 'package:frosty/screens/stream_list/streams_top/top_streams.dart'; -import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart'; +import 'package:frosty/screens/top/categories/categories_store.dart'; +import 'package:frosty/screens/top/streams/top_streams_store.dart'; +import 'package:frosty/screens/top/top_section.dart'; import 'package:provider/provider.dart'; -class Home extends StatelessWidget { - final HomeStore homeStore; +class Home extends StatefulWidget { final TopStreamsStore topStreamsStore; final FollowedStreamsStore followedStreamsStore; final CategoriesStore categoriesStore; @@ -23,13 +20,27 @@ class Home extends StatelessWidget { const Home({ Key? key, - required this.homeStore, required this.topStreamsStore, required this.followedStreamsStore, required this.categoriesStore, required this.searchStore, }) : super(key: key); + @override + _HomeState createState() => _HomeState(); +} + +class _HomeState extends State { + int _selectedIndex = 0; + + void _handleTap(int index) { + if (index != _selectedIndex) { + setState(() { + _selectedIndex = index; + }); + } + } + @override Widget build(BuildContext context) { final authStore = context.read(); @@ -41,12 +52,11 @@ class Home extends StatelessWidget { builder: (_) { final titles = [ if (authStore.isLoggedIn) 'Followed Streams', - 'Top Streams', - 'Categories', + 'Top', 'Search', ]; return Text( - titles[homeStore.selectedIndex], + titles[_selectedIndex], ); }, ), @@ -70,12 +80,11 @@ class Home extends StatelessWidget { child: Observer( builder: (_) { return IndexedStack( - index: homeStore.selectedIndex, + index: _selectedIndex, children: [ - if (authStore.isLoggedIn) FollowedStreams(store: followedStreamsStore), - TopStreams(store: topStreamsStore), - Categories(store: categoriesStore), - Search(searchStore: searchStore), + if (authStore.isLoggedIn) FollowedStreams(store: widget.followedStreamsStore), + TopSection(topStreamsStore: widget.topStreamsStore, categoriesStore: widget.categoriesStore), + Search(searchStore: widget.searchStore), ], ); }, @@ -95,17 +104,13 @@ class Home extends StatelessWidget { icon: Icon(Icons.arrow_upward), label: 'Top', ), - const BottomNavigationBarItem( - icon: Icon(Icons.games), - label: 'Categories', - ), const BottomNavigationBarItem( icon: Icon(Icons.search), label: 'Search', ), ], - currentIndex: homeStore.selectedIndex, - onTap: homeStore.handleTap, + currentIndex: _selectedIndex, + onTap: _handleTap, ); }, ), diff --git a/lib/screens/home/home_store.dart b/lib/screens/home/home_store.dart deleted file mode 100644 index 490f10fa..00000000 --- a/lib/screens/home/home_store.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:mobx/mobx.dart'; - -part 'home_store.g.dart'; - -class HomeStore = _HomeStoreBase with _$HomeStore; - -abstract class _HomeStoreBase with Store { - @observable - int selectedIndex = 0; - - @action - void handleTap(int index) { - if (index != selectedIndex) { - selectedIndex = index; - } - } -} diff --git a/lib/screens/home/home_store.g.dart b/lib/screens/home/home_store.g.dart deleted file mode 100644 index 4ede59d0..00000000 --- a/lib/screens/home/home_store.g.dart +++ /dev/null @@ -1,47 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'home_store.dart'; - -// ************************************************************************** -// StoreGenerator -// ************************************************************************** - -// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic - -mixin _$HomeStore on _HomeStoreBase, Store { - final _$selectedIndexAtom = Atom(name: '_HomeStoreBase.selectedIndex'); - - @override - int get selectedIndex { - _$selectedIndexAtom.reportRead(); - return super.selectedIndex; - } - - @override - set selectedIndex(int value) { - _$selectedIndexAtom.reportWrite(value, super.selectedIndex, () { - super.selectedIndex = value; - }); - } - - final _$_HomeStoreBaseActionController = - ActionController(name: '_HomeStoreBase'); - - @override - void handleTap(int index) { - final _$actionInfo = _$_HomeStoreBaseActionController.startAction( - name: '_HomeStoreBase.handleTap'); - try { - return super.handleTap(index); - } finally { - _$_HomeStoreBaseActionController.endAction(_$actionInfo); - } - } - - @override - String toString() { - return ''' -selectedIndex: ${selectedIndex} - '''; - } -} diff --git a/lib/screens/search/search_results_categories.dart b/lib/screens/search/search_results_categories.dart index f6ead7f2..bb8559e9 100644 --- a/lib/screens/search/search_results_categories.dart +++ b/lib/screens/search/search_results_categories.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:frosty/models/category.dart'; -import 'package:frosty/screens/categories/category_card.dart'; +import 'package:frosty/screens/top/categories/category_card.dart'; class SearchResultsCategories extends StatelessWidget { final List categories; diff --git a/lib/screens/categories/categories.dart b/lib/screens/top/categories/categories.dart similarity index 86% rename from lib/screens/categories/categories.dart rename to lib/screens/top/categories/categories.dart index ff3b4805..8ef77673 100644 --- a/lib/screens/categories/categories.dart +++ b/lib/screens/top/categories/categories.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/screens/categories/categories_store.dart'; -import 'package:frosty/screens/categories/category_card.dart'; +import 'package:frosty/screens/top/categories/categories_store.dart'; +import 'package:frosty/screens/top/categories/category_card.dart'; class Categories extends StatelessWidget { final CategoriesStore store; diff --git a/lib/screens/categories/categories_store.dart b/lib/screens/top/categories/categories_store.dart similarity index 100% rename from lib/screens/categories/categories_store.dart rename to lib/screens/top/categories/categories_store.dart diff --git a/lib/screens/categories/categories_store.g.dart b/lib/screens/top/categories/categories_store.g.dart similarity index 100% rename from lib/screens/categories/categories_store.g.dart rename to lib/screens/top/categories/categories_store.g.dart diff --git a/lib/screens/categories/category_card.dart b/lib/screens/top/categories/category_card.dart similarity index 90% rename from lib/screens/categories/category_card.dart rename to lib/screens/top/categories/category_card.dart index 1612afc3..322ea5d0 100644 --- a/lib/screens/categories/category_card.dart +++ b/lib/screens/top/categories/category_card.dart @@ -2,8 +2,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:frosty/core/auth/auth_store.dart'; import 'package:frosty/models/category.dart'; -import 'package:frosty/screens/categories/category_streams_list/category_streams.dart'; -import 'package:frosty/screens/categories/category_streams_list/category_streams_store.dart'; +import 'package:frosty/screens/top/categories/category_streams_list/category_streams.dart'; +import 'package:frosty/screens/top/categories/category_streams_list/category_streams_store.dart'; import 'package:provider/provider.dart'; /// A tappable card widget that displays a category's box art and name. diff --git a/lib/screens/categories/category_streams_list/category_streams.dart b/lib/screens/top/categories/category_streams_list/category_streams.dart similarity index 93% rename from lib/screens/categories/category_streams_list/category_streams.dart rename to lib/screens/top/categories/category_streams_list/category_streams.dart index 47ecbab7..ae691f97 100644 --- a/lib/screens/categories/category_streams_list/category_streams.dart +++ b/lib/screens/top/categories/category_streams_list/category_streams.dart @@ -1,8 +1,8 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/screens/categories/category_streams_list/category_streams_store.dart'; -import 'package:frosty/screens/stream_list/stream_card.dart'; +import 'package:frosty/screens/top/categories/category_streams_list/category_streams_store.dart'; +import 'package:frosty/widgets/stream_card.dart'; class CategoryStreams extends StatelessWidget { final CategoryStreamsStore store; diff --git a/lib/screens/categories/category_streams_list/category_streams_store.dart b/lib/screens/top/categories/category_streams_list/category_streams_store.dart similarity index 100% rename from lib/screens/categories/category_streams_list/category_streams_store.dart rename to lib/screens/top/categories/category_streams_list/category_streams_store.dart diff --git a/lib/screens/categories/category_streams_list/category_streams_store.g.dart b/lib/screens/top/categories/category_streams_list/category_streams_store.g.dart similarity index 100% rename from lib/screens/categories/category_streams_list/category_streams_store.g.dart rename to lib/screens/top/categories/category_streams_list/category_streams_store.g.dart diff --git a/lib/screens/stream_list/streams_top/top_streams.dart b/lib/screens/top/streams/top_streams.dart similarity index 87% rename from lib/screens/stream_list/streams_top/top_streams.dart rename to lib/screens/top/streams/top_streams.dart index 61242af8..f3b4fba9 100644 --- a/lib/screens/stream_list/streams_top/top_streams.dart +++ b/lib/screens/top/streams/top_streams.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; -import 'package:frosty/screens/stream_list/stream_card.dart'; -import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart'; +import 'package:frosty/screens/top/streams/top_streams_store.dart'; import 'package:frosty/widgets/loading_indicator.dart'; +import 'package:frosty/widgets/stream_card.dart'; class TopStreams extends StatelessWidget { final TopStreamsStore store; diff --git a/lib/screens/stream_list/streams_top/top_streams_store.dart b/lib/screens/top/streams/top_streams_store.dart similarity index 100% rename from lib/screens/stream_list/streams_top/top_streams_store.dart rename to lib/screens/top/streams/top_streams_store.dart diff --git a/lib/screens/stream_list/streams_top/top_streams_store.g.dart b/lib/screens/top/streams/top_streams_store.g.dart similarity index 100% rename from lib/screens/stream_list/streams_top/top_streams_store.g.dart rename to lib/screens/top/streams/top_streams_store.g.dart diff --git a/lib/screens/top/top_section.dart b/lib/screens/top/top_section.dart new file mode 100644 index 00000000..9a0cb77e --- /dev/null +++ b/lib/screens/top/top_section.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:frosty/screens/top/categories/categories.dart'; +import 'package:frosty/screens/top/categories/categories_store.dart'; +import 'package:frosty/screens/top/streams/top_streams.dart'; +import 'package:frosty/screens/top/streams/top_streams_store.dart'; + +class TopSection extends StatelessWidget { + final TopStreamsStore topStreamsStore; + final CategoriesStore categoriesStore; + + const TopSection({ + Key? key, + required this.topStreamsStore, + required this.categoriesStore, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 2, + child: Column( + children: [ + const TabBar( + tabs: [ + Tab(text: 'Streams'), + Tab(text: 'Categories'), + ], + ), + Expanded( + child: TabBarView( + children: [ + TopStreams(store: topStreamsStore), + Categories(store: categoriesStore), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/screens/stream_list/stream_card.dart b/lib/widgets/stream_card.dart similarity index 100% rename from lib/screens/stream_list/stream_card.dart rename to lib/widgets/stream_card.dart