chatapp3-flutter/lib/shared/tools/sc_room_profile_cache.dart
2026-04-14 17:21:05 +08:00

147 lines
4.4 KiB
Dart

import 'dart:convert';
import 'package:yumi/shared/business_logic/models/res/follow_room_res.dart'
as follow;
import 'package:yumi/shared/business_logic/models/res/join_room_res.dart'
as join;
import 'package:yumi/shared/business_logic/models/res/my_room_res.dart';
import 'package:yumi/shared/business_logic/models/res/room_res.dart';
import 'package:yumi/shared/data_sources/sources/local/data_persistence.dart';
import 'package:yumi/shared/data_sources/sources/local/user_manager.dart';
class SCRoomProfileCache {
static const String _prefix = "room_profile_override";
static String _key(String roomId) {
final userId =
AccountStorage().getCurrentUser()?.userProfile?.id ?? "guest";
return "${_prefix}_${userId}_$roomId";
}
static String? preferNonEmpty(String? primary, String? fallback) {
if ((primary ?? "").trim().isNotEmpty) {
return primary;
}
if ((fallback ?? "").trim().isNotEmpty) {
return fallback;
}
return primary ?? fallback;
}
static String? preferCachedValue(String? cached, String? remote) {
if ((cached ?? "").trim().isNotEmpty) {
return cached;
}
return preferNonEmpty(remote, cached);
}
static Map<String, String> getRoomProfile(String roomId) {
if (roomId.trim().isEmpty) {
return {};
}
final raw = DataPersistence.getString(_key(roomId));
if (raw.isEmpty) {
return {};
}
try {
final data = jsonDecode(raw);
if (data is Map) {
return data.map(
(key, value) => MapEntry(key.toString(), value?.toString() ?? ""),
);
}
} catch (_) {}
return {};
}
static Future<void> saveRoomProfile({
required String roomId,
String? roomCover,
String? roomName,
String? roomDesc,
}) async {
if (roomId.trim().isEmpty) {
return;
}
final current = getRoomProfile(roomId);
final payload = <String, String>{
"roomCover": preferNonEmpty(roomCover, current["roomCover"]) ?? "",
"roomName": preferNonEmpty(roomName, current["roomName"]) ?? "",
"roomDesc": preferNonEmpty(roomDesc, current["roomDesc"]) ?? "",
};
await DataPersistence.setString(_key(roomId), jsonEncode(payload));
}
static SocialChatRoomRes applyToSocialChatRoomRes(SocialChatRoomRes room) {
final cache = getRoomProfile(room.id ?? "");
if (cache.isEmpty) {
return room;
}
return room.copyWith(
roomCover: preferCachedValue(cache["roomCover"], room.roomCover),
roomName: preferCachedValue(cache["roomName"], room.roomName),
roomDesc: preferCachedValue(cache["roomDesc"], room.roomDesc),
);
}
static follow.FollowRoomRes applyToFollowRoomRes(follow.FollowRoomRes room) {
final roomProfile = room.roomProfile;
if (roomProfile == null) {
return room;
}
final cache = getRoomProfile(roomProfile.id ?? "");
if (cache.isEmpty) {
return room;
}
return room.copyWith(
roomProfile: roomProfile.copyWith(
roomCover: preferCachedValue(cache["roomCover"], roomProfile.roomCover),
roomName: preferCachedValue(cache["roomName"], roomProfile.roomName),
roomDesc: preferCachedValue(cache["roomDesc"], roomProfile.roomDesc),
),
);
}
static MyRoomRes applyToMyRoomRes(MyRoomRes room) {
final cache = getRoomProfile(room.id ?? "");
if (cache.isEmpty) {
return room;
}
return room.copyWith(
roomCover: preferCachedValue(cache["roomCover"], room.roomCover),
roomName: preferCachedValue(cache["roomName"], room.roomName),
roomDesc: preferCachedValue(cache["roomDesc"], room.roomDesc),
);
}
static join.JoinRoomRes applyToJoinRoomRes(join.JoinRoomRes room) {
final roomProfile = room.roomProfile;
final basicRoomProfile = roomProfile?.roomProfile;
if (roomProfile == null || basicRoomProfile == null) {
return room;
}
final cache = getRoomProfile(basicRoomProfile.id ?? "");
if (cache.isEmpty) {
return room;
}
return room.copyWith(
roomProfile: roomProfile.copyWith(
roomProfile: basicRoomProfile.copyWith(
roomCover: preferCachedValue(
cache["roomCover"],
basicRoomProfile.roomCover,
),
roomName: preferCachedValue(
cache["roomName"],
basicRoomProfile.roomName,
),
roomDesc: preferCachedValue(
cache["roomDesc"],
basicRoomProfile.roomDesc,
),
),
),
);
}
}