import 'dart:async'; import 'dart:convert'; import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:jiffy/jiffy.dart'; import 'package:localstore/localstore.dart'; import '../../../widget/placeholderView.dart'; import '../../api/requestCache.dart'; import 'jsonViewer.dart'; class CacheView extends StatefulWidget { const CacheView({super.key}); @override State createState() => _CacheViewState(); Future clear() async { await Localstore.instance.collection(RequestCache.collection).delete(); } Future totalSize() async { var data = await Localstore.instance.collection(RequestCache.collection).get(); if(data!.length <= 1) return jsonEncode(data.values.first).length * 8; return data.values.reduce((a, b) => jsonEncode(a).length + jsonEncode(b).length) * 8; } } class _CacheViewState extends State { final Localstore storage = Localstore.instance; late Future?> files; @override void initState() { files = Localstore.instance.collection(RequestCache.collection).get(); super.initState(); } @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( title: const Text('Lokaler cache'), ), body: FutureBuilder( future: files, builder: (context, snapshot) { if(snapshot.hasData) { return ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (context, index) { Map element = snapshot.data![snapshot.data!.keys.elementAt(index)]; var filename = snapshot.data!.keys.elementAt(index).split('/').last; return ListTile( leading: const Icon(Icons.text_snippet_outlined), title: Text(filename), subtitle: Text("${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate']).fromNow()}"), trailing: const Icon(Icons.arrow_right), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) => JsonViewer(title: filename, data: jsonDecode(element['json'])),)); }, onLongPress: () { showDialog(context: context, builder: (context) => SimpleDialog( children: [ const ListTile( leading: Icon(Icons.delete_forever), title: Text('Diese Datei löschen'), ), ListTile( leading: const Icon(Icons.copy), title: const Text('Dateitext kopieren'), onTap: () { Clipboard.setData(ClipboardData(text: jsonEncode(element))); Navigator.of(context).pop(); }, ) ], )); }, ); }, ); } else if(snapshot.connectionState != ConnectionState.done) { return const Center( child: CircularProgressIndicator() ); } else { return const Center( child: PlaceholderView(icon: Icons.hourglass_empty, text: 'Keine Daten'), ); } }, ), ); } extension FutureExtension on Future { bool isCompleted() { final completer = Completer(); then(completer.complete).catchError(completer.completeError); return completer.isCompleted; } }