Solian/lib/exts.dart

128 lines
3.1 KiB
Dart
Raw Normal View History

import 'dart:math' as math;
2024-05-19 16:08:20 +00:00
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:solian/exceptions/request.dart';
import 'package:solian/exceptions/unauthorized.dart';
2024-05-19 16:08:20 +00:00
extension AppExtensions on BuildContext {
2024-07-31 18:10:57 +00:00
void showSnackbar(String content, {SnackBarAction? action}) {
2024-05-19 16:08:20 +00:00
ScaffoldMessenger.of(this).showSnackBar(SnackBar(
content: Text(content),
2024-07-31 18:10:57 +00:00
action: action,
2024-05-19 16:08:20 +00:00
));
}
2024-06-29 13:03:15 +00:00
void clearSnackbar() {
ScaffoldMessenger.of(this).clearSnackBars();
}
2024-06-30 10:03:02 +00:00
Future<void> showModalDialog(String title, desc) {
return showDialog<void>(
useRootNavigator: true,
context: this,
builder: (ctx) => AlertDialog(
title: Text(title),
content: Text(desc),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx),
child: Text('okay'.tr),
)
],
),
);
}
2024-08-02 17:14:42 +00:00
Future<void> showInfoDialog(String title, body) {
return showDialog<void>(
useRootNavigator: true,
context: this,
builder: (ctx) => AlertDialog(
title: Text(title),
content: Text(body),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx),
child: Text('okay'.tr),
)
],
),
);
}
2024-05-19 16:08:20 +00:00
Future<void> 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);
}
}
2024-05-19 16:08:20 +00:00
return showDialog<void>(
2024-06-01 12:18:25 +00:00
useRootNavigator: true,
2024-05-19 16:08:20 +00:00
context: this,
builder: (ctx) => AlertDialog(
title: Text('errorHappened'.tr),
content: content,
2024-05-19 16:08:20 +00:00
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]}';
}
}