import 'package:aves/model/covers.dart'; import 'package:aves/model/entry.dart'; import 'package:aves/model/favourites.dart'; import 'package:aves/model/metadata/address.dart'; import 'package:aves/model/metadata/catalog.dart'; import 'package:aves/services/common/services.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:flutter/material.dart'; class DebugAppDatabaseSection extends StatefulWidget { const DebugAppDatabaseSection({Key? key}) : super(key: key); @override _DebugAppDatabaseSectionState createState() => _DebugAppDatabaseSectionState(); } class _DebugAppDatabaseSectionState extends State with AutomaticKeepAliveClientMixin { late Future _dbFileSizeLoader; late Future> _dbEntryLoader; late Future> _dbDateLoader; late Future> _dbMetadataLoader; late Future> _dbAddressLoader; late Future> _dbFavouritesLoader; late Future> _dbCoversLoader; @override void initState() { super.initState(); _startDbReport(); } @override Widget build(BuildContext context) { super.build(context); return AvesExpansionTile( title: 'Database', children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Column( children: [ FutureBuilder( future: _dbFileSizeLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('DB file size: ${formatFilesize(snapshot.data!)}'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.reset().then((_) => _startDbReport()), child: const Text('Reset'), ), ], ); }, ), FutureBuilder>( future: _dbEntryLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('entry rows: ${snapshot.data!.length}'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearEntries().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), FutureBuilder>( future: _dbDateLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('date rows: ${snapshot.data!.length}'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearDates().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), FutureBuilder( future: _dbMetadataLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('metadata rows: ${snapshot.data!.length}'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearMetadataEntries().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), FutureBuilder( future: _dbAddressLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('address rows: ${snapshot.data!.length}'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearAddresses().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), FutureBuilder( future: _dbFavouritesLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('favourite rows: ${snapshot.data!.length} (${favourites.count} in memory)'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => favourites.clear().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), FutureBuilder( future: _dbCoversLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('cover rows: ${snapshot.data!.length} (${covers.count} in memory)'), ), const SizedBox(width: 8), ElevatedButton( onPressed: () => covers.clear().then((_) => _startDbReport()), child: const Text('Clear'), ), ], ); }, ), ], ), ), ], ); } void _startDbReport() { _dbFileSizeLoader = metadataDb.dbFileSize(); _dbEntryLoader = metadataDb.loadEntries(); _dbDateLoader = metadataDb.loadDates(); _dbMetadataLoader = metadataDb.loadMetadataEntries(); _dbAddressLoader = metadataDb.loadAddresses(); _dbFavouritesLoader = metadataDb.loadFavourites(); _dbCoversLoader = metadataDb.loadCovers(); setState(() {}); } @override bool get wantKeepAlive => true; }