mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-03-11 17:25:32 +00:00
126 lines
4.1 KiB
Dart
126 lines
4.1 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
import 'package:isar_community/isar.dart';
|
|
import 'package:mangayomi/main.dart';
|
|
import 'package:mangayomi/models/source.dart';
|
|
import 'package:mangayomi/modules/manga/detail/manga_details_view.dart';
|
|
import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart';
|
|
import 'package:mangayomi/modules/manga/detail/providers/isar_providers.dart';
|
|
import 'package:mangayomi/modules/widgets/error_text.dart';
|
|
import 'package:mangayomi/modules/widgets/progress_center.dart';
|
|
|
|
class MangaReaderDetail extends ConsumerStatefulWidget {
|
|
final int mangaId;
|
|
const MangaReaderDetail({super.key, required this.mangaId});
|
|
|
|
@override
|
|
ConsumerState<MangaReaderDetail> createState() => _MangaReaderDetailState();
|
|
}
|
|
|
|
class _MangaReaderDetailState extends ConsumerState<MangaReaderDetail> {
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_init();
|
|
}
|
|
|
|
Future<void> _init() async {
|
|
// Wait for the widget tree to settle before loading detail
|
|
await WidgetsBinding.instance.endOfFrame;
|
|
await ref.read(
|
|
updateMangaDetailProvider(mangaId: widget.mangaId, isInit: true).future,
|
|
);
|
|
if (mounted) {
|
|
setState(() {
|
|
_isLoading = false;
|
|
});
|
|
}
|
|
}
|
|
|
|
bool _isLoading = true;
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final manga = ref.watch(
|
|
getMangaDetailStreamProvider(mangaId: widget.mangaId),
|
|
);
|
|
return Scaffold(
|
|
body: manga.when(
|
|
data: (manga) {
|
|
return StreamBuilder(
|
|
stream: isar.sources
|
|
.filter()
|
|
.langContains(manga!.lang!, caseSensitive: false)
|
|
.and()
|
|
.nameContains(manga.source!, caseSensitive: false)
|
|
.and()
|
|
.idIsNotNull()
|
|
.and()
|
|
.isActiveEqualTo(true)
|
|
.and()
|
|
.isAddedEqualTo(true)
|
|
.watch(fireImmediately: true),
|
|
builder: (context, snapshot) {
|
|
final sourceExist = snapshot.hasData && snapshot.data!.isNotEmpty;
|
|
return RefreshIndicator(
|
|
onRefresh: () async {
|
|
if (sourceExist && !_isLoading) {
|
|
await ref.read(
|
|
updateMangaDetailProvider(
|
|
mangaId: manga.id,
|
|
isInit: false,
|
|
).future,
|
|
);
|
|
}
|
|
},
|
|
child: Stack(
|
|
children: [
|
|
MangaDetailsView(
|
|
manga: manga,
|
|
sourceExist: sourceExist,
|
|
checkForUpdate: (value) async {
|
|
if (!_isLoading) {
|
|
setState(() {
|
|
_isLoading = true;
|
|
});
|
|
if (sourceExist) {
|
|
await ref.read(
|
|
updateMangaDetailProvider(
|
|
mangaId: manga.id,
|
|
isInit: false,
|
|
).future,
|
|
);
|
|
}
|
|
if (mounted) {
|
|
setState(() {
|
|
_isLoading = false;
|
|
});
|
|
}
|
|
}
|
|
},
|
|
),
|
|
if (_isLoading)
|
|
const Positioned(
|
|
top: 0,
|
|
left: 0,
|
|
right: 0,
|
|
child: Padding(
|
|
padding: EdgeInsets.only(top: 40),
|
|
child: Center(child: RefreshProgressIndicator()),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
);
|
|
},
|
|
error: (Object error, StackTrace stackTrace) {
|
|
return ErrorText(error);
|
|
},
|
|
loading: () {
|
|
return const ProgressCenter();
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|