diff --git a/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Bold.ttf b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Bold.ttf new file mode 100644 index 0000000..18b8aea Binary files /dev/null and b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Bold.ttf differ diff --git a/filcnaplo/assets/fonts/SpaceMono/SpaceMono-BoldItalic.ttf b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-BoldItalic.ttf new file mode 100644 index 0000000..51fcc39 Binary files /dev/null and b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-BoldItalic.ttf differ diff --git a/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Italic.ttf b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Italic.ttf new file mode 100644 index 0000000..119c545 Binary files /dev/null and b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Italic.ttf differ diff --git a/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Regular.ttf b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Regular.ttf new file mode 100644 index 0000000..3374aca Binary files /dev/null and b/filcnaplo/assets/fonts/SpaceMono/SpaceMono-Regular.ttf differ diff --git a/filcnaplo/lib/api/client.dart b/filcnaplo/lib/api/client.dart index 203ca91..460c4ba 100644 --- a/filcnaplo/lib/api/client.dart +++ b/filcnaplo/lib/api/client.dart @@ -6,6 +6,7 @@ import 'package:filcnaplo/models/release.dart'; import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/supporter.dart'; import 'package:filcnaplo_kreta_api/models/school.dart'; +import 'package:flutter/cupertino.dart'; import 'package:http/http.dart' as http; class FilcAPI { @@ -119,5 +120,34 @@ class FilcAPI { return Future.value(null); } - // TODO: static Future sendReport(ErrorReport report) async {} + static Future sendReport(ErrorReport report) async { + try { + http.Response res = await http.post(Uri.parse(REPORT), body: { + "os": report.os, + "version": report.version, + "error": report.error, + "stack_trace": report.stack, + }); + + if (res.statusCode != 200) { + throw "HTTP ${res.statusCode}: ${res.body}"; + } + } catch (error) { + print("ERROR: FilcAPI.sendReport: $error"); + } + } +} + +class ErrorReport { + String stack; + String os; + String version; + String error; + + ErrorReport({ + required this.stack, + required this.os, + required this.version, + required this.error, + }); } diff --git a/filcnaplo/lib/main.dart b/filcnaplo/lib/main.dart index ef24d6a..61830b7 100644 --- a/filcnaplo/lib/main.dart +++ b/filcnaplo/lib/main.dart @@ -2,10 +2,12 @@ import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/database/init.dart'; import 'package:filcnaplo/models/settings.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:filcnaplo/app.dart'; import 'package:flutter/services.dart'; import 'package:filcnaplo_mobile_ui/screens/error_screen.dart'; +import 'package:filcnaplo_mobile_ui/screens/error_report_screen.dart'; void main() async { // Initalize @@ -39,12 +41,24 @@ class Startup { } } +bool errorShown = false; +String lastException = ''; + Widget errorBuilder(FlutterErrorDetails details) { return Builder(builder: (context) { if (Navigator.of(context).canPop()) Navigator.pop(context); WidgetsBinding.instance?.addPostFrameCallback((_) { - Navigator.of(context, rootNavigator: true).push(MaterialPageRoute(builder: (ctx) => ErrorScreen(details))); + if (!errorShown && details.exceptionAsString() != lastException) { + errorShown = true; + lastException = details.exceptionAsString(); + Navigator.of(context, rootNavigator: true).push(MaterialPageRoute(builder: (context) { + if (kReleaseMode) + return ErrorReportScreen(details); + else + return ErrorScreen(details); + })).then((_) => errorShown = false); + } }); return Container(); diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml index 01bab3a..1d22d46 100644 --- a/filcnaplo/pubspec.yaml +++ b/filcnaplo/pubspec.yaml @@ -101,6 +101,17 @@ flutter: weight: 100 style: italic + - family: SpaceMono + fonts: + - asset: assets/fonts/SpaceMono/SpaceMono-Regular.ttf + - asset: assets/fonts/SpaceMono/SpaceMono-Bold.ttf + weight: 700 + - asset: assets/fonts/SpaceMono/SpaceMono-Italic.ttf + style: italic + - asset: assets/fonts/SpaceMono/SpaceMono-BoldItalic.ttf + weight: 700 + style: italic + flutter_icons: image_path: "assets/icons/ic_launcher.png" adaptive_icon_background: "#1F5B50"