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.
156 lines
4.4 KiB
Dart
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...'),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|