feat(ui): Stub out a manga tracking page

This commit is contained in:
2023-02-04 11:48:24 +01:00
parent d273a6deb2
commit a60e9e8e81
8 changed files with 134 additions and 29 deletions

View File

@@ -1,10 +1,12 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:anitrack/src/data/anime.dart';
import 'package:anitrack/src/data/type.dart';
import 'package:anitrack/src/ui/bloc/anime_list_bloc.dart';
import 'package:anitrack/src/ui/bloc/anime_search_bloc.dart';
import 'package:anitrack/src/ui/constants.dart';
import 'package:anitrack/src/ui/widgets/anime.dart';
import 'package:bottom_bar/bottom_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class AnimeListPage extends StatelessWidget {
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
@@ -14,13 +16,24 @@ class AnimeListPage extends StatelessWidget {
),
);
final PageController _controller = PageController();
String _getPageTitle(TrackingMediumType type) {
switch (type) {
case TrackingMediumType.anime: return 'Anime';
case TrackingMediumType.manga: return 'Manga';
}
}
@override
Widget build(BuildContext context) {
return BlocBuilder<AnimeListBloc, AnimeListState>(
builder: (context, state) {
return Scaffold(
appBar: AppBar(
title: Text('Animes'),
title: Text(
_getPageTitle(state.trackingType)
),
actions: [
PopupMenuButton(
icon: Icon(
@@ -57,28 +70,34 @@ class AnimeListPage extends StatelessWidget {
),
],
),
body: ListView.builder(
itemCount: state.animes.length,
itemBuilder: (context, index) {
final anime = state.animes[index];
if (state.filterState != AnimeTrackingState.all) {
if (anime.state != state.filterState) return Container();
}
body: PageView(
controller: _controller,
children: [
ListView.builder(
itemCount: state.animes.length,
itemBuilder: (context, index) {
final anime = state.animes[index];
if (state.filterState != AnimeTrackingState.all) {
if (anime.state != state.filterState) return Container();
}
return AnimeListWidget(
data: anime,
onLeftSwipe: () {
context.read<AnimeListBloc>().add(
AnimeEpisodeDecrementedEvent(state.animes[index].id),
return AnimeListWidget(
data: anime,
onLeftSwipe: () {
context.read<AnimeListBloc>().add(
AnimeEpisodeDecrementedEvent(state.animes[index].id),
);
},
onRightSwipe: () {
context.read<AnimeListBloc>().add(
AnimeEpisodeIncrementedEvent(state.animes[index].id),
);
},
);
},
onRightSwipe: () {
context.read<AnimeListBloc>().add(
AnimeEpisodeIncrementedEvent(state.animes[index].id),
);
},
);
},
),
Placeholder(),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
@@ -89,6 +108,33 @@ class AnimeListPage extends StatelessWidget {
tooltip: 'Increment',
child: const Icon(Icons.add),
),
bottomNavigationBar: BottomBar(
selectedIndex: state.trackingType == TrackingMediumType.anime ?
0 :
1,
onTap: (int index) {
_controller.jumpToPage(index);
context.read<AnimeListBloc>().add(
AnimeTrackingTypeChanged(
index == 0 ?
TrackingMediumType.anime :
TrackingMediumType.manga,
),
);
},
items: <BottomBarItem>[
BottomBarItem(
icon: Icon(Icons.tv),
title: Text('Anime'),
activeColor: Colors.blue,
),
BottomBarItem(
icon: Icon(Icons.auto_stories),
title: Text('Manga'),
activeColor: Colors.red,
),
],
),
);
},
);