yumi-flutter/lib/shared/tools/sc_cp_gift_relation_utils.dart
2026-05-22 14:19:53 +08:00

82 lines
2.1 KiB
Dart

import 'package:yumi/shared/business_logic/models/res/gift_res.dart';
import 'package:yumi/shared/data_sources/models/enum/sc_gift_type.dart';
import 'package:yumi/shared/tools/sc_cp_relation_notice_utils.dart';
bool scIsCpGiftTab(String? tabType) =>
tabType?.trim().toUpperCase() == SCGiftType.CP.name;
bool scIsCpGift(SocialChatGiftRes? gift) => scIsCpGiftTab(gift?.giftTab);
String scCpRelationTypeForGift(SocialChatGiftRes gift) {
final explicit = _normalizeExplicitGiftRelationType(gift.relationType);
if (explicit != null) {
return explicit;
}
for (final value in <String?>[
gift.type,
gift.giftCode,
gift.giftName,
gift.special,
gift.standardId,
]) {
final inferred = _inferCpRelationTypeFromGiftText(value);
if (inferred != null) {
return inferred;
}
}
return "CP";
}
String? _normalizeExplicitGiftRelationType(String? relationType) {
final raw = relationType?.trim();
if (raw == null || raw.isEmpty) {
return null;
}
final normalized = scNormalizeCpRelationType(raw);
if (normalized != "CP" || _isCpRelationText(raw)) {
return normalized;
}
return _inferCpRelationTypeFromGiftText(raw) ?? normalized;
}
bool _isCpRelationText(String value) {
final upper = value.trim().toUpperCase();
return upper == "CP" || upper == "COUPLE";
}
String? _inferCpRelationTypeFromGiftText(String? value) {
final upper = value?.trim().toUpperCase();
if (upper == null || upper.isEmpty) {
return null;
}
if (_hasRelationToken(upper, const ["SIS", "SISTER", "SISTERS"])) {
return "SISTERS";
}
if (_hasRelationToken(upper, const [
"BRO",
"BROS",
"BROTHER",
"BROTHERS",
"SWORN_BRO",
"SWORN_BROS",
"SWORN_BROTHER",
"SWORN_BROTHERS",
])) {
return "BROTHER";
}
if (_hasRelationToken(upper, const ["CP", "COUPLE"])) {
return "CP";
}
return null;
}
bool _hasRelationToken(String upperText, List<String> tokens) {
for (final token in tokens) {
final escaped = RegExp.escape(token);
if (RegExp('(^|[^A-Z0-9])$escaped([^A-Z0-9]|\$)').hasMatch(upperText)) {
return true;
}
}
return false;
}