You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cloudsolutions-atoms/lib/views/widgets/equipment/asset_document_history_view...

156 lines
4.4 KiB
Dart

import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/devices_provider.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/views/widgets/images/files_list.dart';
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
import 'package:test_sa/views/widgets/loaders/app_loading.dart';
import 'package:test_sa/views/widgets/loaders/no_data_found.dart';
class AssetDocumentHistoryView extends StatefulWidget {
final int assetId;
const AssetDocumentHistoryView({
Key? key,
required this.assetId,
}) : super(key: key);
@override
State<AssetDocumentHistoryView> createState() => _AssetDocumentHistoryViewState();
}
class _AssetDocumentHistoryViewState extends State<AssetDocumentHistoryView> {
late AssetProvider _assetProvider;
final ScrollController _scrollController = ScrollController();
List<GenericAttachmentModel> _documents = [];
bool _isLoading = false;
int _currentPage = 1;
int _totalRows = 0;
@override
void initState() {
super.initState();
_assetProvider = context.read<AssetProvider>();
_scrollController.addListener(_onScroll);
_loadDocuments();
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
void _onScroll() {
final pixels = _scrollController.position.pixels;
final maxScroll = _scrollController.position.maxScrollExtent;
if (pixels >= maxScroll * 0.8) {
if (!_isLoading && _hasMore) {
_loadMore();
}
}
}
bool get _hasMore => _documents.length < _totalRows;
Future<void> _loadDocuments({bool refresh = false, bool loadMore = false}) async {
if (_isLoading) return;
setState(() {
_isLoading = true;
if (refresh) {
_documents.clear();
_currentPage = 1;
}
if (loadMore) {
_currentPage++;
}
});
try {
final result = await _assetProvider.getAssetDocumentHistory(
assetId: widget.assetId,
pageNumber: _currentPage,
);
if (mounted) {
setState(() {
if (refresh) {
_documents = result.documents;
} else {
_documents.addAll(result.documents);
}
_totalRows = result.totalRows;
_isLoading = false;
});
}
} catch (e) {
log('Error loading documents: $e');
if (mounted) {
setState(() {
_isLoading = false;
});
}
}
}
Future<void> _loadMore() async {
await _loadDocuments(loadMore: true);
}
Future<void> _onRefresh() async {
await _loadDocuments(refresh: true);
}
@override
Widget build(BuildContext context) {
if (_isLoading && _documents.isEmpty) {
return const Center(child: ALoading());
}
if (_documents.isEmpty && !_isLoading) {
return const Center(child: NoDataFound());
}
return RefreshIndicator(
onRefresh: _onRefresh,
child: ListView(
controller: _scrollController,
padding: EdgeInsets.symmetric(
horizontal: 16.toScreenWidth,
),
children: [
FilesList(
showAsListView: true,
showDownloadButton: true,
itemGap: 12.toScreenHeight,
images: _documents
.map((doc) {
return URLs.getFileUrl(doc.name) ?? '';
}).where((url) => url.isNotEmpty).toList(),
types: _documents.map((doc) {
final attachmentType = doc.documentType?.name ?? '';
return attachmentType.isNotEmpty ? attachmentType : 'Asset Guide';
}).toList(),
).toShadowContainer(context),
if (_isLoading && _documents.isNotEmpty&&_hasMore) ...[
16.height,
Center(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const ALoading(),
8.height,
const InfoTextLabelWidget(label: 'Loading more...'),
],
),
),
),
],
],
),
);
}
}