reportSurveyCompleted method

void reportSurveyCompleted(
  1. Map<String, dynamic> response, [
  2. Map<String, SurveyAnswer> answers = const {}
])

Fired once when the survey finishes (idempotent per showing). Beyond the Completed analytics event, answers (when supplied) are POSTed to the backend's recordSubmission endpoint via SubmissionReporter.

Implementation

void reportSurveyCompleted(
  Map<String, dynamic> response, [
  Map<String, SurveyAnswer> answers = const {},
]) {
  final state = _surveyOrchestrator.state;
  if (state == null || _completedSurveyToken == state.token) return;
  _completedSurveyToken = state.token;
  _recordCompleted(state.campaign.campaignKey);
  // Completing the survey is its CEP engagement signal — the coarse channel
  // has no "completed", so a completion maps to ExperienceClicked.
  _events.toCep(const ExperienceClicked(), state.payload);
  _events.toDigia(
    SurveyCompleted(
      itemTotal: _surveyItemTotal(state.config),
      answeredCount: answers.isNotEmpty ? answers.length : response.length,
      timeToCompleteMs:
          DateTime.now().millisecondsSinceEpoch - state.startedAtMs,
      response: response,
    ),
    state.payload,
  );

  if (answers.isNotEmpty) {
    _logIfVerbose(
      'survey submission started: campaignKey=${state.campaign.campaignKey}, '
      'campaignId=${state.campaign.id}, answers=${answers.length}',
    );
    _submissionReporter?.reportSurveyCompleted(
      state.campaign,
      answers,
      state.startedAtMs,
    );
  }
}