submitReport static method

Future<BugReport> submitReport(
  1. BugReportRequest submitReportRequest, {
  2. LogBuffer? logBuffer,
})

Implementation

static Future<BugReport> submitReport(
  BugReportRequest submitReportRequest, {
  LogBuffer? logBuffer,
}) async {
  final uri = Uri.parse('$_apiUrl/bug_reports');
  final request =
      http.MultipartRequest('POST', uri)
        ..fields['api_token'] = submitReportRequest.apiToken
        ..fields['app_install[id]'] =
            submitReportRequest.appInstall.id.toString()
        ..fields['bug_report[description]'] =
            submitReportRequest.report.description ?? 'no description'
        ..fields['bug_report[steps_to_reproduce]'] =
            submitReportRequest.report.stepsToReproduce ??
            'no steps to reproduce'
        ..fields['bug_report[user_identifier]'] =
            submitReportRequest.report.userIdentifier ?? 'no user identifier'
        ..fields.addAll(await (_deviceStatusProvider ?? Api.deviceStatus)());

  if (submitReportRequest.report.attachments?.isNotEmpty ?? false) {
    await Future.wait(
      submitReportRequest.report.attachments!.map((attachment) async {
        if (attachment.path != null) {
          request.files.add(
            await http.MultipartFile.fromPath(
              'bug_report[attachments][]',
              attachment.path!,
              filename: attachment.name,
            ),
          );
        }
      }),
    );
  }

  // Attach captured logs as a text file, if available.
  if (logBuffer != null && !logBuffer.isEmpty) {
    try {
      final logContent = logBuffer.export();
      request.files.add(
        http.MultipartFile.fromString(
          'bug_report[attachments][]',
          logContent,
          filename: 'console-logs.txt',
        ),
      );
    } catch (e) {
      debugPrint('Critic: failed to attach log capture: $e');
    }
  }

  final streamedResponse = await _client.send(request);
  print('Response: ${streamedResponse.statusCode}');
  final body = await streamedResponse.stream.bytesToString();
  print(body);

  if (streamedResponse.statusCode == 200 ||
      streamedResponse.statusCode == 201) {
    return BugReport.fromJson(json.decode(body));
  } else {
    throw Exception('Response code: ${streamedResponse.statusCode}, $body');
  }
}