mirror of
https://gitlab.com/veilid/veilidchat.git
synced 2025-08-01 18:56:03 -04:00
checkpoint
This commit is contained in:
parent
56d65442f4
commit
751022e743
26 changed files with 482 additions and 303 deletions
|
@ -1,12 +1,14 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:async_tools/async_tools.dart';
|
||||
import 'package:protobuf/protobuf.dart';
|
||||
import 'package:veilid_support/veilid_support.dart';
|
||||
|
||||
import '../../account_manager/account_manager.dart';
|
||||
import '../../proto/proto.dart' as proto;
|
||||
import '../../tools/tools.dart';
|
||||
import 'conversation_cubit.dart';
|
||||
import '../../conversation/cubits/conversation_cubit.dart';
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Mutable state for per-account contacts
|
||||
|
@ -34,6 +36,54 @@ class ContactListCubit extends DHTShortArrayCubit<proto.Contact> {
|
|||
return dhtRecord;
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> close() async {
|
||||
await _contactProfileUpdateMap.close();
|
||||
await super.close();
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// Public Interface
|
||||
|
||||
void followContactProfileChanges(TypedKey localConversationRecordKey,
|
||||
Stream<proto.Profile?> profileStream, proto.Profile? profileState) {
|
||||
_contactProfileUpdateMap
|
||||
.follow(localConversationRecordKey, profileStream, profileState,
|
||||
(remoteProfile) async {
|
||||
if (remoteProfile == null) {
|
||||
return;
|
||||
}
|
||||
return updateContactRemoteProfile(
|
||||
localConversationRecordKey: localConversationRecordKey,
|
||||
remoteProfile: remoteProfile);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> updateContactRemoteProfile({
|
||||
required TypedKey localConversationRecordKey,
|
||||
required proto.Profile remoteProfile,
|
||||
}) async {
|
||||
// Update contact's remoteProfile
|
||||
await operateWriteEventual((writer) async {
|
||||
for (var pos = 0; pos < writer.length; pos++) {
|
||||
final c = await writer.getProtobuf(proto.Contact.fromBuffer, pos);
|
||||
if (c != null &&
|
||||
c.localConversationRecordKey.toVeilid() ==
|
||||
localConversationRecordKey) {
|
||||
if (c.remoteProfile == remoteProfile) {
|
||||
// Unchanged
|
||||
break;
|
||||
}
|
||||
final newContact = c.deepCopy()..remoteProfile = remoteProfile;
|
||||
final updated = await writer.tryWriteItemProtobuf(
|
||||
proto.Contact.fromBuffer, pos, newContact);
|
||||
if (!updated) {
|
||||
throw DHTExceptionTryAgain();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> createContact({
|
||||
required proto.Profile remoteProfile,
|
||||
required SuperIdentity remoteSuperIdentity,
|
||||
|
@ -100,4 +150,6 @@ class ContactListCubit extends DHTShortArrayCubit<proto.Contact> {
|
|||
}
|
||||
|
||||
final UnlockedAccountInfo _activeAccountInfo;
|
||||
final _contactProfileUpdateMap =
|
||||
SingleStateProcessorMap<TypedKey, proto.Profile?>();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue