campaignFingerprint function
Derive a stable campaign fingerprint from a URL's query string. A change in this fingerprint (a new campaign, not its absence) forces a new session, matching GA4's "campaign change resets the session" behaviour.
Implementation
String? campaignFingerprint(String? search) {
if (search == null || search.isEmpty) return null;
var qs = search;
final q = qs.indexOf('?');
if (q != -1) qs = qs.substring(q + 1);
final params = <String, String>{};
for (final pair in qs.split('&')) {
if (pair.isEmpty) continue;
final eq = pair.indexOf('=');
if (eq == -1) {
params[Uri.decodeQueryComponent(pair)] = '';
} else {
final k = Uri.decodeQueryComponent(pair.substring(0, eq));
final v = Uri.decodeQueryComponent(pair.substring(eq + 1));
params[k] = v;
}
}
final pairs = <String>[];
for (final p in _campaignParams) {
final v = params[p];
if (v != null && v.isNotEmpty) pairs.add('$p=$v');
}
return pairs.isEmpty ? null : pairs.join('&');
}