import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:solian/exceptions/request.dart'; import 'package:solian/exceptions/unauthorized.dart'; extension AppExtensions on BuildContext { void showSnackbar(String content, {SnackBarAction? action}) { ScaffoldMessenger.of(this).showSnackBar(SnackBar( content: Text(content), action: action, )); } void clearSnackbar() { ScaffoldMessenger.of(this).clearSnackBars(); } Future showModalDialog(String title, desc) { return showDialog( useRootNavigator: true, context: this, builder: (ctx) => AlertDialog( title: Text(title), content: Text(desc), actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: Text('okay'.tr), ) ], ), ); } Future showInfoDialog(String title, body) { return showDialog( useRootNavigator: true, context: this, builder: (ctx) => AlertDialog( title: Text(title), content: Text(body), actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: Text('okay'.tr), ) ], ), ); } Future showErrorDialog(dynamic exception) { Widget content = Text(exception.toString().capitalize!); if (exception is UnauthorizedException) { content = Text('errorHappenedUnauthorized'.tr); } if (exception is RequestException) { String overall; switch (exception.data.statusCode) { case 400: overall = 'errorHappenedRequestBad'.tr; break; case 401: overall = 'errorHappenedUnauthorized'.tr; break; case 403: overall = 'errorHappenedRequestForbidden'.tr; break; case 404: overall = 'errorHappenedRequestNotFound'.tr; break; case null: overall = 'errorHappenedRequestConnection'.tr; break; default: overall = 'errorHappenedRequestUnknown'.tr; break; } if (exception.data.statusCode != null) { content = Text( '$overall\n\n(${exception.data.statusCode}) ${exception.data.bodyString}', ); } else { content = Text(overall); } } return showDialog( useRootNavigator: true, context: this, builder: (ctx) => AlertDialog( title: Text('errorHappened'.tr), content: content, actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: Text('okay'.tr), ) ], ), ); } } extension ByteFormatter on int { String formatBytes({int decimals = 2}) { if (this == 0) return '0 Bytes'; const k = 1024; final dm = decimals < 0 ? 0 : decimals; final sizes = [ 'Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB' ]; final i = (math.log(this) / math.log(k)).floor().toInt(); return '${(this / math.pow(k, i)).toStringAsFixed(dm)} ${sizes[i]}'; } }