diff --git a/lib/controllers/account_data_controller.dart b/lib/controllers/account_data_controller.dart new file mode 100644 index 0000000..125d7cf --- /dev/null +++ b/lib/controllers/account_data_controller.dart @@ -0,0 +1,16 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/models/account_data.dart"; + +class AccountDataController extends Notifier> { + @override + IMap build() => const IMap.empty(); + + void update(IMap newData) => + state = IMap({...state.unlock, ...newData.unlock}); + + static final provider = + NotifierProvider>( + AccountDataController.new, + ); +} diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index 6639de6..780439d 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -5,6 +5,7 @@ import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:ffi/ffi.dart"; import "package:flutter/foundation.dart"; +import "package:nexus/controllers/account_data_controller.dart"; import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/init_complete_controller.dart"; import "package:nexus/controllers/rooms_controller.dart"; @@ -66,16 +67,26 @@ class ClientController extends AsyncNotifier { case "sync_complete": final syncData = SyncData.fromJson(decodedMuksEvent); final roomProvider = RoomsController.provider; + final accountDataProvider = AccountDataController.provider; + + if (syncData.clearState) { + ref.invalidate(roomProvider); + ref.invalidate(accountDataProvider); + } - if (syncData.clearState) ref.invalidate(roomProvider); ref .watch(roomProvider.notifier) .update(syncData.rooms, syncData.leftRooms); + ref + .watch(accountDataProvider.notifier) + .update(syncData.accountData); + if (syncData.topLevelSpaces != null) { ref .watch(TopLevelSpacesController.provider.notifier) .set(syncData.topLevelSpaces!); } + if (syncData.spaceEdges != null) { ref .watch(SpaceEdgesController.provider.notifier) diff --git a/lib/models/account_data.dart b/lib/models/account_data.dart new file mode 100644 index 0000000..a325ffe --- /dev/null +++ b/lib/models/account_data.dart @@ -0,0 +1,16 @@ +import "package:freezed_annotation/freezed_annotation.dart"; +part "account_data.freezed.dart"; +part "account_data.g.dart"; + +@freezed +abstract class AccountData with _$AccountData { + const factory AccountData({ + required String userId, + required String? roomId, + required String type, + required dynamic content, + }) = _AccountData; + + factory AccountData.fromJson(Map json) => + _$AccountDataFromJson(json); +} diff --git a/lib/models/sync_data.dart b/lib/models/sync_data.dart index 0fc18ac..0f98bb2 100644 --- a/lib/models/sync_data.dart +++ b/lib/models/sync_data.dart @@ -1,5 +1,6 @@ import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:freezed_annotation/freezed_annotation.dart"; +import "package:nexus/models/account_data.dart"; import "package:nexus/models/room.dart"; import "package:nexus/models/space_edge.dart"; part "sync_data.freezed.dart"; @@ -9,7 +10,7 @@ part "sync_data.g.dart"; abstract class SyncData with _$SyncData { const factory SyncData({ @Default(false) bool clearState, - // required IMap accountData, + @Default(IMap.empty()) IMap accountData, @Default(IMap.empty()) IMap rooms, @Default(ISet.empty()) ISet leftRooms, // required IList invitedRooms,