Lucas f19e354418
feat: support 'turn into' in doc (#6516)
* feat: customize animation for popover

* chore: code refactor

* feat: using popover direction calculate the popover animation translate direction

* feat: integrate the animated popover in appflowy_popover and popover_action

* fix: close popover assertion

* chore: format code

* chore: code refactor

* feat: optimize the popover listener

* feat: clear popover when hot-reloading

* chore: refactor code

* feat: integrate animated popover in block action button

* fix: integration test

* feat: add turn into entry

* fix: popover asBarrier issue

* feat: move biz logic from widget to cubit

* feat: add turn into menu

* chore: remove unused code

* feat: support h1-h3

* feat: add block conversions

* fix: integration test

* feat: implement block conversions

* fix: outline test

* test: add turn into tests

* test: add turn into nested list test

* test: add turn into nested list test

* fix: flutter analyze

* chore: replace turninto icon

* feat: integrate animated popover in color option button

* chore: split the block option action into separate files

* test: add integration test

* fix: outline block test

* fix: integration test

* fix: shortcut test
2024-10-10 14:40:38 +08:00

122 lines
3.1 KiB
Dart

// ignore: import_of_legacy_library_into_null_safe
import 'dart:ffi';
import 'package:ffi/ffi.dart' as ffi;
import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart';
import 'ffi.dart';
class Log {
static final shared = Log();
// ignore: unused_field
late Logger _logger;
bool _enabled = false;
// used to disable log in tests
@visibleForTesting
bool disableLog = false;
Log() {
_logger = Logger(
printer: PrettyPrinter(
methodCount: 2, // Number of method calls to be displayed
errorMethodCount: 8, // Number of method calls if stacktrace is provided
lineLength: 120, // Width of the output
colors: true, // Colorful log messages
printEmojis: true, // Print an emoji for each log message
),
level: kDebugMode ? Level.trace : Level.info,
);
}
static void enableFlutterLog() {
shared._enabled = true;
}
// Generic internal logging function to reduce code duplication
static void _log(Level level, int rustLevel, dynamic msg,
[dynamic error, StackTrace? stackTrace]) {
if (shared._enabled) {
switch (level) {
case Level.info:
shared._logger.i(msg, stackTrace: stackTrace);
break;
case Level.debug:
shared._logger.d(msg, stackTrace: stackTrace);
break;
case Level.warning:
shared._logger.w(msg, stackTrace: stackTrace);
break;
case Level.error:
shared._logger.e(msg, stackTrace: stackTrace);
break;
case Level.trace:
shared._logger.t(msg, stackTrace: stackTrace);
break;
default:
shared._logger.log(level, msg, stackTrace: stackTrace);
}
}
String formattedMessage = _formatMessageWithStackTrace(msg, stackTrace);
rust_log(rustLevel, toNativeUtf8(formattedMessage));
}
static void info(dynamic msg, [dynamic error, StackTrace? stackTrace]) {
if (shared.disableLog) {
return;
}
_log(Level.info, 0, msg, error, stackTrace);
}
static void debug(dynamic msg, [dynamic error, StackTrace? stackTrace]) {
if (shared.disableLog) {
return;
}
_log(Level.debug, 1, msg, error, stackTrace);
}
static void warn(dynamic msg, [dynamic error, StackTrace? stackTrace]) {
if (shared.disableLog) {
return;
}
_log(Level.warning, 3, msg, error, stackTrace);
}
static void trace(dynamic msg, [dynamic error, StackTrace? stackTrace]) {
if (shared.disableLog) {
return;
}
_log(Level.trace, 2, msg, error, stackTrace);
}
static void error(dynamic msg, [dynamic error, StackTrace? stackTrace]) {
if (shared.disableLog) {
return;
}
_log(Level.error, 4, msg, error, stackTrace);
}
}
bool isReleaseVersion() {
return kReleaseMode;
}
// Utility to convert a message to native Utf8 (used in rust_log)
Pointer<ffi.Utf8> toNativeUtf8(dynamic msg) {
return "$msg".toNativeUtf8();
}
String _formatMessageWithStackTrace(dynamic msg, StackTrace? stackTrace) {
if (stackTrace != null) {
return "$msg\nStackTrace:\n$stackTrace"; // Append the stack trace to the message
}
return msg.toString();
}