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 createState() => _AssetDocumentHistoryViewState(); } class _AssetDocumentHistoryViewState extends State { late AssetProvider _assetProvider; final ScrollController _scrollController = ScrollController(); List _documents = []; bool _isLoading = false; int _currentPage = 1; int _totalRows = 0; @override void initState() { super.initState(); _assetProvider = context.read(); _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 _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 _loadMore() async { await _loadDocuments(loadMore: true); } Future _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...'), ], ), ), ), ], ], ), ); } }