chore: Format code
This commit is contained in:
@@ -2085,7 +2085,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''',
|
|||||||
homepage: 'https://github.com/fluttercommunity/get_it',
|
homepage: 'https://github.com/fluttercommunity/get_it',
|
||||||
authors: [
|
authors: [
|
||||||
'Flutter Community <community@flutter.zone>',
|
'Flutter Community <community@flutter.zone>',
|
||||||
'Thomas Burkhart <burkhartsengineering@gmail.com>'
|
'Thomas Burkhart <burkhartsengineering@gmail.com>',
|
||||||
],
|
],
|
||||||
version: '7.2.0',
|
version: '7.2.0',
|
||||||
license: '''MIT License
|
license: '''MIT License
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ void main() async {
|
|||||||
|
|
||||||
// Load animes
|
// Load animes
|
||||||
GetIt.I.get<AnimeListBloc>().add(
|
GetIt.I.get<AnimeListBloc>().add(
|
||||||
AnimesLoadedEvent(),
|
AnimesLoadedEvent(),
|
||||||
);
|
);
|
||||||
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
await LocaleSettings.useDeviceLocale();
|
await LocaleSettings.useDeviceLocale();
|
||||||
|
|||||||
@@ -123,7 +123,10 @@ class DatabaseService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<AnimeTrackingData> incrementAnimeWatchCounter(AnimeTrackingData data, int value) async {
|
Future<AnimeTrackingData> incrementAnimeWatchCounter(
|
||||||
|
AnimeTrackingData data,
|
||||||
|
int value,
|
||||||
|
) async {
|
||||||
final result = await _db.rawQuery(
|
final result = await _db.rawQuery(
|
||||||
'UPDATE $animeTable SET episodesWatched = episodesWatched + $value WHERE id = ? RETURNING *',
|
'UPDATE $animeTable SET episodesWatched = episodesWatched + $value WHERE id = ? RETURNING *',
|
||||||
[
|
[
|
||||||
@@ -171,7 +174,10 @@ class DatabaseService {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<MangaTrackingData> incrementMangaReadChapters(MangaTrackingData data, int value) async {
|
Future<MangaTrackingData> incrementMangaReadChapters(
|
||||||
|
MangaTrackingData data,
|
||||||
|
int value,
|
||||||
|
) async {
|
||||||
final result = await _db.rawQuery(
|
final result = await _db.rawQuery(
|
||||||
'UPDATE $mangaTable SET episodesWatched = chaptersRead + $value WHERE id = ? RETURNING *',
|
'UPDATE $mangaTable SET episodesWatched = chaptersRead + $value WHERE id = ? RETURNING *',
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -31,10 +31,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Internal anime state
|
/// Internal anime state
|
||||||
final List<AnimeTrackingData> _animes =
|
final List<AnimeTrackingData> _animes = List<AnimeTrackingData>.empty(
|
||||||
List<AnimeTrackingData>.empty(growable: true);
|
growable: true,
|
||||||
final List<MangaTrackingData> _mangas =
|
);
|
||||||
List<MangaTrackingData>.empty(growable: true);
|
final List<MangaTrackingData> _mangas = List<MangaTrackingData>.empty(
|
||||||
|
growable: true,
|
||||||
|
);
|
||||||
|
|
||||||
List<AnimeTrackingData> get unfilteredAnime => _animes;
|
List<AnimeTrackingData> get unfilteredAnime => _animes;
|
||||||
|
|
||||||
@@ -69,7 +71,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
if (event.checkIfExists) {
|
if (event.checkIfExists) {
|
||||||
final shouldAdd =
|
final shouldAdd =
|
||||||
_animes.firstWhereOrNull((element) => element.id == event.data.id) ==
|
_animes.firstWhereOrNull((element) => element.id == event.data.id) ==
|
||||||
null;
|
null;
|
||||||
if (shouldAdd) {
|
if (shouldAdd) {
|
||||||
_animes.add(event.data);
|
_animes.add(event.data);
|
||||||
}
|
}
|
||||||
@@ -96,7 +98,7 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
if (event.checkIfExists) {
|
if (event.checkIfExists) {
|
||||||
final shouldAdd =
|
final shouldAdd =
|
||||||
_mangas.firstWhereOrNull((element) => element.id == event.data.id) ==
|
_mangas.firstWhereOrNull((element) => element.id == event.data.id) ==
|
||||||
null;
|
null;
|
||||||
if (shouldAdd) {
|
if (shouldAdd) {
|
||||||
_mangas.add(event.data);
|
_mangas.add(event.data);
|
||||||
}
|
}
|
||||||
@@ -120,9 +122,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
|
|
||||||
final anime = state.animes[index];
|
final anime = state.animes[index];
|
||||||
if (anime.episodesTotal != null &&
|
if (anime.episodesTotal != null &&
|
||||||
anime.episodesWatched + 1 > anime.episodesTotal!) return;
|
anime.episodesWatched + 1 > anime.episodesTotal!)
|
||||||
|
return;
|
||||||
|
|
||||||
final newAnime = await GetIt.I.get<DatabaseService>().incrementAnimeWatchCounter(anime, 1);
|
final newAnime = await GetIt.I
|
||||||
|
.get<DatabaseService>()
|
||||||
|
.incrementAnimeWatchCounter(anime, 1);
|
||||||
final newList = List<AnimeTrackingData>.from(state.animes);
|
final newList = List<AnimeTrackingData>.from(state.animes);
|
||||||
newList[index] = newAnime;
|
newList[index] = newAnime;
|
||||||
emit(
|
emit(
|
||||||
@@ -142,8 +147,9 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
final anime = state.animes[index];
|
final anime = state.animes[index];
|
||||||
if (anime.episodesWatched - 1 < 0) return;
|
if (anime.episodesWatched - 1 < 0) return;
|
||||||
|
|
||||||
|
final newAnime = await GetIt.I
|
||||||
final newAnime = await GetIt.I.get<DatabaseService>().incrementAnimeWatchCounter(anime, -1);
|
.get<DatabaseService>()
|
||||||
|
.incrementAnimeWatchCounter(anime, -1);
|
||||||
final newList = List<AnimeTrackingData>.from(state.animes);
|
final newList = List<AnimeTrackingData>.from(state.animes);
|
||||||
newList[index] = newAnime;
|
newList[index] = newAnime;
|
||||||
emit(
|
emit(
|
||||||
@@ -217,9 +223,12 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
|
|
||||||
final manga = state.mangas[index];
|
final manga = state.mangas[index];
|
||||||
if (manga.chaptersTotal != null &&
|
if (manga.chaptersTotal != null &&
|
||||||
manga.chaptersRead + 1 > manga.chaptersTotal!) return;
|
manga.chaptersRead + 1 > manga.chaptersTotal!)
|
||||||
|
return;
|
||||||
|
|
||||||
final newManga = await GetIt.I.get<DatabaseService>().incrementMangaReadChapters(manga, 1);
|
final newManga = await GetIt.I
|
||||||
|
.get<DatabaseService>()
|
||||||
|
.incrementMangaReadChapters(manga, 1);
|
||||||
final newList = List<MangaTrackingData>.from(state.mangas);
|
final newList = List<MangaTrackingData>.from(state.mangas);
|
||||||
newList[index] = newManga;
|
newList[index] = newManga;
|
||||||
emit(
|
emit(
|
||||||
@@ -244,7 +253,9 @@ class AnimeListBloc extends Bloc<AnimeListEvent, AnimeListState> {
|
|||||||
final manga = state.mangas[index];
|
final manga = state.mangas[index];
|
||||||
if (manga.chaptersRead - 1 < 0) return;
|
if (manga.chaptersRead - 1 < 0) return;
|
||||||
|
|
||||||
final newManga = await GetIt.I.get<DatabaseService>().incrementMangaReadChapters(manga, -1);
|
final newManga = await GetIt.I
|
||||||
|
.get<DatabaseService>()
|
||||||
|
.incrementMangaReadChapters(manga, -1);
|
||||||
final newList = List<MangaTrackingData>.from(state.mangas);
|
final newList = List<MangaTrackingData>.from(state.mangas);
|
||||||
newList[index] = newManga;
|
newList[index] = newManga;
|
||||||
emit(
|
emit(
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ class AnimeSearchBloc extends Bloc<AnimeSearchEvent, AnimeSearchState> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
GetIt.I.get<NavigationBloc>().add(
|
GetIt.I.get<NavigationBloc>().add(
|
||||||
PushedNamedEvent(
|
PushedNamedEvent(
|
||||||
const NavigationDestination(animeSearchRoute),
|
const NavigationDestination(animeSearchRoute),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onQueryChanged(
|
Future<void> _onQueryChanged(
|
||||||
@@ -122,34 +122,34 @@ class AnimeSearchBloc extends Bloc<AnimeSearchEvent, AnimeSearchState> {
|
|||||||
Emitter<AnimeSearchState> emit,
|
Emitter<AnimeSearchState> emit,
|
||||||
) async {
|
) async {
|
||||||
GetIt.I.get<list.AnimeListBloc>().add(
|
GetIt.I.get<list.AnimeListBloc>().add(
|
||||||
state.trackingType == TrackingMediumType.anime
|
state.trackingType == TrackingMediumType.anime
|
||||||
? list.AnimeAddedEvent(
|
? list.AnimeAddedEvent(
|
||||||
AnimeTrackingData(
|
AnimeTrackingData(
|
||||||
event.result.id,
|
event.result.id,
|
||||||
MediumTrackingState.ongoing,
|
MediumTrackingState.ongoing,
|
||||||
event.result.title,
|
event.result.title,
|
||||||
0,
|
0,
|
||||||
event.result.total,
|
event.result.total,
|
||||||
event.result.thumbnailUrl,
|
event.result.thumbnailUrl,
|
||||||
event.result.isAiring,
|
event.result.isAiring,
|
||||||
event.result.broadcastDay,
|
event.result.broadcastDay,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: list.MangaAddedEvent(
|
: list.MangaAddedEvent(
|
||||||
MangaTrackingData(
|
MangaTrackingData(
|
||||||
event.result.id,
|
event.result.id,
|
||||||
MediumTrackingState.ongoing,
|
MediumTrackingState.ongoing,
|
||||||
event.result.title,
|
event.result.title,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
event.result.total,
|
event.result.total,
|
||||||
event.result.thumbnailUrl,
|
event.result.thumbnailUrl,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
GetIt.I.get<NavigationBloc>().add(
|
GetIt.I.get<NavigationBloc>().add(
|
||||||
PoppedRouteEvent(),
|
PoppedRouteEvent(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
GetIt.I.get<NavigationBloc>().add(
|
GetIt.I.get<NavigationBloc>().add(
|
||||||
PushedNamedEvent(
|
PushedNamedEvent(
|
||||||
const NavigationDestination(detailsRoute),
|
const NavigationDestination(detailsRoute),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onMangaRequested(
|
Future<void> _onMangaRequested(
|
||||||
@@ -52,10 +52,10 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
GetIt.I.get<NavigationBloc>().add(
|
GetIt.I.get<NavigationBloc>().add(
|
||||||
PushedNamedEvent(
|
PushedNamedEvent(
|
||||||
const NavigationDestination(detailsRoute),
|
const NavigationDestination(detailsRoute),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _onDetailsUpdated(
|
Future<void> _onDetailsUpdated(
|
||||||
@@ -69,13 +69,13 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
await GetIt.I
|
await GetIt.I.get<DatabaseService>().updateAnime(
|
||||||
.get<DatabaseService>()
|
event.data as AnimeTrackingData,
|
||||||
.updateAnime(event.data as AnimeTrackingData);
|
);
|
||||||
|
|
||||||
GetIt.I.get<AnimeListBloc>().add(
|
GetIt.I.get<AnimeListBloc>().add(
|
||||||
AnimeUpdatedEvent(event.data as AnimeTrackingData),
|
AnimeUpdatedEvent(event.data as AnimeTrackingData),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
emit(
|
emit(
|
||||||
state.copyWith(
|
state.copyWith(
|
||||||
@@ -83,13 +83,13 @@ class DetailsBloc extends Bloc<DetailsEvent, DetailsState> {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
await GetIt.I
|
await GetIt.I.get<DatabaseService>().updateManga(
|
||||||
.get<DatabaseService>()
|
event.data as MangaTrackingData,
|
||||||
.updateManga(event.data as MangaTrackingData);
|
);
|
||||||
|
|
||||||
GetIt.I.get<AnimeListBloc>().add(
|
GetIt.I.get<AnimeListBloc>().add(
|
||||||
MangaUpdatedEvent(event.data as MangaTrackingData),
|
MangaUpdatedEvent(event.data as MangaTrackingData),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -105,8 +105,9 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
final title = anime.getElement('series_title')!.text;
|
final title = anime.getElement('series_title')!.text;
|
||||||
final totalEpisodes =
|
final totalEpisodes = int.parse(
|
||||||
int.parse(anime.getElement('series_episodes')!.text);
|
anime.getElement('series_episodes')!.text,
|
||||||
|
);
|
||||||
final id = anime.getElement('series_animedb_id')!.text;
|
final id = anime.getElement('series_animedb_id')!.text;
|
||||||
|
|
||||||
print('Waiting 500ms to not hammer Jikan ($title)');
|
print('Waiting 500ms to not hammer Jikan ($title)');
|
||||||
@@ -117,21 +118,21 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
|
|||||||
|
|
||||||
// Add the anime
|
// Add the anime
|
||||||
await GetIt.I.get<DatabaseService>().addAnime(
|
await GetIt.I.get<DatabaseService>().addAnime(
|
||||||
AnimeTrackingData(
|
AnimeTrackingData(
|
||||||
id,
|
id,
|
||||||
malStatusToTrackingState(
|
malStatusToTrackingState(
|
||||||
anime.getElement('my_status')!.text,
|
anime.getElement('my_status')!.text,
|
||||||
),
|
),
|
||||||
title,
|
title,
|
||||||
int.parse(anime.getElement('my_watched_episodes')!.text),
|
int.parse(anime.getElement('my_watched_episodes')!.text),
|
||||||
// 0 means that MAL does not know
|
// 0 means that MAL does not know
|
||||||
totalEpisodes == 0 ? null : totalEpisodes,
|
totalEpisodes == 0 ? null : totalEpisodes,
|
||||||
data.imageUrl,
|
data.imageUrl,
|
||||||
// NOTE: When the calendar gets refreshed, this should also get cleared
|
// NOTE: When the calendar gets refreshed, this should also get cleared
|
||||||
true,
|
true,
|
||||||
null,
|
null,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide the spinner again
|
// Hide the spinner again
|
||||||
@@ -195,19 +196,19 @@ class SettingsBloc extends Bloc<SettingsEvent, SettingsState> {
|
|||||||
|
|
||||||
// Add the manga
|
// Add the manga
|
||||||
await GetIt.I.get<DatabaseService>().addManga(
|
await GetIt.I.get<DatabaseService>().addManga(
|
||||||
MangaTrackingData(
|
MangaTrackingData(
|
||||||
id,
|
id,
|
||||||
malStatusToTrackingState(
|
malStatusToTrackingState(
|
||||||
manga.getElement('my_status')!.text,
|
manga.getElement('my_status')!.text,
|
||||||
),
|
),
|
||||||
title,
|
title,
|
||||||
int.parse(manga.getElement('my_read_chapters')!.text),
|
int.parse(manga.getElement('my_read_chapters')!.text),
|
||||||
0,
|
0,
|
||||||
// 0 means that MAL does not know
|
// 0 means that MAL does not know
|
||||||
totalChapters == 0 ? null : totalChapters,
|
totalChapters == 0 ? null : totalChapters,
|
||||||
data.imageUrl,
|
data.imageUrl,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hide the spinner again
|
// Hide the spinner again
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ class AboutPage extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
||||||
builder: (_) => const AboutPage(),
|
builder: (_) => const AboutPage(),
|
||||||
settings: const RouteSettings(
|
settings: const RouteSettings(
|
||||||
name: aboutRoute,
|
name: aboutRoute,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ class AnimeListPage extends StatefulWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
||||||
builder: (_) => const AnimeListPage(),
|
builder: (_) => const AnimeListPage(),
|
||||||
settings: const RouteSettings(
|
settings: const RouteSettings(
|
||||||
name: animeListRoute,
|
name: animeListRoute,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
AnimeListPageState createState() => AnimeListPageState();
|
AnimeListPageState createState() => AnimeListPageState();
|
||||||
@@ -107,8 +107,8 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
initialValue: state.animeFilterState,
|
initialValue: state.animeFilterState,
|
||||||
onSelected: (filterState) {
|
onSelected: (filterState) {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
AnimeFilterChangedEvent(filterState),
|
AnimeFilterChangedEvent(filterState),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.anime),
|
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.anime),
|
||||||
);
|
);
|
||||||
@@ -120,8 +120,8 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
initialValue: state.mangaFilterState,
|
initialValue: state.mangaFilterState,
|
||||||
onSelected: (filterState) {
|
onSelected: (filterState) {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
MangaFilterChangedEvent(filterState),
|
MangaFilterChangedEvent(filterState),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.manga),
|
itemBuilder: (_) => _getPopupButtonItems(TrackingMediumType.manga),
|
||||||
);
|
);
|
||||||
@@ -164,25 +164,25 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
return GridItem(
|
return GridItem(
|
||||||
minusCallback: () {
|
minusCallback: () {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
AnimeEpisodeDecrementedEvent(
|
AnimeEpisodeDecrementedEvent(
|
||||||
anime.id,
|
anime.id,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
plusCallback: () {
|
plusCallback: () {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
AnimeEpisodeIncrementedEvent(
|
AnimeEpisodeIncrementedEvent(
|
||||||
anime.id,
|
anime.id,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: AnimeCoverImage(
|
child: AnimeCoverImage(
|
||||||
url: anime.thumbnailUrl,
|
url: anime.thumbnailUrl,
|
||||||
hero: anime.id,
|
hero: anime.id,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.read<DetailsBloc>().add(
|
context.read<DetailsBloc>().add(
|
||||||
AnimeDetailsRequestedEvent(anime),
|
AnimeDetailsRequestedEvent(anime),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
extra: Align(
|
extra: Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
@@ -214,25 +214,25 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
return GridItem(
|
return GridItem(
|
||||||
minusCallback: () {
|
minusCallback: () {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
MangaChapterDecrementedEvent(
|
MangaChapterDecrementedEvent(
|
||||||
manga.id,
|
manga.id,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
plusCallback: () {
|
plusCallback: () {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
MangaChapterIncrementedEvent(
|
MangaChapterIncrementedEvent(
|
||||||
manga.id,
|
manga.id,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: AnimeCoverImage(
|
child: AnimeCoverImage(
|
||||||
hero: manga.id,
|
hero: manga.id,
|
||||||
url: manga.thumbnailUrl,
|
url: manga.thumbnailUrl,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.read<DetailsBloc>().add(
|
context.read<DetailsBloc>().add(
|
||||||
MangaDetailsRequestedEvent(manga),
|
MangaDetailsRequestedEvent(manga),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
extra: Align(
|
extra: Align(
|
||||||
alignment: Alignment.centerRight,
|
alignment: Alignment.centerRight,
|
||||||
@@ -263,8 +263,8 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.read<AnimeSearchBloc>().add(
|
context.read<AnimeSearchBloc>().add(
|
||||||
AnimeSearchRequestedEvent(state.trackingType),
|
AnimeSearchRequestedEvent(state.trackingType),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
tooltip: t.tooltips.addNewItem,
|
tooltip: t.tooltips.addNewItem,
|
||||||
child: const Icon(Icons.add),
|
child: const Icon(Icons.add),
|
||||||
@@ -273,16 +273,17 @@ class AnimeListPageState extends State<AnimeListPage> {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
bottomNavigationBar: BottomBar(
|
bottomNavigationBar: BottomBar(
|
||||||
selectedIndex:
|
selectedIndex: state.trackingType == TrackingMediumType.anime
|
||||||
state.trackingType == TrackingMediumType.anime ? 0 : 1,
|
? 0
|
||||||
|
: 1,
|
||||||
onTap: (int index) {
|
onTap: (int index) {
|
||||||
context.read<AnimeListBloc>().add(
|
context.read<AnimeListBloc>().add(
|
||||||
AnimeTrackingTypeChanged(
|
AnimeTrackingTypeChanged(
|
||||||
index == 0
|
index == 0
|
||||||
? TrackingMediumType.anime
|
? TrackingMediumType.anime
|
||||||
: TrackingMediumType.manga,
|
: TrackingMediumType.manga,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
_controller.jumpToPage(index);
|
_controller.jumpToPage(index);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -12,11 +12,11 @@ class AnimeSearchPage extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
||||||
builder: (_) => const AnimeSearchPage(),
|
builder: (_) => const AnimeSearchPage(),
|
||||||
settings: const RouteSettings(
|
settings: const RouteSettings(
|
||||||
name: animeSearchRoute,
|
name: animeSearchRoute,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -41,13 +41,13 @@ class AnimeSearchPage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
onSubmitted: (_) {
|
onSubmitted: (_) {
|
||||||
context.read<AnimeSearchBloc>().add(
|
context.read<AnimeSearchBloc>().add(
|
||||||
SearchQuerySubmittedEvent(),
|
SearchQuerySubmittedEvent(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
context.read<AnimeSearchBloc>().add(
|
context.read<AnimeSearchBloc>().add(
|
||||||
SearchQueryChangedEvent(value),
|
SearchQueryChangedEvent(value),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@@ -66,8 +66,8 @@ class AnimeSearchPage extends StatelessWidget {
|
|||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.read<AnimeSearchBloc>().add(
|
context.read<AnimeSearchBloc>().add(
|
||||||
ResultTappedEvent(item),
|
ResultTappedEvent(item),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: ListItem(
|
child: ListItem(
|
||||||
title: item.title,
|
title: item.title,
|
||||||
|
|||||||
@@ -57,11 +57,11 @@ class CalendarPage extends StatefulWidget {
|
|||||||
const CalendarPage({super.key});
|
const CalendarPage({super.key});
|
||||||
|
|
||||||
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
||||||
builder: (_) => const CalendarPage(),
|
builder: (_) => const CalendarPage(),
|
||||||
settings: const RouteSettings(
|
settings: const RouteSettings(
|
||||||
name: calendarRoute,
|
name: calendarRoute,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
CalendarPageState createState() => CalendarPageState();
|
CalendarPageState createState() => CalendarPageState();
|
||||||
@@ -109,11 +109,11 @@ class CalendarPageState extends State<CalendarPage> {
|
|||||||
hero: 'calendar_${anime.id}',
|
hero: 'calendar_${anime.id}',
|
||||||
onTap: () {
|
onTap: () {
|
||||||
context.read<DetailsBloc>().add(
|
context.read<DetailsBloc>().add(
|
||||||
AnimeDetailsRequestedEvent(
|
AnimeDetailsRequestedEvent(
|
||||||
anime,
|
anime,
|
||||||
heroImagePrefix: 'calendar_',
|
heroImagePrefix: 'calendar_',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -183,9 +183,9 @@ class CalendarPageState extends State<CalendarPage> {
|
|||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context
|
context.read<CalendarBloc>().add(
|
||||||
.read<CalendarBloc>()
|
RefreshPerformedEvent(),
|
||||||
.add(RefreshPerformedEvent());
|
);
|
||||||
},
|
},
|
||||||
icon: const Icon(Icons.refresh),
|
icon: const Icon(Icons.refresh),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -157,7 +157,10 @@ class DetailsPage extends StatelessWidget {
|
|||||||
end: 8,
|
end: 8,
|
||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
t.details.details.titleJa,
|
t
|
||||||
|
.details
|
||||||
|
.details
|
||||||
|
.titleJa,
|
||||||
style:
|
style:
|
||||||
Theme.of(
|
Theme.of(
|
||||||
context,
|
context,
|
||||||
@@ -173,21 +176,32 @@ class DetailsPage extends StatelessWidget {
|
|||||||
end: 8,
|
end: 8,
|
||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize:
|
||||||
|
MainAxisSize
|
||||||
|
.min,
|
||||||
children: [
|
children: [
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
await Clipboard.setData(
|
await Clipboard.setData(
|
||||||
ClipboardData(
|
ClipboardData(
|
||||||
text: state.data!.title,
|
text: state
|
||||||
),
|
.data!
|
||||||
);
|
.title,
|
||||||
},
|
),
|
||||||
icon: const Icon(Icons.copy),
|
);
|
||||||
|
},
|
||||||
|
icon:
|
||||||
|
const Icon(
|
||||||
|
Icons
|
||||||
|
.copy,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsetsGeometry.only(left: 8),
|
padding:
|
||||||
|
const EdgeInsetsGeometry.only(
|
||||||
|
left: 8,
|
||||||
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
state
|
state
|
||||||
.data!
|
.data!
|
||||||
@@ -223,13 +237,17 @@ class DetailsPage extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
final url = switch (state.trackingType) {
|
final url = switch (state
|
||||||
TrackingMediumType.anime => 'https://myanimelist.net/anime/${state.data!.id}',
|
.trackingType) {
|
||||||
TrackingMediumType.manga => 'https://myanimelist.net/manga/${state.data!.id}',
|
TrackingMediumType.anime =>
|
||||||
|
'https://myanimelist.net/anime/${state.data!.id}',
|
||||||
|
TrackingMediumType.manga =>
|
||||||
|
'https://myanimelist.net/manga/${state.data!.id}',
|
||||||
};
|
};
|
||||||
await launchUrl(
|
await launchUrl(
|
||||||
Uri.parse(url),
|
Uri.parse(url),
|
||||||
mode: LaunchMode.externalApplication,
|
mode: LaunchMode
|
||||||
|
.externalApplication,
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
child: Text(t.details.mal),
|
child: Text(t.details.mal),
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ class SettingsPage extends StatelessWidget {
|
|||||||
const SettingsPage({super.key});
|
const SettingsPage({super.key});
|
||||||
|
|
||||||
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
static MaterialPageRoute<dynamic> get route => MaterialPageRoute<dynamic>(
|
||||||
builder: (_) => const SettingsPage(),
|
builder: (_) => const SettingsPage(),
|
||||||
settings: const RouteSettings(
|
settings: const RouteSettings(
|
||||||
name: settingsRoute,
|
name: settingsRoute,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -58,11 +58,11 @@ class SettingsPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetIt.I.get<SettingsBloc>().add(
|
GetIt.I.get<SettingsBloc>().add(
|
||||||
AnimeListImportedEvent(
|
AnimeListImportedEvent(
|
||||||
result.files.first.path!,
|
result.files.first.path!,
|
||||||
ImportListType.mal,
|
ImportListType.mal,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
@@ -85,30 +85,31 @@ class SettingsPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GetIt.I.get<SettingsBloc>().add(
|
GetIt.I.get<SettingsBloc>().add(
|
||||||
MangaListImportedEvent(
|
MangaListImportedEvent(
|
||||||
result.files.first.path!,
|
result.files.first.path!,
|
||||||
ImportListType.mal,
|
ImportListType.mal,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(t.settings.exportData),
|
title: Text(t.settings.exportData),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
// Pick the file
|
// Pick the file
|
||||||
final result =
|
final result = await FilePicker.platform
|
||||||
await FilePicker.platform.getDirectoryPath();
|
.getDirectoryPath();
|
||||||
if (result == null) return;
|
if (result == null) return;
|
||||||
|
|
||||||
if (!(await Permission.manageExternalStorage
|
if (!(await Permission.manageExternalStorage
|
||||||
.request())
|
.request())
|
||||||
.isGranted) return;
|
.isGranted)
|
||||||
|
return;
|
||||||
|
|
||||||
GetIt.I.get<SettingsBloc>().add(
|
GetIt.I.get<SettingsBloc>().add(
|
||||||
DataExportedEvent(
|
DataExportedEvent(
|
||||||
result,
|
result,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
@@ -123,18 +124,19 @@ class SettingsPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
builder: (_) => AlertDialog(
|
builder: (_) => AlertDialog(
|
||||||
title: Text(t.settings.importInvalidData.title),
|
title: Text(t.settings.importInvalidData.title),
|
||||||
content:
|
content: Text(
|
||||||
Text(t.settings.importInvalidData.content),
|
t.settings.importInvalidData.content,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetIt.I.get<SettingsBloc>().add(
|
GetIt.I.get<SettingsBloc>().add(
|
||||||
DataImportedEvent(
|
DataImportedEvent(
|
||||||
result.files.first.path!,
|
result.files.first.path!,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
|
||||||
index =
|
index = widget.values.indexWhere(
|
||||||
widget.values.indexWhere((item) => item.value == widget.initialValue);
|
(item) => item.value == widget.initialValue,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -53,48 +54,49 @@ class DropdownSelectorState<T> extends State<DropdownSelector<T>> {
|
|||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
final result = await showModalBottomSheet<T>(
|
final result = await showModalBottomSheet<T>(
|
||||||
context: context,
|
context: context,
|
||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
builder: (context) => DraggableScrollableSheet(
|
builder: (context) => DraggableScrollableSheet(
|
||||||
initialChildSize: 1,
|
initialChildSize: 1,
|
||||||
builder: (context, controller) => ListView.builder(
|
builder: (context, controller) => ListView.builder(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
itemCount: widget.values.length,
|
itemCount: widget.values.length,
|
||||||
itemBuilder: (context, index) => InkWell(
|
itemBuilder: (context, index) => InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
Navigator.of(context).pop(widget.values[index].value);
|
Navigator.of(context).pop(widget.values[index].value);
|
||||||
},
|
},
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsetsGeometry.symmetric(
|
padding: const EdgeInsetsGeometry.symmetric(
|
||||||
horizontal: 16,
|
horizontal: 16,
|
||||||
vertical: 12,
|
vertical: 12,
|
||||||
),
|
),
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
widget.values[index].text,
|
widget.values[index].text,
|
||||||
style: Theme.of(context).textTheme.titleLarge,
|
style: Theme.of(context).textTheme.titleLarge,
|
||||||
|
),
|
||||||
|
if (this.index == index)
|
||||||
|
const Padding(
|
||||||
|
padding: EdgeInsets.only(left: 12),
|
||||||
|
child: Icon(Icons.check),
|
||||||
),
|
),
|
||||||
if (this.index == index)
|
],
|
||||||
const Padding(
|
|
||||||
padding: EdgeInsets.only(left: 12),
|
|
||||||
child: Icon(Icons.check),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
if (result == null) return;
|
if (result == null) return;
|
||||||
if (result == widget.values[index].value) return;
|
if (result == widget.values[index].value) return;
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
index =
|
index = widget.values.indexWhere(
|
||||||
widget.values.indexWhere((item) => item.value == result);
|
(item) => item.value == result,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
widget.onChanged(result);
|
widget.onChanged(result);
|
||||||
|
|||||||
Reference in New Issue
Block a user