Mztj67_#M}W?l>kYSliK<%xAp;0j{!}J0!o7b
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
literal 0
HcmV?d00001
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8
GIT binary patch
literal 1418
zcmV;51$Fv~P)q
zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+
zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq
z^={4hPQv)y=I|4n+?>7Fim=dxt1
z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT
zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf`
zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_>
z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3
zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF
z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a
z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE
z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62(
zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;?
zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-<
z{s<&cCV_1`^TD^ia9!*mQDq&
zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw
zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv
zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF
z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC
YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H
literal 0
HcmV?d00001
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 000000000..0bedcf2fd
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838
GIT binary patch
literal 68
zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J
Q1PU{Fy85}Sb4q9e0B4a5jsO4v
literal 0
HcmV?d00001
diff --git a/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 000000000..89c2725b7
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/packages/deriv_logger/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/packages/deriv_logger/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..f2e259c7c
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/deriv_logger/example/ios/Runner/Base.lproj/Main.storyboard b/packages/deriv_logger/example/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..f3c28516f
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/deriv_logger/example/ios/Runner/Info.plist b/packages/deriv_logger/example/ios/Runner/Info.plist
new file mode 100644
index 000000000..7f553465b
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Info.plist
@@ -0,0 +1,51 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Example
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ example
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/packages/deriv_logger/example/ios/Runner/Runner-Bridging-Header.h b/packages/deriv_logger/example/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 000000000..308a2a560
--- /dev/null
+++ b/packages/deriv_logger/example/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/packages/deriv_logger/example/ios/RunnerTests/RunnerTests.swift b/packages/deriv_logger/example/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 000000000..86a7c3b1b
--- /dev/null
+++ b/packages/deriv_logger/example/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/packages/deriv_logger/example/lib/main.dart b/packages/deriv_logger/example/lib/main.dart
new file mode 100644
index 000000000..4c799e920
--- /dev/null
+++ b/packages/deriv_logger/example/lib/main.dart
@@ -0,0 +1,93 @@
+import 'package:deriv_logger/deriv_logger.dart';
+import 'package:flutter/material.dart';
+
+void main() {
+ AppLogger.initialize();
+ runApp(const MyApp());
+}
+
+class MyApp extends StatelessWidget {
+ const MyApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ title: 'Flutter Demo',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
+ useMaterial3: true,
+ ),
+ home: DebugOverlay(
+ enabled: true,
+ builder: (_) => const MyHomePage(
+ title: 'Flutter Demo Home Page',
+ ),
+ ),
+ );
+ }
+}
+
+class MyHomePage extends StatefulWidget {
+ const MyHomePage({super.key, required this.title});
+
+ final String title;
+
+ @override
+ State createState() => _MyHomePageState();
+}
+
+class _MyHomePageState extends State {
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ backgroundColor: Theme.of(context).colorScheme.inversePrimary,
+ title: Text(widget.title),
+ ),
+ body: const Center(
+ child: Column(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ Text(
+ 'Run this app in debug mode, press any button below and check the debug button and your terminal',
+ textAlign: TextAlign.center,
+ ),
+ ],
+ ),
+ ),
+ floatingActionButton: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceEvenly,
+ children: [
+ FloatingActionButton(
+ onPressed: () => AppLogger.i('Information', title: 'Main page'),
+ tooltip: 'information',
+ child: const Text('Information'),
+ ),
+ FloatingActionButton(
+ onPressed: () => AppLogger.e('This is error!!', title: 'Main page'),
+ tooltip: 'error',
+ child: const Text('Error'),
+ ),
+ FloatingActionButton(
+ onPressed: () =>
+ AppLogger.w('Showing some warning!!', title: 'Main page'),
+ tooltip: 'warning',
+ child: const Text('Warning'),
+ ),
+ FloatingActionButton(
+ onPressed: () =>
+ AppLogger.f('This is a fatal message', title: ' Main Page'),
+ tooltip: 'fatal',
+ child: const Text('Fatal'),
+ ),
+ FloatingActionButton(
+ onPressed: () =>
+ AppLogger.s('This is a success', title: ' Main Page'),
+ tooltip: 'success',
+ child: const Text('Success'),
+ ),
+ ],
+ ),
+ );
+ }
+}
diff --git a/packages/deriv_logger/example/pubspec.yaml b/packages/deriv_logger/example/pubspec.yaml
new file mode 100644
index 000000000..279fd887a
--- /dev/null
+++ b/packages/deriv_logger/example/pubspec.yaml
@@ -0,0 +1,90 @@
+name: example
+description: A new Flutter project.
+# The following line prevents the package from being accidentally published to
+# pub.dev using `flutter pub publish`. This is preferred for private packages.
+publish_to: "none" # Remove this line if you wish to publish to pub.dev
+
+# The following defines the version and build number for your application.
+# A version number is three numbers separated by dots, like 1.2.43
+# followed by an optional build number separated by a +.
+# Both the version and the builder number may be overridden in flutter
+# build by specifying --build-name and --build-number, respectively.
+# In Android, build-name is used as versionName while build-number used as versionCode.
+# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
+# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.
+# Read more about iOS versioning at
+# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
+# In Windows, build-name is used as the major, minor, and patch parts
+# of the product and file versions while build-number is used as the build suffix.
+version: 1.0.0+1
+
+environment:
+ sdk: ">=3.0.2 <4.0.0"
+
+# Dependencies specify other packages that your package needs in order to work.
+# To automatically upgrade your package dependencies to the latest versions
+# consider running `flutter pub upgrade --major-versions`. Alternatively,
+# dependencies can be manually updated by changing the version numbers below to
+# the latest version available on pub.dev. To see which dependencies have newer
+# versions available, run `flutter pub outdated`.
+dependencies:
+ flutter:
+ sdk: flutter
+ deriv_logger:
+ path: ../
+
+ # The following adds the Cupertino Icons font to your application.
+ # Use with the CupertinoIcons class for iOS style icons.
+ cupertino_icons: ^1.0.2
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+
+ # The "flutter_lints" package below contains a set of recommended lints to
+ # encourage good coding practices. The lint set provided by the package is
+ # activated in the `analysis_options.yaml` file located at the root of your
+ # package. See that file for information about deactivating specific lint
+ # rules and activating additional ones.
+ flutter_lints: ^2.0.0
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter packages.
+flutter:
+ # The following line ensures that the Material Icons font is
+ # included with your application, so that you can use the icons in
+ # the material Icons class.
+ uses-material-design: true
+
+ # To add assets to your application, add an assets section, like this:
+ # assets:
+ # - images/a_dot_burr.jpeg
+ # - images/a_dot_ham.jpeg
+
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.dev/assets-and-images/#resolution-aware
+
+ # For details regarding adding assets from package dependencies, see
+ # https://flutter.dev/assets-and-images/#from-packages
+
+ # To add custom fonts to your application, add a fonts section here,
+ # in this "flutter" section. Each entry in this list should have a
+ # "family" key with the font family name, and a "fonts" key with a
+ # list giving the asset and other descriptors for the font. For
+ # example:
+ # fonts:
+ # - family: Schyler
+ # fonts:
+ # - asset: fonts/Schyler-Regular.ttf
+ # - asset: fonts/Schyler-Italic.ttf
+ # style: italic
+ # - family: Trajan Pro
+ # fonts:
+ # - asset: fonts/TrajanPro.ttf
+ # - asset: fonts/TrajanPro_Bold.ttf
+ # weight: 700
+ #
+ # For details regarding fonts from package dependencies,
+ # see https://flutter.dev/custom-fonts/#from-packages
diff --git a/packages/deriv_logger/example/test/widget_test.dart b/packages/deriv_logger/example/test/widget_test.dart
new file mode 100644
index 000000000..092d222f7
--- /dev/null
+++ b/packages/deriv_logger/example/test/widget_test.dart
@@ -0,0 +1,30 @@
+// This is a basic Flutter widget test.
+//
+// To perform an interaction with a widget in your test, use the WidgetTester
+// utility in the flutter_test package. For example, you can send tap and scroll
+// gestures. You can also use WidgetTester to find child widgets in the widget
+// tree, read text, and verify that the values of widget properties are correct.
+
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+
+import 'package:example/main.dart';
+
+void main() {
+ testWidgets('Counter increments smoke test', (WidgetTester tester) async {
+ // Build our app and trigger a frame.
+ await tester.pumpWidget(const MyApp());
+
+ // Verify that our counter starts at 0.
+ expect(find.text('0'), findsOneWidget);
+ expect(find.text('1'), findsNothing);
+
+ // Tap the '+' icon and trigger a frame.
+ await tester.tap(find.byIcon(Icons.add));
+ await tester.pump();
+
+ // Verify that our counter has incremented.
+ expect(find.text('0'), findsNothing);
+ expect(find.text('1'), findsOneWidget);
+ });
+}
diff --git a/packages/deriv_logger/lib/controllers/logger_controller.dart b/packages/deriv_logger/lib/controllers/logger_controller.dart
new file mode 100644
index 000000000..d556c53f2
--- /dev/null
+++ b/packages/deriv_logger/lib/controllers/logger_controller.dart
@@ -0,0 +1,116 @@
+import 'dart:convert';
+
+import 'package:deriv_logger/core/app_logger.dart';
+import 'package:flutter/material.dart';
+
+/// The controller for console logs that is responsible for managing the logs
+/// into readable streams.
+class ConsoleLogController extends ChangeNotifier {
+ /// Creates an instance of the controller.
+ ConsoleLogController();
+
+ final List _logs = [];
+
+ /// This returns the logs in reverse order.
+ List get logs => _logs.reversed.toList();
+
+ /// This will initialize the controller.
+ void initialize() {
+ AppLogger.logStream.listen((LogDetails log) {
+ _logs.add(
+ ConsoleLogVM(
+ color: _getColorFromLevel(log.logLevel),
+ level: log.logLevel.name.toUpperCase(),
+ text: _getFormattedLog(log.message),
+ time: _getFormattedTime(log.time),
+ title: log.title,
+ stackTrace: log.stackTrace?.toString(),
+ ),
+ );
+ notifyListeners();
+ });
+ }
+
+ /// Clears all the logs from the log list.
+ void clearLogs() {
+ _logs.clear();
+ notifyListeners();
+ }
+
+ String _getFormattedLog(dynamic object) {
+ try {
+ if (object is String) {
+ return object;
+ } else if (object is List || object is Map) {
+ final String spaces = ' ' * 2;
+ return JsonEncoder.withIndent(spaces).convert(object);
+ } else {
+ return object.toString();
+ }
+ } on Exception catch (_) {
+ return object.toString();
+ }
+ }
+
+ String _getFormattedTime(DateTime dateTime) {
+ final DateTime dateInLocal = dateTime.toLocal();
+ return dateInLocal.toString();
+ }
+
+ Color _getColorFromLevel(AppLogLevel level) {
+ switch (level) {
+ case AppLogLevel.debug:
+ return Colors.black;
+ case AppLogLevel.info:
+ return Colors.blue;
+ case AppLogLevel.warning:
+ return Colors.orange;
+ case AppLogLevel.error:
+ return Colors.red;
+ case AppLogLevel.fatal:
+ return Colors.pink;
+ case AppLogLevel.success:
+ return Colors.green;
+ }
+ }
+}
+
+/// This is the view model for the console log.
+class ConsoleLogVM {
+ /// This is the view model for the console log.
+ ConsoleLogVM({
+ required this.level,
+ required this.text,
+ required this.time,
+ required this.color,
+ this.title,
+ this.stackTrace,
+ });
+
+ /// The color of the log based on its severity.
+ final Color color;
+
+ /// The level of the log i.e
+ final String level;
+
+ /// The actual message to print in the console.
+ final String text;
+
+ /// THe time stamp
+ final String time;
+
+ /// Title of the log.
+ final String? title;
+
+ /// Stack trace of the log.
+ final String? stackTrace;
+
+ @override
+ String toString() => jsonEncode({
+ 'level': level,
+ 'time': time,
+ 'title': title,
+ 'text': text,
+ 'stackTrace': stackTrace,
+ });
+}
diff --git a/packages/deriv_logger/lib/core/app_logger.dart b/packages/deriv_logger/lib/core/app_logger.dart
new file mode 100644
index 000000000..99c2e40b6
--- /dev/null
+++ b/packages/deriv_logger/lib/core/app_logger.dart
@@ -0,0 +1,171 @@
+import 'dart:async';
+
+import 'package:logger/logger.dart';
+
+enum AppLogLevel {
+ debug,
+ info,
+ warning,
+ error,
+ fatal,
+ success,
+}
+
+const Map _packageLogLevelToAppLogLevel = {
+ Level.trace: AppLogLevel.success,
+ Level.info: AppLogLevel.info,
+ Level.warning: AppLogLevel.warning,
+ Level.error: AppLogLevel.error,
+ Level.fatal: AppLogLevel.fatal,
+};
+
+class AppLogger {
+ AppLogger._();
+ static late Logger _logger;
+ static bool _enableDebugging = false;
+
+ static late StreamController _logController;
+
+ /// Initialize the logger.
+ static void initialize({bool enableDebugging = true}) {
+ _enableDebugging = enableDebugging;
+
+ _logger = Logger(
+ filter: DevelopmentFilter(),
+ printer: PrettyPrinter(
+ methodCount: 0,
+ levelColors: {
+ Level.trace: const AnsiColor.fg(2),
+ },
+ ),
+ );
+ _logController = StreamController.broadcast();
+ }
+
+ /// Stream of logs.
+ static Stream get logStream => _logController.stream;
+
+ /// This logs [error] messages with red color.
+ static void e(
+ dynamic message, {
+ DateTime? time,
+ String? title,
+ StackTrace? stackTrace,
+ }) {
+ _log(
+ level: Level.error,
+ message: message,
+ title: title,
+ time: time,
+ stackTrace: stackTrace ?? StackTrace.current,
+ );
+ }
+
+ /// This logs [information] message with blue color.
+ static void i(
+ dynamic message, {
+ DateTime? time,
+ String? title,
+ StackTrace? stackTrace,
+ }) {
+ _log(
+ message: message,
+ stackTrace: stackTrace ?? StackTrace.empty,
+ title: title,
+ time: time,
+ );
+ }
+
+ /// This logs [warning] message with yellow color.
+ static void w(
+ dynamic message, {
+ DateTime? time,
+ String? title,
+ StackTrace? stackTrace,
+ }) {
+ _log(
+ level: Level.warning,
+ message: message,
+ title: title,
+ time: time,
+ stackTrace: stackTrace ?? StackTrace.empty,
+ );
+ }
+
+ /// This logs [fatal] messages with purple color.
+ static void f(
+ dynamic message, {
+ DateTime? time,
+ String? title,
+ StackTrace? stackTrace,
+ }) {
+ _log(
+ level: Level.fatal,
+ message: message,
+ title: title,
+ stackTrace: stackTrace ?? StackTrace.current,
+ );
+ }
+
+ /// This logs [successful] events/message with green color.
+ static void s(
+ dynamic message, {
+ DateTime? time,
+ String? title,
+ }) {
+ _log(
+ level: Level.trace,
+ message: message,
+ title: title,
+ stackTrace: StackTrace.empty,
+ time: time,
+ );
+ }
+
+ void dispose() {
+ _logController.close();
+ }
+
+ static void _log({
+ Level level = Level.info,
+ dynamic message,
+ DateTime? time,
+ String? title,
+ StackTrace? stackTrace,
+ }) {
+ if (!_enableDebugging) return;
+ _logger.log(
+ level,
+ message,
+ time: time,
+ error: title,
+ stackTrace: stackTrace,
+ );
+ _logController.sink.add(
+ LogDetails(
+ title: title ?? '',
+ message: message,
+ time: time ?? DateTime.now(),
+ stackTrace: stackTrace,
+ logLevel: _packageLogLevelToAppLogLevel[level]!,
+ ),
+ );
+ }
+}
+
+class LogDetails {
+ /// Details of the logs.
+ LogDetails({
+ required this.title,
+ required this.message,
+ required this.time,
+ required this.logLevel,
+ this.stackTrace,
+ });
+
+ final DateTime time;
+ final String title;
+ final dynamic message;
+ final AppLogLevel logLevel;
+ final StackTrace? stackTrace;
+}
diff --git a/packages/deriv_logger/lib/deriv_logger.dart b/packages/deriv_logger/lib/deriv_logger.dart
new file mode 100644
index 000000000..4b0032aa9
--- /dev/null
+++ b/packages/deriv_logger/lib/deriv_logger.dart
@@ -0,0 +1,5 @@
+library deriv_logger;
+
+export './controllers/logger_controller.dart';
+export './core/app_logger.dart';
+export './views/views.dart';
diff --git a/packages/deriv_logger/lib/views/console_log_view.dart b/packages/deriv_logger/lib/views/console_log_view.dart
new file mode 100644
index 000000000..3f2db50c0
--- /dev/null
+++ b/packages/deriv_logger/lib/views/console_log_view.dart
@@ -0,0 +1,138 @@
+import 'package:deriv_logger/controllers/logger_controller.dart';
+import 'package:deriv_logger/views/logger_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+
+/// Page for Console logs.
+class ConsoleLogsView extends StatelessWidget {
+ /// Creates a new instance of the ConsoleLogsView.
+ const ConsoleLogsView({
+ required this.consoleLogsController,
+ required this.theme,
+ super.key,
+ });
+
+ /// The console log controller.
+ final ConsoleLogController consoleLogsController;
+
+ /// theme
+ final DebugOverlayTheme theme;
+
+ @override
+ Widget build(BuildContext context) => AnimatedBuilder(
+ animation: consoleLogsController,
+ builder: (BuildContext context, _) => SafeArea(
+ child: Scaffold(
+ appBar: AppBar(title: const Text('Console logs')),
+ floatingActionButton: consoleLogsController.logs.isEmpty
+ ? const SizedBox()
+ : FloatingActionButton(
+ onPressed: () => consoleLogsController.clearLogs(),
+ child: const Icon(Icons.delete),
+ ),
+ backgroundColor: theme.backgroundColor,
+ body: consoleLogsController.logs.isEmpty
+ ? Center(
+ child: Text(
+ 'No logs available!',
+ style: theme.bodyTextStyle,
+ ),
+ )
+ : ListView.separated(
+ physics: const BouncingScrollPhysics(),
+ itemCount: consoleLogsController.logs.length,
+ padding: const EdgeInsets.symmetric(vertical: 16),
+ separatorBuilder: (_, __) => const SizedBox(height: 12),
+ itemBuilder: (_, int index) => ConsoleLogCard(
+ log: consoleLogsController.logs[index],
+ theme: theme,
+ ),
+ ),
+ ),
+ ),
+ );
+}
+
+/// Log item UI.
+class ConsoleLogCard extends StatelessWidget {
+ /// Creates a UI for log messages.
+ const ConsoleLogCard({
+ super.key,
+ required this.log,
+ required this.theme,
+ });
+ final ConsoleLogVM log;
+ final DebugOverlayTheme theme;
+
+ @override
+ Widget build(BuildContext context) => Container(
+ padding: const EdgeInsets.all(12),
+ margin: const EdgeInsets.symmetric(horizontal: 12),
+ decoration: BoxDecoration(
+ color: log.color.withOpacity(0.1),
+ borderRadius: BorderRadius.circular(8),
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.start,
+ children: [
+ _buildHeader(context),
+ Divider(thickness: 0.2, height: 12, color: log.color),
+ if (log.title != null) ...[
+ _buildLogTitle(context),
+ const SizedBox(height: 8),
+ ],
+ _buildLogContent(context),
+ if (log.stackTrace != null) ...[
+ const Divider(thickness: 0.5, height: 12),
+ _buildStackTrace(context),
+ ],
+ ],
+ ),
+ );
+
+ Widget _buildHeader(BuildContext context) => Row(
+ children: [
+ Text(
+ log.level,
+ style: TextStyle(fontWeight: FontWeight.bold, color: log.color),
+ ),
+ const Spacer(),
+ const SizedBox(width: 16),
+ Text(
+ log.time,
+ style: theme.subtitleTextStyle
+ .copyWith(fontStyle: FontStyle.italic, color: log.color),
+ ),
+ const SizedBox(width: 16),
+ GestureDetector(
+ onTap: () => Clipboard.setData(ClipboardData(text: log.toString())),
+ child: Icon(
+ Icons.copy,
+ size: 18,
+ color: log.color,
+ ),
+ ),
+ ],
+ );
+
+ Widget _buildLogTitle(BuildContext context) => Text(
+ log.title!,
+ style: theme.bodyTextStyle
+ .copyWith(fontWeight: FontWeight.bold, color: log.color),
+ );
+
+ Widget _buildLogContent(BuildContext context) =>
+ Text(log.text, style: theme.bodyTextStyle);
+
+ Widget _buildStackTrace(BuildContext context) => Scrollbar(
+ child: SingleChildScrollView(
+ scrollDirection: Axis.horizontal,
+ physics: const BouncingScrollPhysics(),
+ child: Text(
+ log.stackTrace!,
+ style: theme.subtitleTextStyle.copyWith(),
+ maxLines: 10,
+ ),
+ ),
+ );
+}
diff --git a/packages/deriv_logger/lib/views/debug_button.dart b/packages/deriv_logger/lib/views/debug_button.dart
new file mode 100644
index 000000000..477962326
--- /dev/null
+++ b/packages/deriv_logger/lib/views/debug_button.dart
@@ -0,0 +1,109 @@
+import 'package:deriv_logger/views/logger_theme.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/physics.dart';
+
+/// Button for debug overlay
+class DebugOverlayButton extends StatefulWidget {
+ /// Instance of BUtton
+ const DebugOverlayButton({
+ required this.child,
+ required this.onTap,
+ required this.theme,
+ super.key,
+ });
+ final Widget child;
+ final Function() onTap;
+ final DebugOverlayTheme theme;
+
+ @override
+ State createState() => _DebugOverlayButtonState();
+}
+
+class _DebugOverlayButtonState extends State
+ with SingleTickerProviderStateMixin {
+ late AnimationController _controller;
+ final SimulationCalculator _simulationCalculator = SimulationCalculator();
+ Alignment _dragAlignment = Alignment.centerRight;
+
+ void _runAnimation(Offset pixelsPerSecond, Size size) {
+ _controller
+ .drive(AlignmentTween(begin: _dragAlignment, end: _dragAlignment));
+ _setSide();
+ final SpringSimulation simulation =
+ _simulationCalculator.calculateSimulation(pixelsPerSecond, size);
+ _controller.animateWith(simulation);
+ }
+
+ @override
+ void initState() {
+ super.initState();
+ _controller = AnimationController(vsync: this);
+ _setSide();
+ }
+
+ @override
+ void dispose() {
+ _controller.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ final Size size = MediaQuery.of(context).size;
+
+ return GestureDetector(
+ onPanDown: (DragDownDetails details) => _controller.stop(),
+ onPanUpdate: (DragUpdateDetails details) => _setPosition(details, size),
+ onPanEnd: (DragEndDetails details) =>
+ _runAnimation(details.velocity.pixelsPerSecond, size),
+ onTap: widget.onTap,
+ child: Align(
+ alignment: _dragAlignment,
+ child: DecoratedBox(
+ decoration: BoxDecoration(
+ color: widget.theme.primaryColor,
+ shape: BoxShape.circle,
+ ),
+ child: widget.child,
+ ),
+ ),
+ );
+ }
+
+ void _setSide() {
+ final bool isLeft = _dragAlignment.x < 0.0;
+ if (isLeft) {
+ setState(() => _dragAlignment = Alignment(-0.95, _dragAlignment.y));
+ } else {
+ setState(() => _dragAlignment = Alignment(0.95, _dragAlignment.y));
+ }
+ }
+
+ void _setPosition(DragUpdateDetails details, Size size) {
+ setState(
+ () {
+ _dragAlignment += Alignment(
+ details.delta.dx / (size.width / 2),
+ details.delta.dy / (size.height / 2),
+ );
+ },
+ );
+ }
+}
+
+/// Simulation calculator for UI.
+class SimulationCalculator {
+ /// Calculates the position of the gesture.
+ SpringSimulation calculateSimulation(Offset pixelsPerSecond, Size size) {
+ final double unitsPerSecondX = pixelsPerSecond.dx / size.width;
+ final double unitsPerSecondY = pixelsPerSecond.dy / size.height;
+ final Offset unitsPerSecond = Offset(unitsPerSecondX, unitsPerSecondY);
+ final double unitVelocity = unitsPerSecond.distance;
+
+ const SpringDescription spring =
+ SpringDescription(mass: 30, stiffness: 1, damping: 1);
+ final SpringSimulation simulation =
+ SpringSimulation(spring, 0, 1, -unitVelocity);
+ return simulation;
+ }
+}
diff --git a/packages/deriv_logger/lib/views/debug_overlay.dart b/packages/deriv_logger/lib/views/debug_overlay.dart
new file mode 100644
index 000000000..aaedd04e3
--- /dev/null
+++ b/packages/deriv_logger/lib/views/debug_overlay.dart
@@ -0,0 +1,81 @@
+import 'package:deriv_logger/controllers/logger_controller.dart';
+import 'package:deriv_logger/views/console_log_view.dart';
+import 'package:deriv_logger/views/debug_button.dart';
+import 'package:deriv_logger/views/logger_theme.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+
+/// DebugOverlay
+class DebugOverlay extends StatefulWidget {
+ /// Overlay UI
+ const DebugOverlay({
+ required this.builder,
+ super.key,
+ this.icon = const Icon(Icons.bug_report_outlined),
+ this.enabled = kDebugMode,
+ });
+
+ /// Widget that is displayed at DebugOverlay action header.
+ final Widget icon;
+
+ /// Should return your application widget for which DebugOverlay is applied.
+ final WidgetBuilder builder;
+
+ /// When this field is [true] - debug overlay is running in your app.
+ /// By default, this field get value from const [kDebugMode].
+ final bool enabled;
+
+ @override
+ State createState() => _DebugOverlayState();
+}
+
+class _DebugOverlayState extends State {
+ final ConsoleLogController consoleLogsController = ConsoleLogController();
+
+ @override
+ void initState() {
+ super.initState();
+
+ if (widget.enabled) {
+ WidgetsBinding.instance.addPostFrameCallback(
+ (Duration timeStamp) => _insertOverlay(context));
+ }
+
+ consoleLogsController.initialize();
+ }
+
+ @override
+ Widget build(BuildContext context) => widget.builder.call(context);
+
+ void _insertOverlay(BuildContext context) {
+ const DebugOverlayTheme theme = DebugOverlayTheme();
+
+ return Overlay.of(context).insert(
+ OverlayEntry(
+ builder: (BuildContext context) => DebugOverlayButton(
+ theme: theme,
+ onTap: () => _onButtonTap(context, theme),
+ child: widget.icon,
+ ),
+ ),
+ );
+ }
+
+ void _onButtonTap(BuildContext context, DebugOverlayTheme theme) {
+ showModalBottomSheet(
+ context: context,
+ isScrollControlled: true,
+ backgroundColor: theme.backgroundColor,
+ shape: const RoundedRectangleBorder(
+ borderRadius: BorderRadius.vertical(top: Radius.circular(12)),
+ ),
+ builder: (BuildContext ctx) => FractionallySizedBox(
+ heightFactor: 0.9,
+ child: ConsoleLogsView(
+ theme: theme,
+ consoleLogsController: consoleLogsController,
+ ),
+ ),
+ );
+ }
+}
diff --git a/packages/deriv_logger/lib/views/logger_theme.dart b/packages/deriv_logger/lib/views/logger_theme.dart
new file mode 100644
index 000000000..df3496a5c
--- /dev/null
+++ b/packages/deriv_logger/lib/views/logger_theme.dart
@@ -0,0 +1,55 @@
+import 'package:flutter/material.dart';
+
+/// Theme for debug.
+class DebugOverlayTheme {
+ /// Creates a mini theme for debug UI.
+ const DebugOverlayTheme({
+ this.primaryColor = Colors.green,
+ this.backgroundColor = Colors.white,
+ this.cardColor = Colors.white,
+ this.headerTextStyle = const TextStyle(
+ color: Colors.black,
+ fontSize: 20,
+ fontWeight: FontWeight.w600,
+ fontFamily: 'Monospace',
+ ),
+ this.bodyTextStyle = const TextStyle(
+ color: Colors.black,
+ fontSize: 14,
+ fontWeight: FontWeight.w400,
+ fontFamily: 'Monospace',
+ ),
+ this.subtitleTextStyle = const TextStyle(
+ color: Colors.black,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ fontFamily: 'Monospace',
+ ),
+ });
+
+ /// Primary color for the ui.
+ final Color primaryColor;
+
+ /// Background color
+ final Color backgroundColor;
+
+ ///color of the card.
+ final Color cardColor;
+
+ /// Text style for the header.
+ final TextStyle headerTextStyle;
+
+ /// Body text style
+ final TextStyle bodyTextStyle;
+
+ /// subtitle text style.
+ final TextStyle subtitleTextStyle;
+}
+
+final List defaultShadow = [
+ BoxShadow(
+ blurRadius: 12,
+ offset: const Offset(0, 2),
+ color: Colors.black.withOpacity(0.1),
+ )
+];
diff --git a/packages/deriv_logger/lib/views/views.dart b/packages/deriv_logger/lib/views/views.dart
new file mode 100644
index 000000000..a12c2f3cc
--- /dev/null
+++ b/packages/deriv_logger/lib/views/views.dart
@@ -0,0 +1,4 @@
+export 'console_log_view.dart';
+export 'debug_button.dart';
+export 'debug_overlay.dart';
+export 'logger_theme.dart';
diff --git a/packages/deriv_logger/pubspec.yaml b/packages/deriv_logger/pubspec.yaml
new file mode 100644
index 000000000..a339ff738
--- /dev/null
+++ b/packages/deriv_logger/pubspec.yaml
@@ -0,0 +1,53 @@
+name: deriv_logger
+description: A debugging tool for deriv applications.
+version: 0.0.1
+
+environment:
+ sdk: ">=3.0.2 <4.0.0"
+
+dependencies:
+ flutter:
+ sdk: flutter
+ logger: ^2.3.0
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ flutter_lints: ^2.0.0
+
+# For information on the generic Dart part of this file, see the
+# following page: https://dart.dev/tools/pub/pubspec
+
+# The following section is specific to Flutter packages.
+flutter:
+
+ # To add assets to your package, add an assets section, like this:
+ # assets:
+ # - images/a_dot_burr.jpeg
+ # - images/a_dot_ham.jpeg
+ #
+ # For details regarding assets in packages, see
+ # https://flutter.dev/assets-and-images/#from-packages
+ #
+ # An image asset can refer to one or more resolution-specific "variants", see
+ # https://flutter.dev/assets-and-images/#resolution-aware
+
+ # To add custom fonts to your package, add a fonts section here,
+ # in this "flutter" section. Each entry in this list should have a
+ # "family" key with the font family name, and a "fonts" key with a
+ # list giving the asset and other descriptors for the font. For
+ # example:
+ # fonts:
+ # - family: Schyler
+ # fonts:
+ # - asset: fonts/Schyler-Regular.ttf
+ # - asset: fonts/Schyler-Italic.ttf
+ # style: italic
+ # - family: Trajan Pro
+ # fonts:
+ # - asset: fonts/TrajanPro.ttf
+ # - asset: fonts/TrajanPro_Bold.ttf
+ # weight: 700
+ #
+ # For details regarding fonts in packages, see
+ # https://flutter.dev/custom-fonts/#from-packages
diff --git a/packages/update_checker/pubspec.lock b/packages/update_checker/pubspec.lock
index 6a9f8499d..e0a3ee603 100644
--- a/packages/update_checker/pubspec.lock
+++ b/packages/update_checker/pubspec.lock
@@ -85,10 +85,10 @@ packages:
dependency: transitive
description:
name: collection
- sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
+ sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev"
source: hosted
- version: "1.17.2"
+ version: "1.17.1"
convert:
dependency: transitive
description:
@@ -316,18 +316,18 @@ packages:
dependency: transitive
description:
name: matcher
- sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
+ sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev"
source: hosted
- version: "0.12.16"
+ version: "0.12.15"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
- sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
+ sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev"
source: hosted
- version: "0.5.0"
+ version: "0.2.0"
meta:
dependency: transitive
description:
@@ -380,10 +380,10 @@ packages:
dependency: "direct main"
description:
name: package_info_plus
- sha256: cbff87676c352d97116af6dbea05aa28c4d65eb0f6d5677a520c11a69ca9a24d
+ sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017"
url: "https://pub.dev"
source: hosted
- version: "3.1.0"
+ version: "4.2.0"
package_info_plus_platform_interface:
dependency: transitive
description:
@@ -489,10 +489,10 @@ packages:
dependency: transitive
description:
name: source_span
- sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
+ sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev"
source: hosted
- version: "1.10.0"
+ version: "1.9.1"
stack_trace:
dependency: transitive
description:
@@ -529,26 +529,26 @@ packages:
dependency: "direct dev"
description:
name: test
- sha256: "13b41f318e2a5751c3169137103b60c584297353d4b1761b66029bae6411fe46"
+ sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4"
url: "https://pub.dev"
source: hosted
- version: "1.24.3"
+ version: "1.24.1"
test_api:
dependency: transitive
description:
name: test_api
- sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
+ sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev"
source: hosted
- version: "0.6.0"
+ version: "0.5.1"
test_core:
dependency: transitive
description:
name: test_core
- sha256: "99806e9e6d95c7b059b7a0fc08f07fc53fabe54a829497f0d9676299f1e8637e"
+ sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93"
url: "https://pub.dev"
source: hosted
- version: "0.5.3"
+ version: "0.5.1"
typed_data:
dependency: transitive
description:
@@ -581,14 +581,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.2"
- web:
- dependency: transitive
- description:
- name: web
- sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
- url: "https://pub.dev"
- source: hosted
- version: "0.1.4-beta"
web_socket_channel:
dependency: transitive
description:
@@ -622,5 +614,5 @@ packages:
source: hosted
version: "3.1.1"
sdks:
- dart: ">=3.1.0-185.0.dev <4.0.0"
+ dart: ">=3.0.0 <4.0.0"
flutter: ">=3.10.2"