import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:archive/archive.dart'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; class FileStorage { const FileStorage( this.tag, this.getDirectory, ); static const GZIP_TAG = '_gzip'; final String tag; final Future Function() getDirectory; Future _getLocalFile() async { final dir = await getDirectory(); return File('${dir.path}/invoiceninja__$tag.json'); } Future load() async { if (kIsWeb) { final prefs = await SharedPreferences.getInstance(); String value = prefs.getString(tag); if (value != null) { return value; } value = prefs.getString(tag + GZIP_TAG); if (value != null) { final decoded = base64Decode(value); final unzipped = GZipDecoder().decodeBytes(decoded); return utf8.decode(unzipped); } return null; } else { final file = await _getLocalFile(); final contents = await file.readAsString(); return contents; } } Future save(String data) async { if (kIsWeb) { final prefs = await SharedPreferences.getInstance(); try { await prefs.setString(tag, data); } catch (e) { if ('$e'.contains('QuotaExceededError')) { await prefs.remove(tag); final gzipBytes = GZipEncoder().encode(utf8.encode(data)); final zipped = base64Encode(gzipBytes); try { await prefs.setString(tag + GZIP_TAG, zipped); } catch (e) { if ('$e'.contains('QuotaExceededError')) { await prefs.remove(tag + GZIP_TAG); } } } } return null; } else { final file = await _getLocalFile(); return file.writeAsString(data); } } Future delete() async { if (kIsWeb) { final prefs = await SharedPreferences.getInstance(); prefs.remove(tag); prefs.remove(tag + GZIP_TAG); return null; } else { final file = await _getLocalFile(); return file.delete(); } } Future exists() async { if (kIsWeb) { final prefs = await SharedPreferences.getInstance(); return prefs.containsKey(tag) || prefs.containsKey(tag + GZIP_TAG); } else { final file = await _getLocalFile(); return file.existsSync(); } } }