import 'package:flutter/material.dart'; import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; import 'package:provider/provider.dart'; import 'package:simplecloudnotifier/api/api_client.dart'; import 'package:simplecloudnotifier/components/layout/scaffold.dart'; import 'package:simplecloudnotifier/models/keytoken.dart'; import 'package:simplecloudnotifier/state/application_log.dart'; import 'package:simplecloudnotifier/state/app_auth.dart'; import 'package:simplecloudnotifier/pages/keytoken_list/keytoken_list_item.dart'; class KeyTokenListPage extends StatefulWidget { const KeyTokenListPage({super.key}); @override State createState() => _KeyTokenListPageState(); } class _KeyTokenListPageState extends State { final PagingController _pagingController = PagingController.fromValue(PagingState(nextPageKey: null, itemList: [], error: null), firstPageKey: 0); @override void initState() { super.initState(); _pagingController.addPageRequestListener(_fetchPage); _pagingController.refresh(); } @override void didChangeDependencies() { super.didChangeDependencies(); } @override void dispose() { ApplicationLog.debug('KeyTokenListPage::dispose'); _pagingController.dispose(); super.dispose(); } Future _fetchPage(int pageKey) async { final acc = Provider.of(context, listen: false); ApplicationLog.debug('Start KeyTokenListPage::_pagingController::_fetchPage [ ${pageKey} ]'); if (!acc.isAuth()) { _pagingController.error = 'Not logged in'; return; } try { final items = (await APIClient.getKeyTokenList(acc)).toList(); items.sort((a, b) => -1 * a.timestampCreated.compareTo(b.timestampCreated)); _pagingController.value = PagingState(nextPageKey: null, itemList: items, error: null); } catch (exc, trace) { _pagingController.error = exc.toString(); ApplicationLog.error('Failed to list keytokens: ' + exc.toString(), trace: trace); } } @override Widget build(BuildContext context) { return SCNScaffold( title: "Keys", showSearch: false, showShare: false, child: Padding( padding: EdgeInsets.fromLTRB(8, 4, 8, 4), child: RefreshIndicator( onRefresh: () => Future.sync( () => _pagingController.refresh(), ), child: PagedListView( pagingController: _pagingController, builderDelegate: PagedChildBuilderDelegate( itemBuilder: (context, item, index) => KeyTokenListItem(item: item), ), ), ), ), ); } }