diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs index 5da3d4f5..f18f5fb0 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ICollectionExt.cs @@ -68,6 +68,29 @@ public static List TrySaveToDtoCollection(this List TrySaveToDtoCollection2(this List source) + where TSource : ISavableTo2 + { + if (source == null) + { + return null; + } + + var dtos = new List(source.Count); + + foreach (var item in source) + { + if (item == null) + { + continue; + } + dtos.Add(item.SaveToDto()); + } + + return dtos; + } + [Pure] public static List TryLoadFromDtoCollection(this List _, List dtos) where TSource : ILoadableFrom, new() @@ -86,5 +109,62 @@ public static List TryLoadFromDtoCollection(this List TryLoadFromDtoCollection2(this List _, List dtos) + where TSource : ILoadableFrom2, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } + + [Pure] + public static List TryLoadFromDtoCollection3(this List _, List dtos) + where TSource : ILoadableFrom3, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } + + [Pure] + public static List TryLoadFromDtoCollection4(this List _, List dtos) + where TSource : ILoadableFrom4, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto)); + } + + return items; + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs index 35d24e1d..177e3eab 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/IDictionaryExt.cs @@ -54,5 +54,29 @@ public static Dictionary TryLoadFromDtoDictionary TryLoadFromDtoDictionary4( + this Dictionary _, Dictionary dtos) + where TSource : ILoadableFrom4, new() + { + if (dtos == null) + { + return null; + } + + var dict = new Dictionary(); + + foreach (var sourceKeyValue in dtos) + { + if (sourceKeyValue.Value == null) + { + continue; + } + + dict.Add(sourceKeyValue.Key, new TSource().LoadFromDto(sourceKeyValue.Value)); + } + + return dict; + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs index 0e21fd35..b95f1089 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ILoadableFromExt.cs @@ -49,5 +49,119 @@ public static TDomain ToDomain(this TDto dto) return new TDomain().LoadFromDto(dto); } + + public static TDomain TryLoadFromDto(this ILoadableFrom2 loadable, TDto dto) + where TDomain : ILoadableFrom2, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom2 loadable, TDto dto) + where TDomain : ILoadableFrom2, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain2(this TDto dto) + where TDomain : class, ILoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } + + public static TDomain TryLoadFromDto(this ILoadableFrom3 loadable, TDto dto) + where TDomain : ILoadableFrom3, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom3 loadable, TDto dto) + where TDomain : ILoadableFrom3, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain3(this TDto dto) + where TDomain : class, ILoadableFrom3, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } + + public static TDomain TryLoadFromDto(this ILoadableFrom4 loadable, TDto dto) + where TDomain : ILoadableFrom4, new() + { + if (dto == null) + { + return default; + } + + return loadable != null ? loadable.LoadFromDto(dto) : new TDomain().LoadFromDto(dto); + } + + public static TDomain UpdateFromDto(this ILoadableFrom4 loadable, TDto dto) + where TDomain : ILoadableFrom4, new() + { + if (dto == null) + { + return default; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto); + } + + public static TDomain ToDomain4(this TDto dto) + where TDomain : class, ILoadableFrom4, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto); + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs b/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs index 520bf417..12fa43f2 100644 --- a/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs +++ b/Assets/Plugins/StreamChat/Core/Helpers/ISavableToExt.cs @@ -9,5 +9,11 @@ internal static class ISavableToExt { public static TDto TrySaveToDto(this ISavableTo source) => source != default ? source.SaveToDto() : default; + + public static TDto TrySaveToDto(this ISavableTo2 source) + => source != default ? source.SaveToDto() : default; + + public static TDto TrySaveToDto(this ISavableTo3 source) + => source != default ? source.SaveToDto() : default; } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs index e4a76728..943cb37c 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/API/ChannelApi.cs @@ -27,7 +27,7 @@ public async Task GetOrCreateChannelAsync(string channelType, ChannelGetOrCreateRequest getOrCreateRequest) { var dto = await _internalChannelApi.GetOrCreateChannelAsync(channelType, getOrCreateRequest.TrySaveToDto()); - return dto.ToDomain(); + return dto.ToDomain2(); } public async Task GetOrCreateChannelAsync(string channelType, string channelId, @@ -35,7 +35,7 @@ public async Task GetOrCreateChannelAsync(string channelType, stri { var dto = await _internalChannelApi.GetOrCreateChannelAsync(channelType, channelId, getOrCreateRequest.TrySaveToDto()); - return dto.ToDomain(); + return dto.ToDomain2(); } public async Task UpdateChannelAsync(string channelType, string channelId, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs index 6cf6633b..95ee7892 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/ILoadableFrom.cs @@ -10,4 +10,22 @@ internal interface ILoadableFrom { TDomain LoadFromDto(TDto dto); } + + internal interface ILoadableFrom2 + where TDomain : ILoadableFrom2 + { + TDomain LoadFromDto(TDto dto); + } + + internal interface ILoadableFrom3 + where TDomain : ILoadableFrom3 + { + TDomain LoadFromDto(TDto dto); + } + + internal interface ILoadableFrom4 + where TDomain : ILoadableFrom4 + { + TDomain LoadFromDto(TDto dto); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs index 6c56066a..c5b6b4ff 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/ISavableTo.cs @@ -8,4 +8,23 @@ internal interface ISavableTo { TDto SaveToDto(); } + + /// + /// Secondary DTO save target. Identical to but declared as a separate interface + /// to work around an IL2CPP vtable builder bug (Unity 6000.0.x) that crashes when a single type implements + /// multiple closed versions of the same generic interface. + /// + internal interface ISavableTo2 + { + TDto SaveToDto(); + } + + /// + /// Tertiary DTO save target. Same workaround as for types that need + /// three distinct DTO conversions (e.g. ). + /// + internal interface ISavableTo3 + { + TDto SaveToDto(); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs index 2a917b6a..a1f8a559 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelMember.cs @@ -6,7 +6,7 @@ namespace StreamChat.Core.LowLevelClient.Models { public class ChannelMember : ModelBase, ILoadableFrom, - ILoadableFrom, ISavableTo + ILoadableFrom2, ISavableTo { /// /// Expiration date of the ban @@ -91,7 +91,7 @@ ChannelMember ILoadableFrom.LoadFromDto return this; } - ChannelMember ILoadableFrom.LoadFromDto( + ChannelMember ILoadableFrom2.LoadFromDto( ChannelMemberResponseInternalDTO dto) { BanExpires = dto.BanExpires; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs index 543290d5..46df7848 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/ChannelState.cs @@ -8,7 +8,7 @@ namespace StreamChat.Core.LowLevelClient.Models { public class ChannelState : ModelBase, ILoadableFrom, - ILoadableFrom + ILoadableFrom2 { [Obsolete("This event is deprecated and will be removed in a future major release.")] public event Action NewMessageAdded; @@ -81,30 +81,30 @@ ChannelState ILoadableFrom. HideMessagesBefore = dto.HideMessagesBefore; Members = Members.TryLoadFromDtoCollection(dto.Members); Membership = Membership.TryLoadFromDto(dto.Membership); - Messages = Messages.TryLoadFromDtoCollection(dto.Messages); + Messages = Messages.TryLoadFromDtoCollection3(dto.Messages); PendingMessages = PendingMessages.TryLoadFromDtoCollection(dto.PendingMessages); - PinnedMessages = PinnedMessages.TryLoadFromDtoCollection(dto.PinnedMessages); + PinnedMessages = PinnedMessages.TryLoadFromDtoCollection3(dto.PinnedMessages); Read = Read.TryLoadFromDtoCollection(dto.Read); WatcherCount = dto.WatcherCount; - Watchers = Watchers.TryLoadFromDtoCollection(dto.Watchers); + Watchers = Watchers.TryLoadFromDtoCollection2(dto.Watchers); AdditionalProperties = dto.AdditionalProperties; return this; } - ChannelState ILoadableFrom.LoadFromDto(ChannelStateResponseInternalDTO dto) + ChannelState ILoadableFrom2.LoadFromDto(ChannelStateResponseInternalDTO dto) { Channel = Channel.TryLoadFromDto(dto.Channel); Hidden = dto.Hidden; HideMessagesBefore = dto.HideMessagesBefore; Members = Members.TryLoadFromDtoCollection(dto.Members); Membership = Membership.TryLoadFromDto(dto.Membership); - Messages = Messages.TryLoadFromDtoCollection(dto.Messages); + Messages = Messages.TryLoadFromDtoCollection3(dto.Messages); PendingMessages = PendingMessages.TryLoadFromDtoCollection(dto.PendingMessages); - PinnedMessages = PinnedMessages.TryLoadFromDtoCollection(dto.PinnedMessages); + PinnedMessages = PinnedMessages.TryLoadFromDtoCollection3(dto.PinnedMessages); Read = Read.TryLoadFromDtoCollection(dto.Read); WatcherCount = dto.WatcherCount; - Watchers = Watchers.TryLoadFromDtoCollection(dto.Watchers); + Watchers = Watchers.TryLoadFromDtoCollection2(dto.Watchers); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs index cdde36cc..0b46bbe2 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Message.cs @@ -7,8 +7,8 @@ namespace StreamChat.Core.LowLevelClient.Models { public class Message : ModelBase, ILoadableFrom, - ILoadableFrom, - ILoadableFrom + ILoadableFrom2, + ILoadableFrom3 { /// /// Array of message attachments @@ -213,7 +213,7 @@ Message ILoadableFrom.LoadFromDto(MessageInternalDT return this; } - Message ILoadableFrom.LoadFromDto(SearchResultMessageInternalDTO dto) + Message ILoadableFrom2.LoadFromDto(SearchResultMessageInternalDTO dto) { Attachments = Attachments.TryLoadFromDtoCollection(dto.Attachments); BeforeMessageSendFailed = dto.BeforeMessageSendFailed; @@ -253,7 +253,7 @@ Message ILoadableFrom.LoadFromDto(Searc return this; } - Message ILoadableFrom.LoadFromDto(MessageResponseInternalDTO dto) + Message ILoadableFrom3.LoadFromDto(MessageResponseInternalDTO dto) { Attachments = Attachments.TryLoadFromDtoCollection(dto.Attachments); BeforeMessageSendFailed = dto.BeforeMessageSendFailed; @@ -266,10 +266,10 @@ Message ILoadableFrom.LoadFromDto(MessageRe I18n = dto.I18n; Id = dto.Id; ImageLabels = dto.ImageLabels; - LatestReactions = LatestReactions.TryLoadFromDtoCollection(dto.LatestReactions); - MentionedUsers = MentionedUsers.TryLoadFromDtoCollection(dto.MentionedUsers); + LatestReactions = LatestReactions.TryLoadFromDtoCollection2(dto.LatestReactions); + MentionedUsers = MentionedUsers.TryLoadFromDtoCollection2(dto.MentionedUsers); Mml = dto.Mml; - OwnReactions = OwnReactions.TryLoadFromDtoCollection(dto.OwnReactions); + OwnReactions = OwnReactions.TryLoadFromDtoCollection2(dto.OwnReactions); ParentId = dto.ParentId; PinExpires = dto.PinExpires; Pinned = dto.Pinned; @@ -284,7 +284,7 @@ Message ILoadableFrom.LoadFromDto(MessageRe ShowInChannel = dto.ShowInChannel; Silent = dto.Silent; Text = dto.Text; - ThreadParticipants = ThreadParticipants.TryLoadFromDtoCollection(dto.ThreadParticipants); + ThreadParticipants = ThreadParticipants.TryLoadFromDtoCollection2(dto.ThreadParticipants); Type = Type.TryLoadFromDto(dto.Type); UpdatedAt = dto.UpdatedAt; User = User.TryLoadFromDto(dto.User); diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs index 95bf875d..d9f52584 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Poll.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll /// - public partial class Poll : ModelBase, ILoadableFrom, ILoadableFrom + public partial class Poll : ModelBase, ILoadableFrom, ILoadableFrom2 { public bool AllowAnswers { get; set; } @@ -81,7 +81,7 @@ Poll ILoadableFrom.LoadFromDto(PollInternalDTO dto) return this; } - Poll ILoadableFrom.LoadFromDto(PollResponseDataInternalDTO dto) + Poll ILoadableFrom2.LoadFromDto(PollResponseDataInternalDTO dto) { AllowAnswers = dto.AllowAnswers; AllowUserSuggestedOptions = dto.AllowUserSuggestedOptions; @@ -94,12 +94,12 @@ Poll ILoadableFrom.LoadFromDto(PollResponseDa EnforceUniqueVote = dto.EnforceUniqueVote; Id = dto.Id; IsClosed = dto.IsClosed; - LatestAnswers = LatestAnswers.TryLoadFromDtoCollection(dto.LatestAnswers); + LatestAnswers = LatestAnswers.TryLoadFromDtoCollection2(dto.LatestAnswers); LatestVotesByOption = LoadVotesByOption(dto.LatestVotesByOption); MaxVotesAllowed = dto.MaxVotesAllowed; Name = dto.Name; - Options = Options.TryLoadFromDtoCollection(dto.Options); - OwnVotes = OwnVotes.TryLoadFromDtoCollection(dto.OwnVotes); + Options = Options.TryLoadFromDtoCollection2(dto.Options); + OwnVotes = OwnVotes.TryLoadFromDtoCollection2(dto.OwnVotes); UpdatedAt = dto.UpdatedAt; VoteCount = dto.VoteCount; VoteCountsByOption = dto.VoteCountsByOption; @@ -119,7 +119,7 @@ private Dictionary> LoadVotesByOption(Dictionary>(); foreach (var kvp in dto) { - result[kvp.Key] = new List().TryLoadFromDtoCollection(kvp.Value); + result[kvp.Key] = new List().TryLoadFromDtoCollection2(kvp.Value); } return result; } diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs index 84a0c949..3493edfc 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollOption.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll option /// - public partial class PollOption : ILoadableFrom, ILoadableFrom + public partial class PollOption : ILoadableFrom, ILoadableFrom2 { public Dictionary Custom { get; set; } @@ -29,7 +29,7 @@ PollOption ILoadableFrom.LoadFromDto(PollOpti return this; } - PollOption ILoadableFrom.LoadFromDto(PollOptionResponseDataInternalDTO dto) + PollOption ILoadableFrom2.LoadFromDto(PollOptionResponseDataInternalDTO dto) { Custom = dto.Custom; Id = dto.Id; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs index ca513c95..44b4d661 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PollVote.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// /// Represents a poll vote /// - public partial class PollVote : ILoadableFrom, ILoadableFrom + public partial class PollVote : ILoadableFrom, ILoadableFrom2 { public string AnswerText { get; set; } @@ -47,7 +47,7 @@ PollVote ILoadableFrom.LoadFromDto(PollVoteIntern return this; } - PollVote ILoadableFrom.LoadFromDto(PollVoteResponseDataInternalDTO dto) + PollVote ILoadableFrom2.LoadFromDto(PollVoteResponseDataInternalDTO dto) { AnswerText = dto.AnswerText; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs index 8fb60d45..587598f6 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/PushNotificationSettings.cs @@ -7,9 +7,9 @@ namespace StreamChat.Core.LowLevelClient.Models public class PushNotificationSettings : ModelBase, ILoadableFrom, - ILoadableFrom, - ILoadableFrom, - ISavableTo, ISavableTo + ILoadableFrom2, + ILoadableFrom3, + ISavableTo, ISavableTo2 { public bool? Disabled { get; set; } @@ -25,7 +25,7 @@ PushNotificationSettings ILoadableFrom. + PushNotificationSettings ILoadableFrom2. LoadFromDto(PushNotificationSettingsRequestInternalDTO dto) { Disabled = dto.Disabled; @@ -35,7 +35,7 @@ PushNotificationSettings ILoadableFrom. + PushNotificationSettings ILoadableFrom3. LoadFromDto(PushNotificationSettingsResponseInternalDTO dto) { Disabled = dto.Disabled; @@ -53,7 +53,7 @@ PushNotificationSettingsInternalDTO ISavableTo.SaveToDto() + PushNotificationSettingsRequestInternalDTO ISavableTo2.SaveToDto() => new PushNotificationSettingsRequestInternalDTO { Disabled = Disabled, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs index ded5485a..af5616f7 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/Reaction.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.LowLevelClient.Models /// Represents user reaction to a message /// public class Reaction : ResponseObjectBase, ILoadableFrom, - ILoadableFrom + ILoadableFrom2 { /// /// Date/time of creation @@ -57,7 +57,7 @@ Reaction ILoadableFrom.LoadFromDto(ReactionIntern return this; } - Reaction ILoadableFrom.LoadFromDto(ReactionResponseInternalDTO dto) + Reaction ILoadableFrom2.LoadFromDto(ReactionResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs index 62e495b8..aa9024c6 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Models/User.cs @@ -7,8 +7,8 @@ namespace StreamChat.Core.LowLevelClient.Models { //StreamTODO: Check if this object is needed. Ideally we'd only have IStreamUser object representing a user and remove this one public class User : ModelBase, ILoadableFrom, - ILoadableFrom, ILoadableFrom, - ILoadableFrom, + ILoadableFrom2, ILoadableFrom3, + ILoadableFrom4, ISavableTo { /// @@ -113,7 +113,7 @@ User ILoadableFrom.LoadFromDto(UserObjectInternalDT return this; } - User ILoadableFrom.LoadFromDto(UserResponseInternalDTO dto) + User ILoadableFrom2.LoadFromDto(UserResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; @@ -141,7 +141,7 @@ User ILoadableFrom.LoadFromDto(UserResponseIntern return this; } - User ILoadableFrom.LoadFromDto(UserEventPayloadInternalDTO dto) + User ILoadableFrom3.LoadFromDto(UserEventPayloadInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; @@ -193,7 +193,7 @@ UserObjectInternalDTO ISavableTo.SaveToDto() Image = Image, }; - User ILoadableFrom.LoadFromDto(FullUserResponseInternalDTO dto) + User ILoadableFrom4.LoadFromDto(FullUserResponseInternalDTO dto) { AdditionalProperties = dto.AdditionalProperties; BanExpires = dto.BanExpires; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs index 0c7294e6..cd61c5fb 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelMemberRequest.cs @@ -5,7 +5,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo, ISavableTo + public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -69,7 +69,7 @@ public partial class ChannelMemberRequest : RequestObjectBase, ISavableTo.SaveToDto() => + ChannelMemberRequestInternalDTO ISavableTo2.SaveToDto() => new ChannelMemberRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs index 6f05469f..730a3485 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/ChannelRequest.cs @@ -54,7 +54,7 @@ ChannelRequestInternalDTO ISavableTo.SaveToDto() => CreatedBy = CreatedBy.TrySaveToDto(), Disabled = Disabled, Frozen = Frozen, - Members = Members.TrySaveToDtoCollection(), + Members = Members.TrySaveToDtoCollection2(), OwnCapabilities = OwnCapabilities, Team = Team, TruncatedAt = TruncatedAt, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs index deb7faf0..0d770948 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/PushNotificationSettingsRequest.cs @@ -4,7 +4,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public class PushNotificationSettingsRequest : RequestObjectBase, ISavableTo, ISavableTo + public class PushNotificationSettingsRequest : RequestObjectBase, ISavableTo, ISavableTo2 { public bool Disabled { get; set; } @@ -18,7 +18,7 @@ PushNotificationSettingsRequestInternalDTO ISavableTo.SaveToDto() => + PushNotificationSettingsInternalDTO ISavableTo2.SaveToDto() => new PushNotificationSettingsInternalDTO { Disabled = Disabled, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs index c62d7968..9123ee61 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/QueryUsersRequest.cs @@ -63,7 +63,7 @@ QueryUsersRequestInternalDTO ISavableTo.SaveToDto( Limit = Limit, Offset = Offset, Presence = Presence, - Sort = Sort.TrySaveToDtoCollection(), + Sort = Sort.TrySaveToDtoCollection2(), AdditionalProperties = AdditionalProperties, }; } diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs index 52a903b2..44f342d2 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/SortParamRequest.cs @@ -3,7 +3,7 @@ namespace StreamChat.Core.LowLevelClient.Requests { - public partial class SortParamRequest : RequestObjectBase, ISavableTo, ISavableTo + public partial class SortParamRequest : RequestObjectBase, ISavableTo, ISavableTo2 { public int? Direction { get; set; } @@ -17,7 +17,7 @@ SortParamRequestInternalDTO ISavableTo.SaveToDto() AdditionalProperties = AdditionalProperties }; - SortParamInternalDTO ISavableTo.SaveToDto() => + SortParamInternalDTO ISavableTo2.SaveToDto() => new SortParamInternalDTO { Direction = Direction, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs index 5e504d70..e0840c48 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Requests/UserObjectRequest.cs @@ -10,7 +10,7 @@ namespace StreamChat.Core.LowLevelClient.Requests /// Represents chat user /// public class UserObjectRequest : RequestObjectBase, ISavableTo, - ISavableTo, ISavableTo + ISavableTo2, ISavableTo3 { /// /// Expiration date of the ban @@ -66,7 +66,7 @@ UserObjectRequestInternalDTO ISavableTo.SaveToDto( AdditionalProperties = AdditionalProperties }; - UserRequestInternalDTO ISavableTo.SaveToDto() + UserRequestInternalDTO ISavableTo2.SaveToDto() => new UserRequestInternalDTO { BanExpires = BanExpires, @@ -81,7 +81,7 @@ UserRequestInternalDTO ISavableTo.SaveToDto() AdditionalProperties = AdditionalProperties }; - UserObjectInternalDTO ISavableTo.SaveToDto() + UserObjectInternalDTO ISavableTo3.SaveToDto() => new UserObjectInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs index e6bb81f1..a575383e 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/PollVotesResponse.cs @@ -18,7 +18,7 @@ public partial class PollVotesResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(PollVotesResponseInternalDTO dto) { - Votes = Votes.TryLoadFromDtoCollection(dto.Votes); + Votes = Votes.TryLoadFromDtoCollection2(dto.Votes); Next = dto.Next; Prev = dto.Prev; AdditionalProperties = dto.AdditionalProperties; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs index 521980d4..5c34539a 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/QueryPollsResponse.cs @@ -18,7 +18,7 @@ public partial class QueryPollsResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(QueryPollsResponseInternalDTO dto) { - Polls = Polls.TryLoadFromDtoCollection(dto.Polls); + Polls = Polls.TryLoadFromDtoCollection2(dto.Polls); Next = dto.Next; Prev = dto.Prev; AdditionalProperties = dto.AdditionalProperties; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs index 51c4b3d1..871322bc 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UpdateChannelPartialResponse.cs @@ -19,7 +19,7 @@ UpdateChannelPartialResponse ILoadableFrom.LoadFromDto(UpdateUsersResponseInternalDTO dto) { Duration = dto.Duration; - Users = Users.TryLoadFromDtoDictionary(dto.Users); + Users = Users.TryLoadFromDtoDictionary4(dto.Users); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs index 659fecd5..83aef342 100644 --- a/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs +++ b/Assets/Plugins/StreamChat/Core/LowLevelClient/Responses/UsersResponse.cs @@ -20,7 +20,7 @@ public partial class UsersResponse : ResponseObjectBase, ILoadableFrom.LoadFromDto(QueryUsersResponseInternalDTO dto) { Duration = dto.Duration; - Users = Users.TryLoadFromDtoCollection(dto.Users); + Users = Users.TryLoadFromDtoCollection4(dto.Users); AdditionalProperties = dto.AdditionalProperties; return this; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs index 863d7168..836b2fd2 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPollOption.cs @@ -10,7 +10,7 @@ namespace StreamChat.Core.Models /// Represents an option in a poll /// public class StreamPollOption : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { /// /// Custom data associated with this option @@ -42,7 +42,7 @@ StreamPollOption IStateLoadableFrom.Loa return this; } - StreamPollOption IStateLoadableFrom.LoadFromDto(PollOptionResponseDataInternalDTO dto, ICache cache) + StreamPollOption IStateLoadableFrom2.LoadFromDto(PollOptionResponseDataInternalDTO dto, ICache cache) { Custom = dto.Custom; Id = dto.Id; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs index 9bf97a48..f40ee743 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPollVote.cs @@ -12,7 +12,7 @@ namespace StreamChat.Core.Models /// Represents a vote cast on a poll /// public class StreamPollVote : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { /// /// Text answer for the vote (if poll allows answers) @@ -80,7 +80,7 @@ StreamPollVote IStateLoadableFrom.LoadFromD return this; } - StreamPollVote IStateLoadableFrom.LoadFromDto(PollVoteResponseDataInternalDTO dto, ICache cache) + StreamPollVote IStateLoadableFrom2.LoadFromDto(PollVoteResponseDataInternalDTO dto, ICache cache) { AnswerText = dto.AnswerText; CreatedAt = dto.CreatedAt; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs b/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs index bae9e766..2db682c3 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamPushNotificationSettings.cs @@ -7,7 +7,7 @@ namespace StreamChat.Core.Models { public class StreamPushNotificationSettings : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { public bool Disabled { get; private set; } @@ -24,7 +24,7 @@ public class StreamPushNotificationSettings : } StreamPushNotificationSettings - IStateLoadableFrom.LoadFromDto( + IStateLoadableFrom2.LoadFromDto( PushNotificationSettingsResponseInternalDTO dto, ICache cache) { Disabled = dto.Disabled.GetValueOrDefault(); diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs b/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs index 4e394bfc..f295129d 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamReaction.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.Models /// /// Represents user reaction to a message /// - public class StreamReaction : IStateLoadableFrom, IStateLoadableFrom + public class StreamReaction : IStateLoadableFrom, IStateLoadableFrom2 { /// /// Date/time of creation @@ -59,7 +59,7 @@ StreamReaction IStateLoadableFrom.LoadFromD return this; } - StreamReaction IStateLoadableFrom.LoadFromDto(ReactionResponseInternalDTO dto, ICache cache) + StreamReaction IStateLoadableFrom2.LoadFromDto(ReactionResponseInternalDTO dto, ICache cache) { CreatedAt = dto.CreatedAt; MessageId = dto.MessageId; diff --git a/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs b/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs index 837e8c12..1cbd97a5 100644 --- a/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs +++ b/Assets/Plugins/StreamChat/Core/Models/StreamRead.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.Models { //StreamTodo: this could contain the last read StreamMessage public class StreamRead : IStateLoadableFrom, - IStateLoadableFrom + IStateLoadableFrom2 { public DateTimeOffset LastRead { get; private set; } @@ -27,7 +27,7 @@ StreamRead IStateLoadableFrom.LoadFromDto(ReadInter return this; } - StreamRead IStateLoadableFrom.LoadFromDto(ReadStateResponseInternalDTO dto, ICache cache) + StreamRead IStateLoadableFrom2.LoadFromDto(ReadStateResponseInternalDTO dto, ICache cache) { //Is this always set? What if a user marks empty channel as read? LastRead = dto.LastRead; //StreamTodo: GetValueOrThrow? diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs index 7eef73c3..8139bc0a 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamChannelMemberRequest.cs @@ -5,7 +5,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamChannelMemberRequest : ISavableTo, ISavableTo + public sealed class StreamChannelMemberRequest : ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -32,7 +32,7 @@ public sealed class StreamChannelMemberRequest : ISavableTo public bool? ShadowBanned { get; set; } - ChannelMemberRequestInternalDTO ISavableTo.SaveToDto() + ChannelMemberRequestInternalDTO ISavableTo2.SaveToDto() => new ChannelMemberRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs index 90d630e5..0d079407 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamPollOptionRequest.cs @@ -8,7 +8,7 @@ namespace StreamChat.Core.Requests /// /// Request to create a poll option /// - public class StreamPollOptionRequest : ISavableTo, ISavableTo + public class StreamPollOptionRequest : ISavableTo, ISavableTo2 { /// /// Custom data for the option @@ -20,7 +20,7 @@ public class StreamPollOptionRequest : ISavableTo, /// public string Text { get; set; } - PollOptionRequestInternalDTO ISavableTo.SaveToDto() + PollOptionRequestInternalDTO ISavableTo2.SaveToDto() { return new PollOptionRequestInternalDTO { diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs index 85c4921e..0dc6c564 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamQueryBannedUsersRequest.cs @@ -63,7 +63,7 @@ QueryBannedUsersRequestInternalDTO ISavableTo(), + Sort = Sort.TrySaveToDtoCollection2(), }; } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs index 24d12886..c9054444 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamSortParam.cs @@ -4,7 +4,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamSortParam : ISavableTo, ISavableTo + public sealed class StreamSortParam : ISavableTo, ISavableTo2 { public int? Direction { get; set; } @@ -17,7 +17,7 @@ SortParamInternalDTO ISavableTo.SaveToDto() => Field = Field, }; - SortParamRequestInternalDTO ISavableTo.SaveToDto() => + SortParamRequestInternalDTO ISavableTo2.SaveToDto() => new SortParamRequestInternalDTO { Direction = Direction, diff --git a/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs b/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs index aa04f4a7..623424ee 100644 --- a/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs +++ b/Assets/Plugins/StreamChat/Core/Requests/StreamUserUpsertRequest.cs @@ -7,7 +7,7 @@ namespace StreamChat.Core.Requests { - public sealed class StreamUserUpsertRequest : ISavableTo, ISavableTo + public sealed class StreamUserUpsertRequest : ISavableTo, ISavableTo2 { /// /// Expiration date of the ban @@ -56,7 +56,7 @@ public sealed class StreamUserUpsertRequest : ISavableTo public StreamCustomDataRequest CustomData { get; set; } - UserObjectRequestInternalDTO ISavableTo.SaveToDto() + UserObjectRequestInternalDTO ISavableTo2.SaveToDto() => new UserObjectRequestInternalDTO { BanExpires = BanExpires, diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs b/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs index 70db31a4..6e06bfc0 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/Cache.cs @@ -20,15 +20,15 @@ public Cache(StreamChatClient stateClient, ISerializer serializer, ILogs logs) Polls = new CacheRepository(trackedObjectsFactory.CreateStreamPoll, cache: this); Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); - Channels.RegisterDtoIdMapping(dto => dto.Channel.Cid); + Channels.RegisterDtoIdMapping2(dto => dto.Cid); + Channels.RegisterDtoIdMapping3(dto => dto.Channel.Cid); + Channels.RegisterDtoIdMapping4(dto => dto.Channel.Cid); Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); - Users.RegisterDtoIdMapping(dto => dto.Id); + Users.RegisterDtoIdMapping2(dto => dto.Id); + Users.RegisterDtoIdMapping3(dto => dto.Id); + Users.RegisterDtoIdMapping4(dto => dto.Id); + Users.RegisterDtoIdMapping5(dto => dto.Id); LocalUser.RegisterDtoIdMapping(dto => dto.Id); @@ -44,7 +44,7 @@ public Cache(StreamChatClient stateClient, ISerializer serializer, ILogs logs) }); Messages.RegisterDtoIdMapping(dto => dto.Id); - Messages.RegisterDtoIdMapping(dto => dto.Id); + Messages.RegisterDtoIdMapping2(dto => dto.Id); Polls.RegisterDtoIdMapping(dto => dto.Id); } diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs b/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs index 3cafdca7..5fcb621b 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/CacheRepository.cs @@ -35,37 +35,74 @@ public void RegisterDtoIdMapping(Func idGetter) where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom where TDto : class { - var key = typeof(TDto); + RegisterDtoIdMappingInternal(idGetter); + } - if (_dtoIdGetters.ContainsKey(key)) - { - throw new InvalidOperationException("Key is already registered: " + key); - } + public void RegisterDtoIdMapping2(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom2 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } - string Wrapper(object obj) => idGetter(obj as TDto); + public void RegisterDtoIdMapping3(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom3 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } - _dtoIdGetters.Add(key, Wrapper); + public void RegisterDtoIdMapping4(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom4 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); + } + + public void RegisterDtoIdMapping5(Func idGetter) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom5 + where TDto : class + { + RegisterDtoIdMappingInternal(idGetter); } public TType CreateOrUpdate(TDto dto, out bool wasCreated) where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom { - wasCreated = false; - var trackingId = GetDtoMappingId(dto); - if (!TryGet(trackingId, out var trackedObject)) - { - trackedObject = _constructor(trackingId); - wasCreated = true; - } + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } - var typedStatefulModel = trackedObject as TType; - if (typedStatefulModel == null) - { - throw new InvalidOperationException($"Failed to cast {typeof(TStatefulModel)} to {typeof(TType)}"); - } + public TType CreateOrUpdate2(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom2 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + + public TType CreateOrUpdate3(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom3 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + public TType CreateOrUpdate4(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom4 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); typedStatefulModel.UpdateFromDto(dto, _cache); + return typedStatefulModel; + } + public TType CreateOrUpdate5(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel, IUpdateableFrom5 + { + var typedStatefulModel = GetOrCreateStatefulModel(dto, out wasCreated); + typedStatefulModel.UpdateFromDto(dto, _cache); return typedStatefulModel; } @@ -110,6 +147,40 @@ internal CacheRepository(ConstructorHandler constructor, ICache cache) _cache = cache ?? throw new ArgumentNullException(nameof(cache)); } + private void RegisterDtoIdMappingInternal(Func idGetter) where TDto : class + { + var key = typeof(TDto); + + if (_dtoIdGetters.ContainsKey(key)) + { + throw new InvalidOperationException("Key is already registered: " + key); + } + + string Wrapper(object obj) => idGetter(obj as TDto); + + _dtoIdGetters.Add(key, Wrapper); + } + + private TType GetOrCreateStatefulModel(TDto dto, out bool wasCreated) + where TType : class, TStatefulModel, IStreamStatefulModel + { + wasCreated = false; + var trackingId = GetDtoMappingId(dto); + if (!TryGet(trackingId, out var trackedObject)) + { + trackedObject = _constructor(trackingId); + wasCreated = true; + } + + var typedStatefulModel = trackedObject as TType; + if (typedStatefulModel == null) + { + throw new InvalidOperationException($"Failed to cast {typeof(TStatefulModel)} to {typeof(TType)}"); + } + + return typedStatefulModel; + } + private readonly List _statefulModels = new List(); private readonly Dictionary _statefulModelById = new Dictionary(); diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs index 383ed72b..68f3b26d 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheExt.cs @@ -10,7 +10,7 @@ public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternal => dto == null ? null : cache.Messages.CreateOrUpdate(dto, out _); public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageResponseInternalDTO dto) - => dto == null ? null : cache.Messages.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Messages.CreateOrUpdate2(dto, out _); public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternalDTO dto, out bool wasCreated) { @@ -23,20 +23,20 @@ public static StreamMessage TryCreateOrUpdate(this ICache cache, MessageInternal public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelResponseInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate2(dto, out _); public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelResponseInternalDTO dto, out bool wasCreated) { wasCreated = false; return dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out wasCreated); + : cache.Channels.CreateOrUpdate2(dto, out wasCreated); } public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateResponseFieldsInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate3(dto, out _); public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateResponseInternalDTO dto) => dto == null @@ -46,7 +46,7 @@ public static StreamChannel TryCreateOrUpdate(this ICache cache, ChannelStateRes public static StreamChannel TryCreateOrUpdate(this ICache cache, UpdateChannelResponseInternalDTO dto) => dto == null ? null - : cache.Channels.CreateOrUpdate(dto, out _); + : cache.Channels.CreateOrUpdate4(dto, out _); public static StreamChannelMember TryCreateOrUpdate(this ICache cache, ChannelMemberInternalDTO dto) => dto == null @@ -54,7 +54,7 @@ public static StreamChannelMember TryCreateOrUpdate(this ICache cache, ChannelMe : cache.ChannelMembers.CreateOrUpdate(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserResponseInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate2(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserObjectInternalDTO dto) => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); @@ -72,10 +72,10 @@ public static StreamLocalUserData TryCreateOrUpdate(this ICache cache, OwnUserIn => dto == null ? null : cache.LocalUser.CreateOrUpdate(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, FullUserResponseInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate4(dto, out _); public static StreamUser TryCreateOrUpdate(this ICache cache, UserEventPayloadInternalDTO dto) - => dto == null ? null : cache.Users.CreateOrUpdate(dto, out _); + => dto == null ? null : cache.Users.CreateOrUpdate5(dto, out _); public static StreamPoll TryCreateOrUpdate(this ICache cache, PollResponseDataInternalDTO dto) => dto == null ? null : cache.Polls.CreateOrUpdate(dto, out _); diff --git a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs index 3227671f..4915e68b 100644 --- a/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs +++ b/Assets/Plugins/StreamChat/Core/State/Caches/ICacheRepository.cs @@ -20,9 +20,37 @@ void RegisterDtoIdMapping(Func idGetter) where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom where TDto : class; + void RegisterDtoIdMapping2(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom2 + where TDto : class; + + void RegisterDtoIdMapping3(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom3 + where TDto : class; + + void RegisterDtoIdMapping4(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom4 + where TDto : class; + + void RegisterDtoIdMapping5(Func idGetter) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom5 + where TDto : class; + TType CreateOrUpdate(TDto dto, out bool wasCreated) where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom; + TType CreateOrUpdate2(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom2; + + TType CreateOrUpdate3(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom3; + + TType CreateOrUpdate4(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom4; + + TType CreateOrUpdate5(TDto dto, out bool wasCreated) + where TType : class, TTrackedObject, IStreamStatefulModel, IUpdateableFrom5; + void Remove(TTrackedObject trackedObject); } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs b/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs index c2e8d94f..8646d449 100644 --- a/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/IRepositoryExt.cs @@ -80,6 +80,73 @@ public static void TryAppendUniqueTrackedObjects(this IList(this IList target, IEnumerable dtos, + ICacheRepository repository) + where TTracked : class, IStreamStatefulModel, IUpdateableFrom2 + { + if (target == null) + { + throw new ArgumentException(nameof(target)); + } + + if (dtos == null) + { + return; + } + + target.Clear(); + + foreach (var dto in dtos) + { + var trackedItem = repository.CreateOrUpdate2(dto, out _); + try + { + target.Add(trackedItem); + } + catch + { + } + } + } + + public static void TryAppendUniqueTrackedObjects2(this IList target, + IEnumerable dtos, ICacheRepository repository) + where TTracked : class, IStreamStatefulModel, IUpdateableFrom2 + { + if (target == null) + { + throw new ArgumentException(nameof(target)); + } + + if (dtos == null) + { + return; + } + + _uniqueElements.Clear(); + + foreach (var t in target) + { + _uniqueElements.Add(t); + } + + foreach (var dto in dtos) + { + var trackedItem = repository.CreateOrUpdate2(dto, out _); + + if (_uniqueElements.Add(trackedItem)) + { + try + { + target.Add(trackedItem); + } + catch + { + } + } + } + } + private static readonly HashSet _uniqueElements = new HashSet(); } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs b/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs index 7829caae..8b1bce7a 100644 --- a/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/State/IStateLoadableFrom.cs @@ -17,6 +17,12 @@ internal interface IStateLoadableFrom TDomain LoadFromDto(TDto dto, ICache cache); } + internal interface IStateLoadableFrom2 + where TDomain : IStateLoadableFrom2 + { + TDomain LoadFromDto(TDto dto, ICache cache); + } + /// /// Extensions for /// @@ -32,7 +38,18 @@ public static TDomain TryLoadFromDto(this IStateLoadableFrom(this IStateLoadableFrom2 loadable, TDto dto, ICache cache) + where TDomain : class, IStateLoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + return new TDomain().LoadFromDto(dto, cache); + } + public static TDomain LoadFromDto(this IStateLoadableFrom loadable, TDto dto, ICache cache) where TDomain : class, IStateLoadableFrom, new() { @@ -49,6 +66,22 @@ public static TDomain LoadFromDto(this IStateLoadableFrom(this IStateLoadableFrom2 loadable, TDto dto, ICache cache) + where TDomain : class, IStateLoadableFrom2, new() + { + if (dto == null) + { + return null; + } + + if (loadable == null) + { + throw new ArgumentException(nameof(loadable)); + } + + return loadable.LoadFromDto(dto, cache); + } + [Pure] public static List TryLoadFromDtoCollection(this List _, List dtos, ICache cache) where TSource : IStateLoadableFrom, new() @@ -68,6 +101,24 @@ public static List TryLoadFromDtoCollection(this List TryLoadFromDtoCollection2(this List _, List dtos, ICache cache) + where TSource : IStateLoadableFrom2, new() + { + if (dtos == null) + { + return null; + } + + var items = new List(dtos.Count); + + foreach (var dto in dtos) + { + items.Add(new TSource().LoadFromDto(dto, cache)); + } + + return items; + } /// /// Regular = non tracked objects @@ -98,6 +149,35 @@ public static void TryReplaceRegularObjectsFromDto(this List + /// Regular = non tracked objects + /// + public static void TryReplaceRegularObjectsFromDto2(this List target, List dtos, ICache cache) + where TSource : IStateLoadableFrom2, new() + { + if (typeof(TSource) is IStreamStatefulModel) + { + throw new InvalidOperationException("This method should not be used for tracked objects"); + } + + if (dtos == null) + { + return; + } + + if (target == null) + { + throw new ArgumentNullException(nameof(target)); + } + + target.Clear(); + + foreach (var dto in dtos) + { + target.Add(new TSource().LoadFromDto(dto, cache)); + } + } + /// /// Values = value types /// diff --git a/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs b/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs index 3aca193c..8b75f908 100644 --- a/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs +++ b/Assets/Plugins/StreamChat/Core/State/IUpdateableFrom.cs @@ -7,4 +7,28 @@ internal interface IUpdateableFrom { void UpdateFromDto(TDto dto, ICache cache); } + + internal interface IUpdateableFrom2 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom2 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom3 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom3 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom4 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom4 + { + void UpdateFromDto(TDto dto, ICache cache); + } + + internal interface IUpdateableFrom5 + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom5 + { + void UpdateFromDto(TDto dto, ICache cache); + } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs b/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs index e03ef744..d9a3d90a 100644 --- a/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs +++ b/Assets/Plugins/StreamChat/Core/State/UpdateableFromExt.cs @@ -9,5 +9,29 @@ public static void TryUpdateFromDto(this IUpdateableFrom(this IUpdateableFrom2 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom2 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom3 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom3 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom4 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom4 + { + updateable?.UpdateFromDto(dto, cache); + } + + public static void TryUpdateFromDto(this IUpdateableFrom5 updateable, TDto dto, ICache cache) + where TTrackedObject : IStreamStatefulModel, IUpdateableFrom5 + { + updateable?.UpdateFromDto(dto, cache); + } } } \ No newline at end of file diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs index 6bbd03f0..daf18f4b 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamChannel.cs @@ -37,9 +37,9 @@ public delegate void StreamMessageReactionHandler(IStreamChannel channel, IStrea internal sealed class StreamChannel : StreamStatefulModelBase, IUpdateableFrom, - IUpdateableFrom, - IUpdateableFrom, - IUpdateableFrom, + IUpdateableFrom2, + IUpdateableFrom3, + IUpdateableFrom4, IStreamChannel { public event StreamChannelMessageHandler MessageReceived; @@ -631,12 +631,12 @@ void IUpdateableFrom.UpdateFromD //This is needed because Channel.Members can be null while this is filled _members.TryAppendUniqueTrackedObjects(dto.Members, cache.ChannelMembers); Membership = cache.TryCreateOrUpdate(dto.Membership); - _messages.TryAppendUniqueTrackedObjects(dto.Messages, cache.Messages); + _messages.TryAppendUniqueTrackedObjects2(dto.Messages, cache.Messages); _pendingMessages.TryReplaceRegularObjectsFromDto(dto.PendingMessages, cache); - _pinnedMessages.TryReplaceTrackedObjects(dto.PinnedMessages, cache.Messages); - _read.TryReplaceRegularObjectsFromDto(dto.Read, cache); + _pinnedMessages.TryReplaceTrackedObjects2(dto.PinnedMessages, cache.Messages); + _read.TryReplaceRegularObjectsFromDto2(dto.Read, cache); WatcherCount = GetOrDefault(dto.WatcherCount, WatcherCount); - _watchers.TryAppendUniqueTrackedObjects(dto.Watchers, cache.Users); + _watchers.TryAppendUniqueTrackedObjects2(dto.Watchers, cache.Users); #endregion @@ -645,7 +645,7 @@ void IUpdateableFrom.UpdateFromD //StreamTodo should every UpdateFromDto trigger Updated event? } - void IUpdateableFrom.UpdateFromDto( + void IUpdateableFrom3.UpdateFromDto( ChannelStateResponseFieldsInternalDTO dto, ICache cache) { UpdateChannelFieldsFromDto(dto.Channel, cache); @@ -656,23 +656,23 @@ void IUpdateableFrom.Updat //HideMessagesBefore = dto.HideMessagesBefore; Updated from Channel _members.TryReplaceTrackedObjects(dto.Members, cache.ChannelMembers); Membership = cache.TryCreateOrUpdate(dto.Membership); - _messages.TryAppendUniqueTrackedObjects(dto.Messages, cache.Messages); + _messages.TryAppendUniqueTrackedObjects2(dto.Messages, cache.Messages); _pendingMessages.TryReplaceRegularObjectsFromDto(dto.PendingMessages, cache); - _pinnedMessages.TryReplaceTrackedObjects(dto.PinnedMessages, cache.Messages); - _read.TryReplaceRegularObjectsFromDto(dto.Read, cache); + _pinnedMessages.TryReplaceTrackedObjects2(dto.PinnedMessages, cache.Messages); + _read.TryReplaceRegularObjectsFromDto2(dto.Read, cache); WatcherCount = GetOrDefault(dto.WatcherCount, WatcherCount); - _watchers.TryAppendUniqueTrackedObjects(dto.Watchers, cache.Users); + _watchers.TryAppendUniqueTrackedObjects2(dto.Watchers, cache.Users); SortMessagesByCreatedAt(); #endregion } - void IUpdateableFrom.UpdateFromDto(ChannelResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(ChannelResponseInternalDTO dto, ICache cache) => UpdateChannelFieldsFromDto(dto, cache); - void IUpdateableFrom.UpdateFromDto( + void IUpdateableFrom4.UpdateFromDto( UpdateChannelResponseInternalDTO dto, ICache cache) { UpdateChannelFieldsFromDto(dto.Channel, cache); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs index c5f37bf3..82acfd30 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamLocalUserData.cs @@ -9,7 +9,7 @@ namespace StreamChat.Core.StatefulModels { internal sealed class StreamLocalUserData : StreamStatefulModelBase, - IUpdateableFrom, IUpdateableFrom, IStreamLocalUserData + IUpdateableFrom, IUpdateableFrom2, IStreamLocalUserData { #region OwnUser @@ -46,7 +46,7 @@ void IUpdateableFrom.UpdateFromDto(OwnU #endregion - User = cache.Users.CreateOrUpdate(dto, out _); + User = cache.Users.CreateOrUpdate3(dto, out _); LoadAdditionalProperties(dto.AdditionalProperties); @@ -55,7 +55,7 @@ void IUpdateableFrom.UpdateFromDto(OwnU #endif } - void IUpdateableFrom.UpdateFromDto(WrappedUnreadCountsResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(WrappedUnreadCountsResponseInternalDTO dto, ICache cache) { TotalUnreadCount = GetOrDefault(dto.TotalUnreadCount, TotalUnreadCount); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs index 41046b0e..9323932b 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamMessage.cs @@ -15,7 +15,7 @@ namespace StreamChat.Core.StatefulModels { internal sealed class StreamMessage : StreamStatefulModelBase, - IStreamMessage, IUpdateableFrom, IUpdateableFrom + IStreamMessage, IUpdateableFrom, IUpdateableFrom2 { public event StreamMessageReactionHandler ReactionAdded; public event StreamMessageReactionHandler ReactionRemoved; @@ -236,7 +236,7 @@ void IUpdateableFrom.UpdateFromDto(MessageInt LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(MessageResponseInternalDTO dto, ICache cache) + void IUpdateableFrom2.UpdateFromDto(MessageResponseInternalDTO dto, ICache cache) { _attachments.TryReplaceRegularObjectsFromDto(dto.Attachments, cache); //BeforeMessageSendFailed = GetOrDefault(dto.BeforeMessageSendFailed, BeforeMessageSendFailed); @@ -248,10 +248,10 @@ void IUpdateableFrom.UpdateFromDto(Me _iI18n.TryReplaceValuesFromDto(dto.I18n); Id = GetOrDefault(dto.Id, Id); //_imageLabels.TryReplaceValuesFromDto(dto.ImageLabels); //StreamTodo: NOT IMPLEMENTED - _latestReactions.TryReplaceRegularObjectsFromDto(dto.LatestReactions, cache); - _mentionedUsers.TryReplaceTrackedObjects(dto.MentionedUsers, cache.Users); + _latestReactions.TryReplaceRegularObjectsFromDto2(dto.LatestReactions, cache); + _mentionedUsers.TryReplaceTrackedObjects2(dto.MentionedUsers, cache.Users); //dto.Mml ignored because its only server-side - _ownReactions.TryReplaceRegularObjectsFromDto(dto.OwnReactions, cache); + _ownReactions.TryReplaceRegularObjectsFromDto2(dto.OwnReactions, cache); ParentId = GetOrDefault(dto.ParentId, ParentId); PinExpires = GetOrDefault(dto.PinExpires, PinExpires); Pinned = GetOrDefault(dto.Pinned, Pinned); @@ -267,8 +267,8 @@ void IUpdateableFrom.UpdateFromDto(Me ShowInChannel = GetOrDefault(dto.ShowInChannel, ShowInChannel); Silent = GetOrDefault(dto.Silent, Silent); Text = GetOrDefault(dto.Text, Text); - _mentionedUsers.TryReplaceTrackedObjects(dto.MentionedUsers, cache.Users); - _threadParticipants.TryReplaceTrackedObjects(dto.ThreadParticipants, cache.Users); + _mentionedUsers.TryReplaceTrackedObjects2(dto.MentionedUsers, cache.Users); + _threadParticipants.TryReplaceTrackedObjects2(dto.ThreadParticipants, cache.Users); Type = Type.TryLoadFromDto(dto.Type); UpdatedAt = GetOrDefault(dto.UpdatedAt, UpdatedAt); User = cache.TryCreateOrUpdate(dto.User); diff --git a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs index 92446cee..edf721ea 100644 --- a/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs +++ b/Assets/Plugins/StreamChat/Core/StatefulModels/StreamUser.cs @@ -17,7 +17,7 @@ namespace StreamChat.Core.StatefulModels /// internal sealed class StreamUser : StreamStatefulModelBase, IUpdateableFrom, - IUpdateableFrom, IUpdateableFrom, IUpdateableFrom, IUpdateableFrom, + IUpdateableFrom2, IUpdateableFrom3, IUpdateableFrom4, IUpdateableFrom5, IStreamUser { public event StreamUserPresenceHandler PresenceChanged; @@ -166,7 +166,7 @@ void IUpdateableFrom.UpdateFromDto(UserObject LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(UserResponseInternalDTO dto, + void IUpdateableFrom2.UpdateFromDto(UserResponseInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); @@ -193,7 +193,7 @@ void IUpdateableFrom.UpdateFromDto(UserResp LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(OwnUserInternalDTO dto, ICache cache) + void IUpdateableFrom3.UpdateFromDto(OwnUserInternalDTO dto, ICache cache) { #region OwnUser @@ -231,7 +231,7 @@ void IUpdateableFrom.UpdateFromDto(OwnUserIntern LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(FullUserResponseInternalDTO dto, + void IUpdateableFrom4.UpdateFromDto(FullUserResponseInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); @@ -258,7 +258,7 @@ void IUpdateableFrom.UpdateFromDto(Full LoadAdditionalProperties(dto.AdditionalProperties); } - void IUpdateableFrom.UpdateFromDto(UserEventPayloadInternalDTO dto, + void IUpdateableFrom5.UpdateFromDto(UserEventPayloadInternalDTO dto, ICache cache) { BanExpires = GetOrDefault(dto.BanExpires, BanExpires); diff --git a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs index ba4021b2..2281b501 100644 --- a/Assets/Plugins/StreamChat/Core/StreamChatClient.cs +++ b/Assets/Plugins/StreamChat/Core/StreamChatClient.cs @@ -226,7 +226,7 @@ public async Task GetLatestUnreadCountsAsync() var dto = await InternalLowLevelClient.InternalChannelApi.GetUnreadCountsAsync(); var response = dto.ToDomain(); - _localUserData.TryUpdateFromDto(dto, _cache); + ((IUpdateableFrom2)_localUserData).TryUpdateFromDto(dto, _cache); return response; }