# Bug Reporting Callbacks

You can react to bug reporting lifecycle events using Kotlin `Flow`s and (for report submission) `LuciqKmp.onReportSubmit`.

### Before the UI is shown

`BugReportingKmp.onInvoke` emits when the bug reporting UI is about to be shown. Use it to prepare state or analytics:

{% code title="Kotlin" %}

```kotlin
scope.launch {
    BugReportingKmp.onInvoke.collect {
        // e.g. pause game, track analytics
    }
}
```

{% endcode %}

### When the UI is dismissed

`BugReportingKmp.onDismiss` emits when the user closes the bug reporting UI. You get how it was dismissed and the report type:

{% code title="Kotlin" %}

```kotlin
scope.launch {
    BugReportingKmp.onDismiss.collect { (dismissType, reportType) ->
        when (dismissType) {
            DismissType.Submit -> { /* user submitted */ }
            DismissType.Cancel -> { /* user cancelled */ }
            DismissType.AddAttachment -> { /* user is adding attachment */ }
        }
    }
}
```

{% endcode %}

### Prompt option selected (iOS)

On iOS, `BugReportingKmp.onPromptOptionSelected` emits when the user selects an option from the prompt menu (e.g. Report a bug, Feedback, Question):

{% code title="Kotlin" %}

```kotlin
scope.launch {
    BugReportingKmp.onPromptOptionSelected.collect { reportType ->
        // reportType is the chosen ReportType
    }
}
```

{% endcode %}

This is a no-op on Android.

### Before report is submitted

To modify or observe reports before they are sent, use `LuciqKmp.onReportSubmit`. Each emitted `Report` contains: `tags`, `userAttributes`, `fileAttachments`, `consoleLogs`, and `luciqLogs` (logs sent via `LuciqKmp.logVerbose` / `logDebug` / etc.):

{% code title="Kotlin" %}

```kotlin
scope.launch {
    LuciqKmp.onReportSubmit.collect { report ->
        // report.tags, report.userAttributes, report.fileAttachments,
        // report.consoleLogs, report.luciqLogs
    }
}
```

{% endcode %}
