reportSurveyCompleted method
void
reportSurveyCompleted(
- Map<
String, dynamic> response, [ - 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,
);
}
}