Added sentry

This commit is contained in:
Juan Gilsanz Polo
2024-02-24 02:06:11 +01:00
parent ac340c108b
commit da995b8961
13 changed files with 80 additions and 14 deletions

2
.env.sample Normal file
View File

@@ -0,0 +1,2 @@
SENTRY_DSN=
ENABLE_SENTRY=false

3
.gitignore vendored
View File

@@ -41,3 +41,6 @@ app.*.map.json
/android/app/debug /android/app/debug
/android/app/profile /android/app/profile
/android/app/release /android/app/release
# Env file
.env

View File

@@ -1,12 +1,15 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:linkdy/constants/global_keys.dart'; import 'package:linkdy/constants/global_keys.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:linkdy/providers/app_status_provider.dart'; import 'package:linkdy/providers/app_status_provider.dart';
@@ -26,21 +29,36 @@ void main() async {
HttpOverrides.global = MyHttpOverrides(); HttpOverrides.global = MyHttpOverrides();
await dotenv.load(fileName: '.env');
final sharedPreferences = await SharedPreferences.getInstance(); final sharedPreferences = await SharedPreferences.getInstance();
final appInfo = await PackageInfo.fromPlatform(); final appInfo = await PackageInfo.fromPlatform();
runApp( void startApp() => runApp(
TranslationProvider( TranslationProvider(
child: ProviderScope( child: ProviderScope(
overrides: [ overrides: [
sharedPreferencesProvider.overrideWithValue(sharedPreferences), sharedPreferencesProvider.overrideWithValue(sharedPreferences),
appInfoProvider.overrideWithValue(appInfo), appInfoProvider.overrideWithValue(appInfo),
], ],
child: const MyApp(), child: const MyApp(),
), ),
), ),
); );
if ((kReleaseMode && (dotenv.env['SENTRY_DSN'] != null && dotenv.env['SENTRY_DSN'] != "")) ||
(dotenv.env['ENABLE_SENTRY'] == "true" && (dotenv.env['SENTRY_DSN'] != null && dotenv.env['SENTRY_DSN'] != ""))) {
SentryFlutter.init(
(options) {
options.dsn = dotenv.env['SENTRY_DSN'];
options.sendDefaultPii = false;
},
appRunner: () => startApp(),
);
} else {
startApp();
}
} }
class MyApp extends ConsumerWidget { class MyApp extends ConsumerWidget {

View File

@@ -12,7 +12,6 @@ import 'package:linkdy/utils/open_url.dart';
import 'package:linkdy/constants/strings.dart'; import 'package:linkdy/constants/strings.dart';
import 'package:linkdy/constants/urls.dart'; import 'package:linkdy/constants/urls.dart';
import 'package:linkdy/i18n/strings.g.dart'; import 'package:linkdy/i18n/strings.g.dart';
import 'package:linkdy/providers/api_client_provider.dart';
class Settings extends ConsumerWidget { class Settings extends ConsumerWidget {
const Settings({Key? key}) : super(key: key); const Settings({Key? key}) : super(key: key);

View File

@@ -1,4 +1,5 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:linkdy/constants/enums.dart'; import 'package:linkdy/constants/enums.dart';
import 'package:linkdy/models/api_response.dart'; import 'package:linkdy/models/api_response.dart';
@@ -46,6 +47,7 @@ class ApiClientService {
content: BookmarksResponse.fromJson(response.data), content: BookmarksResponse.fromJson(response.data),
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return const ApiResponse(successful: false); return const ApiResponse(successful: false);
} }
} }
@@ -63,6 +65,7 @@ class ApiClientService {
content: CheckBookmark.fromJson(response.data), content: CheckBookmark.fromJson(response.data),
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return const ApiResponse(successful: false); return const ApiResponse(successful: false);
} }
} }
@@ -78,6 +81,7 @@ class ApiClientService {
content: Bookmark.fromJson(response.data), content: Bookmark.fromJson(response.data),
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return const ApiResponse(successful: false); return const ApiResponse(successful: false);
} }
} }
@@ -97,6 +101,7 @@ class ApiClientService {
content: TagsResponse.fromJson(response.data), content: TagsResponse.fromJson(response.data),
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
Sentry.captureException(e, stackTrace: stackTrace);
return const ApiResponse(successful: false); return const ApiResponse(successful: false);
} }
} }

View File

@@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as flutter_custom_tabs; import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as flutter_custom_tabs;
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:url_launcher/url_launcher.dart' as url_launcher; import 'package:url_launcher/url_launcher.dart' as url_launcher;
void openUrl(String url) async { void openUrl(String url) async {
@@ -19,13 +20,13 @@ void openUrl(String url) async {
), ),
); );
} catch (e, stackTrace) { } catch (e, stackTrace) {
// Sentry.captureException(e, stackTrace: stackTrace); Sentry.captureException(e, stackTrace: stackTrace);
} }
} else { } else {
try { try {
url_launcher.launchUrl(Uri.parse(url)); url_launcher.launchUrl(Uri.parse(url));
} catch (e, stackTrace) { } catch (e, stackTrace) {
// Sentry.captureException(e, stackTrace: stackTrace); Sentry.captureException(e, stackTrace: stackTrace);
} }
} }
} }

View File

@@ -7,12 +7,16 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <dynamic_color/dynamic_color_plugin.h> #include <dynamic_color/dynamic_color_plugin.h>
#include <sentry_flutter/sentry_flutter_plugin.h>
#include <url_launcher_linux/url_launcher_plugin.h> #include <url_launcher_linux/url_launcher_plugin.h>
void fl_register_plugins(FlPluginRegistry* registry) { void fl_register_plugins(FlPluginRegistry* registry) {
g_autoptr(FlPluginRegistrar) dynamic_color_registrar = g_autoptr(FlPluginRegistrar) dynamic_color_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin");
dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar);
g_autoptr(FlPluginRegistrar) sentry_flutter_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "SentryFlutterPlugin");
sentry_flutter_plugin_register_with_registrar(sentry_flutter_registrar);
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);

View File

@@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color dynamic_color
sentry_flutter
url_launcher_linux url_launcher_linux
) )

View File

@@ -9,6 +9,7 @@ import dynamic_color
import flutter_inappwebview_macos import flutter_inappwebview_macos
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import sentry_flutter
import share_plus import share_plus
import shared_preferences_foundation import shared_preferences_foundation
import url_launcher_macos import url_launcher_macos
@@ -18,6 +19,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SentryFlutterPlugin.register(with: registry.registrar(forPlugin: "SentryFlutterPlugin"))
SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))

View File

@@ -382,6 +382,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
flutter_dotenv:
dependency: "direct main"
description:
name: flutter_dotenv
sha256: "9357883bdd153ab78cbf9ffa07656e336b8bbb2b5a3ca596b0b27e119f7c7d77"
url: "https://pub.dev"
source: hosted
version: "5.1.0"
flutter_inappwebview: flutter_inappwebview:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -869,6 +877,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
sentry:
dependency: transitive
description:
name: sentry
sha256: d2ee9c850d876d285f22e2e662f400ec2438df9939fe4acd5d780df9841794ce
url: "https://pub.dev"
source: hosted
version: "7.16.1"
sentry_flutter:
dependency: "direct main"
description:
name: sentry_flutter
sha256: "5b428c189c825f16fb14e9166529043f06b965d5b59bfc3a1415e39c082398c0"
url: "https://pub.dev"
source: hosted
version: "7.16.1"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@@ -52,6 +52,8 @@ dependencies:
package_info_plus: ^5.0.1 package_info_plus: ^5.0.1
expandable: ^5.0.1 expandable: ^5.0.1
easy_autocomplete: ^1.6.0 easy_autocomplete: ^1.6.0
sentry_flutter: ^7.16.1
flutter_dotenv: ^5.1.0
dev_dependencies: dev_dependencies:
build_runner: ^2.4.8 build_runner: ^2.4.8
@@ -97,6 +99,7 @@ flutter:
- assets/icon/icon1024.png - assets/icon/icon1024.png
- assets/icon/icon-splash.png - assets/icon/icon-splash.png
- assets/icon/icon1024-background.png - assets/icon/icon1024-background.png
- .env
# An image asset can refer to one or more resolution-specific "variants", see # An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware # https://flutter.dev/assets-and-images/#resolution-aware

View File

@@ -7,12 +7,15 @@
#include "generated_plugin_registrant.h" #include "generated_plugin_registrant.h"
#include <dynamic_color/dynamic_color_plugin_c_api.h> #include <dynamic_color/dynamic_color_plugin_c_api.h>
#include <sentry_flutter/sentry_flutter_plugin.h>
#include <share_plus/share_plus_windows_plugin_c_api.h> #include <share_plus/share_plus_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h> #include <url_launcher_windows/url_launcher_windows.h>
void RegisterPlugins(flutter::PluginRegistry* registry) { void RegisterPlugins(flutter::PluginRegistry* registry) {
DynamicColorPluginCApiRegisterWithRegistrar( DynamicColorPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
SentryFlutterPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SentryFlutterPlugin"));
SharePlusWindowsPluginCApiRegisterWithRegistrar( SharePlusWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar( UrlLauncherWindowsRegisterWithRegistrar(

View File

@@ -4,6 +4,7 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
dynamic_color dynamic_color
sentry_flutter
share_plus share_plus
url_launcher_windows url_launcher_windows
) )