mangayomi-mirror/lib/modules/manga/detail/manga_detail_main.dart
2025-10-29 13:08:42 +01:00

125 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 {
await Future.delayed(const Duration(milliseconds: 100));
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();
},
),
);
}
}