accentColorMap = {
+ AccentColor.filc: Color(0xff20AC9B),
+ AccentColor.blue: Colors.blue.shade300,
+ AccentColor.green: Colors.green.shade300,
+ AccentColor.lime: Colors.lime.shade300,
+ AccentColor.yellow: Colors.yellow.shade300,
+ AccentColor.orange: Colors.deepOrange.shade300,
+ AccentColor.red: Colors.red.shade300,
+ AccentColor.pink: Colors.pink.shade300,
+ AccentColor.purple: Colors.purple.shade300,
+};
+
+abstract class ThemeAppColors {
+ final Color shadow = Color(0);
+ final Color text = Color(0);
+ final Color background = Color(0);
+ final Color highlight = Color(0);
+ final Color red = Color(0);
+ final Color orange = Color(0);
+ final Color yellow = Color(0);
+ final Color green = Color(0);
+ final Color filc = Color(0);
+ final Color teal = Color(0);
+ final Color blue = Color(0);
+ final Color indigo = Color(0);
+ final Color purple = Color(0);
+ final Color pink = Color(0);
+}
+
+class LightAppColors implements ThemeAppColors {
+ final shadow = Color(0xffE8E8E8);
+ final text = Colors.black;
+ final background = Color(0xffF4F9FF);
+ final highlight = Color(0xffFFFFFF);
+ final red = Color(0xffFF3B30);
+ final orange = Color(0xffFF9500);
+ final yellow = Color(0xffFFCC00);
+ final green = Color(0xff34C759);
+ final filc = Color(0xff247665);
+ final teal = Color(0xff5AC8FA);
+ final blue = Color(0xff007AFF);
+ final indigo = Color(0xff5856D6);
+ final purple = Color(0xffAF52DE);
+ final pink = Color(0xffFF2D55);
+}
+
+class DarkAppColors implements ThemeAppColors {
+ final shadow = Color(0);
+ final text = Colors.white;
+ final background = Color(0xff000000);
+ final highlight = Color(0xff141516);
+ final red = Color(0xffFF453A);
+ final orange = Color(0xffFF9F0A);
+ final yellow = Color(0xffFFD60A);
+ final green = Color(0xff32D74B);
+ final filc = Color(0xff29826F);
+ final teal = Color(0xff64D2FF);
+ final blue = Color(0xff0A84FF);
+ final indigo = Color(0xff5E5CE6);
+ final purple = Color(0xffBF5AF2);
+ final pink = Color(0xffFF375F);
+}
+
+class ThemeModeObserver extends ChangeNotifier {
+ ThemeMode _themeMode;
+ ThemeMode get themeMode => _themeMode;
+
+ ThemeModeObserver({ThemeMode initialTheme = ThemeMode.system}) : _themeMode = initialTheme;
+
+ void changeTheme(ThemeMode mode) {
+ _themeMode = mode;
+ notifyListeners();
+ }
+}
diff --git a/filcnaplo/lib/utils/color.dart b/filcnaplo/lib/utils/color.dart
new file mode 100644
index 0000000..40ce045
--- /dev/null
+++ b/filcnaplo/lib/utils/color.dart
@@ -0,0 +1,14 @@
+import 'package:flutter/material.dart';
+
+class ColorUtils {
+ static Color stringToColor(String str) {
+ int hash = 0;
+ for (var i = 0; i < str.length; i++) {
+ hash = str.codeUnitAt(i) + ((hash << 5) - hash);
+ }
+
+ return HSLColor.fromAHSL(1, hash % 360, .8, .75).toColor();
+ }
+
+ static Color foregroundColor(Color color) => color.computeLuminance() >= .5 ? Colors.black : Colors.white;
+}
diff --git a/filcnaplo/lib/utils/format.dart b/filcnaplo/lib/utils/format.dart
new file mode 100644
index 0000000..4c7f576
--- /dev/null
+++ b/filcnaplo/lib/utils/format.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/widgets.dart';
+import 'package:intl/intl.dart';
+import 'package:i18n_extension/i18n_widget.dart';
+import 'package:html/parser.dart';
+
+extension StringFormatUtils on String {
+ String specialChars() => this
+ .replaceAll("é", "e")
+ .replaceAll("á", "a")
+ .replaceAll("ó", "o")
+ .replaceAll("ő", "o")
+ .replaceAll("ö", "o")
+ .replaceAll("ú", "u")
+ .replaceAll("ű", "u")
+ .replaceAll("ü", "u")
+ .replaceAll("í", "i");
+
+ String capital() => this.length > 0 ? this[0].toUpperCase() + this.substring(1) : "";
+
+ String capitalize() => this.split(" ").map((w) => this.capital()).join(" ");
+
+ String escapeHtml() {
+ String htmlString = this;
+ htmlString = htmlString.replaceAll("\r", "");
+ htmlString = htmlString.replaceAll(RegExp(r'
'), "\n");
+ htmlString = htmlString.replaceAll(RegExp(r''), "");
+ htmlString = htmlString.replaceAll(RegExp(r'
'), "\n");
+ var document = parse(htmlString);
+ return document.body?.text.trim() ?? "";
+ }
+}
+
+extension DateFormatUtils on DateTime {
+ String format(BuildContext context, {bool timeOnly = false, bool weekday = false}) {
+ // Time only
+ if (timeOnly) return DateFormat("HH:mm").format(this);
+
+ DateTime now = DateTime.now();
+ if (this.difference(now).inDays == 0) {
+ if (this.hour == 0 && this.minute == 0 && this.second == 0) return "Today"; // TODO: i18n
+ return DateFormat("HH:mm").format(this);
+ }
+ if (this.difference(now).inDays == 1) return "Yesterday"; // TODO: i18n
+
+ String formatString;
+ if (this.year == now.year)
+ formatString = "MMM dd.";
+ else
+ formatString = "yy/MM/dd";
+
+ if (weekday) formatString += " (EEEE)";
+
+ return DateFormat(formatString, I18n.of(context).locale.toString()).format(this);
+ }
+}
diff --git a/filcnaplo/lib/utils/jwt.dart b/filcnaplo/lib/utils/jwt.dart
new file mode 100644
index 0000000..3540f66
--- /dev/null
+++ b/filcnaplo/lib/utils/jwt.dart
@@ -0,0 +1,18 @@
+import 'dart:convert';
+
+class JwtUtils {
+ static String? getNameFromJWT(String jwt) {
+ var parts = jwt.split(".");
+ if (parts.length != 3) return null;
+
+ if (parts[1].length % 4 == 2) {
+ parts[1] += "==";
+ } else if (parts[1].length % 4 == 3) {
+ parts[1] += "=";
+ }
+
+ var payload = utf8.decode(base64Url.decode(parts[1]));
+ var jwtData = jsonDecode(payload);
+ return jwtData["name"];
+ }
+}
diff --git a/filcnaplo/pubspec.yaml b/filcnaplo/pubspec.yaml
new file mode 100644
index 0000000..012f901
--- /dev/null
+++ b/filcnaplo/pubspec.yaml
@@ -0,0 +1,119 @@
+name: filcnaplo
+description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
+homepage: https://filcnaplo.hu
+publish_to: "none"
+
+version: 3.0.0-beta.1+120
+
+environment:
+ sdk: ">=2.12.0 <3.0.0"
+
+dependencies:
+ flutter:
+ sdk: flutter
+ cupertino_icons: ^1.0.2
+
+ # Local filcnaplo packages
+ filcnaplo_mobile_ui:
+ path: "../filcnaplo_mobile_ui/"
+ filcnaplo_desktop_ui:
+ path: "../filcnaplo_desktop_ui/"
+ filcnaplo_kreta_api:
+ path: "../filcnaplo_kreta_api/"
+
+ flutter_localizations:
+ sdk: flutter
+ i18n_extension: ^4.1.0
+ sqflite: ^2.0.0+3
+ intl: ^0.17.0
+ provider: ^5.0.0
+ http: ^0.13.3
+ uuid: ^3.0.4
+ html: ^0.15.0
+ open_file: ^3.2.1
+ path_provider: ^2.0.2
+ permission_handler: ^8.1.4+2
+ share_plus: ^2.1.4
+ package_info_plus: ^1.0.6
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ # flutter_launcher_icons: ^0.9.0
+ # flutter_native_splash: ^1.2.0
+
+flutter:
+ uses-material-design: true
+
+ assets:
+ - assets/icons/ic_launcher.png
+ - assets/icons/ic_splash.png
+
+ fonts:
+ - family: FilcIcons
+ fonts:
+ - asset: assets/fonts/FilcIcons.ttf
+ - family: Montserrat
+ fonts:
+ - asset: assets/fonts/Montserrat/Montserrat-Black.ttf
+ weight: 900
+ - asset: assets/fonts/Montserrat/Montserrat-BlackItalic.ttf
+ weight: 900
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-ExtraBold.ttf
+ weight: 800
+ - asset: assets/fonts/Montserrat/Montserrat-ExtraBoldItalic.ttf
+ weight: 800
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-Bold.ttf
+ weight: 700
+ - asset: assets/fonts/Montserrat/Montserrat-BoldItalic.ttf
+ weight: 700
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-SemiBold.ttf
+ weight: 600
+ - asset: assets/fonts/Montserrat/Montserrat-SemiBoldItalic.ttf
+ weight: 600
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-Medium.ttf
+ weight: 500
+ - asset: assets/fonts/Montserrat/Montserrat-MediumItalic.ttf
+ weight: 500
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-Regular.ttf
+ weight: 400
+ - asset: assets/fonts/Montserrat/Montserrat-Italic.ttf
+ weight: 400
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-Light.ttf
+ weight: 300
+ - asset: assets/fonts/Montserrat/Montserrat-LightItalic.ttf
+ weight: 300
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-ExtraLight.ttf
+ weight: 200
+ - asset: assets/fonts/Montserrat/Montserrat-ExtraLightItalic.ttf
+ weight: 200
+ style: italic
+ - asset: assets/fonts/Montserrat/Montserrat-Thin.ttf
+ weight: 100
+ - asset: assets/fonts/Montserrat/Montserrat-ThinItalic.ttf
+ weight: 100
+ style: italic
+
+flutter_icons:
+ image_path: "assets/icons/ic_launcher.png"
+ adaptive_icon_background: "#1F5B50"
+ adaptive_icon_foreground: "assets/icons/ic_launcher_foreground.png"
+ android: true
+ ios: true
+ remove_alpha_ios: true
+
+flutter_native_splash:
+ color: "#1F5B50"
+ image: "assets/icons/ic_splash.png"
+ android: true
+ android_gravity: center
+ ios: true
+ ios_content_mode: center
+ web: false