diff --git a/app/.gitignore b/app/.gitignore index f722bdf..bb80847 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -47,3 +47,4 @@ app.*.map.json /android/app/release /deb_builder/ +*.deb diff --git a/app/lib/extensions/context_extension.dart b/app/lib/extensions/context_extension.dart index d887823..124e606 100644 --- a/app/lib/extensions/context_extension.dart +++ b/app/lib/extensions/context_extension.dart @@ -1,7 +1,13 @@ +import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:flutter/material.dart'; +import 'package:dde_gesture_manager/extensions.dart'; extension ContextExtension on BuildContext { ThemeData get t => Theme.of(this); NavigatorState get n => Navigator.of(this); + + bool get hasToken => this.read().accessToken.notNull; + + bool get watchHasToken => this.watch().accessToken.notNull; } diff --git a/app/lib/main.dart b/app/lib/main.dart index 3f7fad5..086a468 100644 --- a/app/lib/main.dart +++ b/app/lib/main.dart @@ -12,6 +12,7 @@ import 'package:dde_gesture_manager/themes/light.dart'; import 'package:dde_gesture_manager/utils/helper.dart'; import 'package:dde_gesture_manager/utils/init.dart'; import 'package:dde_gesture_manager/utils/simple_throttle.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -27,7 +28,9 @@ Future main() async { options.dsn = 'https://febbfdeac6874a01b5fee56b2ba9515c@o644838.ingest.sentry.io/6216990'; // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. // We recommend adjusting this value in production. - options.tracesSampleRate = 1.0; + options.tracesSampleRate = kReleaseMode ? 0.1 : 1.0; + options.reportPackages = false; + options.maxDeduplicationItems = 3; }, appRunner: () => runApp(EasyLocalization( supportedLocales: supportedLocales, @@ -82,6 +85,10 @@ class MyApp extends StatelessWidget { Future.microtask(() { initEvents(context); SimpleThrottle.throttledFunc(_checkAuthStatus, timeout: const Duration(minutes: 5))?.call(context); + SimpleThrottle.throttledFunc( + Sentry.captureMessage, + timeout: const Duration(days: 1), + )?.call('App launched'); }); return Container(); }), @@ -97,7 +104,7 @@ class MyApp extends StatelessWidget { void _checkAuthStatus(BuildContext context) { if (H().lastCheckAuthStatusTime != null && H().lastCheckAuthStatusTime!.difference(DateTime.now()) < Duration(minutes: 10)) return; - if (context.read().accessToken.notNull) { + if (context.hasToken) { Api.checkAuthStatus().then((value) { if (!value) context.read().setProps(email: '', accessToken: ''); }); diff --git a/app/lib/models/configs.dart b/app/lib/models/configs.dart index 4b27e0e..b015ea5 100644 --- a/app/lib/models/configs.dart +++ b/app/lib/models/configs.dart @@ -2,6 +2,7 @@ import 'package:dde_gesture_manager/builder/provider_annotation.dart'; import 'package:dde_gesture_manager/constants/sp_keys.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/utils/helper.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; enum BrightnessMode { system, @@ -45,9 +46,12 @@ class Configs { set email(String? emailAddress) { _email = emailAddress; - if (emailAddress.notNull) + if (emailAddress.notNull) { H().sp.updateString(SPKeys.loginEmail, emailAddress!); - else + Sentry.configureScope( + (scope) => scope.user = SentryUser(email: emailAddress), + ); + } else H().sp.remove(SPKeys.loginEmail); } diff --git a/app/lib/pages/gesture_editor.dart b/app/lib/pages/gesture_editor.dart index a5c5d2e..666f3eb 100644 --- a/app/lib/pages/gesture_editor.dart +++ b/app/lib/pages/gesture_editor.dart @@ -2,7 +2,6 @@ import 'package:adaptive_scrollbar/adaptive_scrollbar.dart'; import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/http/api.dart'; -import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:dde_gesture_manager/models/content_layout.provider.dart'; import 'package:dde_gesture_manager/models/local_schemes_provider.dart'; import 'package:dde_gesture_manager/models/scheme.dart'; @@ -305,7 +304,7 @@ class GestureEditor extends StatelessWidget { Notificator.error(context, title: LocaleKeys.info_upload_pls_add_description.tr()); return; } - if (context.read().accessToken.isNull) { + if (!context.hasToken) { return Notificator.showAlert( title: LocaleKeys.info_login_for_upload_title.tr(), description: LocaleKeys.info_login_for_upload_description.tr(), diff --git a/app/lib/pages/local_manager.dart b/app/lib/pages/local_manager.dart index 35bb184..db9accb 100644 --- a/app/lib/pages/local_manager.dart +++ b/app/lib/pages/local_manager.dart @@ -13,6 +13,7 @@ import 'package:dde_gesture_manager/widgets/dde_button.dart'; import 'package:dde_gesture_manager_api/models.dart' show SchemeForDownload; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:uuid/uuid.dart'; class LocalManager extends StatefulWidget { @@ -262,6 +263,7 @@ class LocalManagerState extends State { localSchemes.firstWhere((ele) => ele.path == _selectedItemPath).scheme; context.read().setProps(appliedSchemeId: appliedScheme.id); SchemeApplyUtil().apply(context, appliedScheme); + Sentry.captureMessage('Scheme applied: [${appliedScheme.name}](${appliedScheme.id})'); }, ), ] diff --git a/app/lib/pages/market_or_me.dart b/app/lib/pages/market_or_me.dart index 447c963..1a46545 100644 --- a/app/lib/pages/market_or_me.dart +++ b/app/lib/pages/market_or_me.dart @@ -1,6 +1,5 @@ import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/extensions.dart'; -import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:dde_gesture_manager/models/content_layout.provider.dart'; import 'package:dde_gesture_manager/widgets/dde_button.dart'; import 'package:dde_gesture_manager/widgets/login.dart'; @@ -79,11 +78,11 @@ class MarketOrMe extends StatelessWidget { ); } - Widget buildMeContent(BuildContext context) { - var accessToken = context.watch().accessToken; - if (accessToken.isNull) return LoginWidget(); - return Expanded(child: MeWidget()); - } + Widget buildMeContent(BuildContext context) => context.watchHasToken + ? Expanded( + child: MeWidget(), + ) + : LoginWidget(); Widget buildMarketContent(BuildContext context) => Expanded(child: MarketWidget()); } diff --git a/app/lib/widgets/market.dart b/app/lib/widgets/market.dart index 0a240b2..329bb48 100644 --- a/app/lib/widgets/market.dart +++ b/app/lib/widgets/market.dart @@ -2,7 +2,6 @@ import 'package:auto_size_text/auto_size_text.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:dde_gesture_manager/constants/constants.dart'; import 'package:dde_gesture_manager/http/api.dart'; -import 'package:dde_gesture_manager/models/configs.provider.dart'; import 'package:dde_gesture_manager/models/local_schemes_provider.dart'; import 'package:dde_gesture_manager/models/settings.provider.dart'; import 'package:dde_gesture_manager/utils/helper.dart'; @@ -40,7 +39,7 @@ class _MarketWidgetState extends State { @override void initState() { super.initState(); - if (context.read().accessToken.notNull) + if (context.hasToken) Api.userLikes().then((value) { if (mounted && value != null) setState(() { @@ -265,7 +264,7 @@ class _MarketWidgetState extends State { mainAxisAlignment: MainAxisAlignment.end, children: [ DButton.like( - enabled: context.watch().accessToken.notNull, + enabled: context.watchHasToken, onTap: () { bool liked = _likedSchemes.contains(currentSelectedScheme!.id!); Api.likeScheme(schemeId: currentSelectedScheme.uuid!, isLike: !liked).then((value) {