import {Fragment} from 'react'; import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout'; import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import {t, tct} from 'sentry/locale'; // Configuration Start export const steps = ({ dsn, }: { dsn?: string; } = {}): LayoutProps['steps'] => [ { type: StepType.INSTALL, description: (

{tct( "To use Sentry in your Ionic app, install the Sentry Capacitor SDK alongside the sibling Sentry SDK related to the Web framework you're using with Ionic. The supported siblings are: Angular [sentryAngularIvyCode:@sentry/angular-ivy], React [sentryReactCode:@sentry/react] and Vue [sentryVueCode:@sentry/vue].", { sentryAngularIvyCode: , sentryReactCode: , sentryVueCode: , } )}

), configurations: [ { language: 'bash', description: t( 'Heres an example of installing Sentry Capacitor along with Sentry Angular:' ), code: 'npm install --save @sentry/capacitor @sentry/angular', }, { language: 'bash', description: t('or'), code: 'yarn add @sentry/capacitor @sentry/angular', }, { description: (
{t('Capacitor 2 - Android')}
{t('This step is not needed if you are using Capacitor 3')}

{tct( 'Then, add the [sentryCapacitorCode:SentryCapacitor] plugin class inside the [onCreateCode:onCreate] method of your [mainActivityCode:MainActivity] file.', { sentryCapacitorCode: , onCreateCode: , mainActivityCode: , } )}

), configurations: [ { description: Java, language: 'java', code: ` import android.os.Bundle; import com.getcapacitor.BridgeActivity; import com.getcapacitor.Plugin; import io.sentry.capacitor.SentryCapacitor; import java.util.ArrayList; public class MainActivity extends BridgeActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Initializes the Bridge this.init(savedInstanceState, new ArrayList>() {{ add(SentryCapacitor.class); }}); } } `, }, { description: Kotlin, language: 'kotlin', code: ` import android.os.Bundle import com.getcapacitor.BridgeActivity import com.getcapacitor.Plugin import io.sentry.capacitor.SentryCapacitor class MainActivity : BridgeActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Initializes the Bridge this.init( savedInstanceState, listOf>(SentryCapacitor::class.java) ) } } `, }, ], }, ], additionalInfo: (

{tct( 'The same installation process applies to the other siblings, all you need to do is to replace [code:@sentry/angular-ivy] by the desired sibling.', {code: } )}

), }, { type: StepType.CONFIGURE, description: (

{tct('You must initialize the Sentry SDK as early as you can:', {code: })}

), configurations: [ { language: 'javascript', code: ` import * as Sentry from "@sentry/capacitor"; // The example is using Angular 12+. Import '@sentry/angular' for Angular 10 and 11. Import '@sentry/vue' or '@sentry/react' when using a Sibling different than Angular. import * as SentrySibling from "@sentry/angular-ivy"; Sentry.init( { dsn: "${dsn}", // To set your release and dist versions release: "my-project-name@" + process.env.npm_package_version, dist: "1", // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. // We recommend adjusting this value in production. tracesSampleRate: 1.0, integrations: [ new SentrySibling.BrowserTracing({ // Set "tracePropagationTargets" to control for which URLs distributed tracing should be enabled tracePropagationTargets: [ "localhost", /^https:\/\/yourserver\.io\/api/, ], routingInstrumentation: SentrySibling.routingInstrumentation, }), ], }, // Forward the init method to the sibling Framework. SentrySibling.init ); `, }, { language: 'javascript', description: (

{tct( "Additionally for Angular, you will also need to configure your root [code:app.module.ts] (same code doesn't apply to other siblings):", { code: , } )}

), code: ` @NgModule({ providers: [ { provide: ErrorHandler, // Attach the Sentry ErrorHandler useValue: SentrySibling.createErrorHandler(), }, { provide: SentrySibling.TraceService, deps: [Router], }, { provide: APP_INITIALIZER, useFactory: () => () => {}, deps: [SentrySibling.TraceService], multi: true, }, ], }) `, }, ], }, { type: StepType.VERIFY, description: t( 'This snippet includes an intentional error, so you can test that everything is working as soon as you set it up:' ), configurations: [ { language: 'javascript', code: ` import * as Sentry from "@sentry/capacitor"; Sentry.captureException("Test Captured Exception"); `, }, { language: 'javascript', description: t('You can also throw an error anywhere in your application:'), code: ` // Must be thrown after Sentry.init is called to be captured. throw new Error("Test Thrown Error"); `, }, { language: 'javascript', description: t('Or trigger a native crash:'), code: ` import * as Sentry from "@sentry/capacitor"; Sentry.nativeCrash(); `, }, ], }, ]; // Configuration End export function GettingStartedWithIonic({dsn, ...props}: ModuleProps) { return ; } export default GettingStartedWithIonic;