Combine top streams and categories into one tab

This commit is contained in:
Tommy Chow 2022-01-02 22:52:57 -05:00
parent 8102ea6185
commit 0a729fbfa7
20 changed files with 84 additions and 104 deletions

View file

@ -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),

View file

@ -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;

View file

@ -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<Home> {
int _selectedIndex = 0;
void _handleTap(int index) {
if (index != _selectedIndex) {
setState(() {
_selectedIndex = index;
});
}
}
@override
Widget build(BuildContext context) {
final authStore = context.read<AuthStore>();
@ -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,
);
},
),

View file

@ -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;
}
}
}

View file

@ -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}
''';
}
}

View file

@ -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<CategoryTwitch> categories;

View file

@ -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;

View file

@ -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.

View file

@ -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;

View file

@ -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;

View file

@ -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),
],
),
),
],
),
);
}
}