Comments (23)
Hi @glennposadas, my bad, actually the value of 3s is there for a reason. So we will discuss internally how we can solve this in the best way, and we will let you know once have discussed it 👍
from stream-chat-swift.
Sounds good! Thank you!
from stream-chat-swift.
Hi @nuno-vieira it was suspicious indeed. It was an issue on my end and I was able to figure it out. Thanks again!
from stream-chat-swift.
Hi @glennposadas,
Do you have any video to show the problem so that it is clearer? You can also send it to [email protected] if you don't want to share it here.
But my understanding is that the issue might be this:
channelController.markRead() project.unreadChatsCount = 0 try? project.managedObjectContext?.save()
If you do that on the viewWillAppear() what might happen, is that the user sends a message, but markRead()
maybe takes more time and resets the previous message send? But I'm not sure I fully understood the problem TBH. A video would help for sure.
Best,
Nuno
from stream-chat-swift.
Hi @nuno-vieira . I sent a video to your email.
And no, removing the code you mentioned does not work. Thanks!
from stream-chat-swift.
Hi @glennposadas,
I'm not able to reproduce the issue. Can you try the following things:
1- Update to 4.50.0 (We have fixed some issues related to the current user cache, which could be causing those issues
2- Make sure the same user is not logged in on another device and marking the channel as read
3- Why is markRead()
in viewWillDisappear? That could lead to race conditions. In fact, you probably don't need to call markRead()
yourself, we already do it ourselves in viewDidAppear()
, and it has a bit of additional logic.
Thanks,
Nuno
from stream-chat-swift.
Thanks, @nuno-vieira . I will try these and get back to you soon.
I hope you tried going ( for 10-20 times) to the chat screen and going back to the previous screen (that observes unread messages in the channel).
Some codes:
In the project details:
// MARK: -
// MARK: ChatChannelControllerDelegate
extension FNProjectContainerViewController: ChatChannelControllerDelegate {
public func channelController(_ channelController: ChatChannelController, didUpdateChannel channel: EntityChange<ChatChannel>) {
let countFromChannel = channelController.channel?.unreadCount.messages ?? 0
DDLogDebug("[CHAT]: FNProjectContainerViewController: didUpdateChannel. --> \(countFromChannel) || channel.item.unreadCount -> \(channel.item.unreadCount)")
setBadgeCount(countFromChannel)
}
}
- (void)setBadgeCount:(NSInteger)count {
DDLogDebug(@"\n\n[CHAT]: setBadgeCount %ld | PROJECT ID: %@", (long)count, self.project.objectId.stringValue);
self.project.unreadChatsCount = [NSNumber numberWithInteger:count];
[self.chatButton setEnabled:YES];
[self.chatButton setBadgeValue:count];
[self.project.managedObjectContext save:nil];
}
from stream-chat-swift.
@glennposadas, yes I tried a couple of times, but calling markRead()
on both viewWillAppear and viewWillDisappear, it will be likely there will be some race conditions. If you call markRead()
after sending a message and leave the channel quickly, it will be likely depending on network conditions the markRead call can be finished only after the message being published and vice-versa
from stream-chat-swift.
Hi @nuno-vieira . Sorry for the late update.
I did both the following but didn't help:
- Updated to 4.50.
- Removed all
markRead()
.
Still, the didUpdateChannel
gets triggered thirce!
- First trigger: the expected one and has the correct badge count (1).
- After about 1 second of the above first delegate call, the 2 unexpected calls come in, this time with the incorrect unread count (0).
Is there a way to check who sets the messages as unread? I tried the Stream explorer, but to no avail.
For what it's worth, here's the complete logs of the 3 didUpdateChannel
events.
EVENT #1: Unread 1 ✅
2024-03-24 02:54:09.675 SiteCapture[2920:691b] [CHAT]: FNProjectContainerViewController: didUpdateChannel.
--> 1 || channel.item.unreadCount -> ChannelUnreadCount(messages: 1, mentions: 0)
---> Channel: Update:
ChatChannel(
cid: messaging:project-542409,
name: Optional("Boom mighnyt"),
imageURL: nil,
lastMessageAt: Optional(2024-03-23 18:54:08 +0000),
createdAt: 2024-03-05 13:47:51 +0000,
updatedAt: 2024-03-23 18:53:58 +0000,
deletedAt: nil,
truncatedAt: nil,
isHidden: false,
createdBy: Optional(StreamChat.ChatUser),
config: StreamChat.ChannelConfig,
ownCapabilities: Set([
StreamChat.ChannelCapability(rawValue: "join-channel"),
StreamChat.ChannelCapability(rawValue: "update-channel"),
StreamChat.ChannelCapability(rawValue: "quote-message"),
StreamChat.ChannelCapability(rawValue: "delete-channel"),
StreamChat.ChannelCapability(rawValue: "delete-any-message"),
StreamChat.ChannelCapability(rawValue: "read-events"),
StreamChat.ChannelCapability(rawValue: "update-own-message"),
StreamChat.ChannelCapability(rawValue: "send-custom-events"),
StreamChat.ChannelCapability(rawValue: "send-message"),
StreamChat.ChannelCapability(rawValue: "upload-file"),
StreamChat.ChannelCapability(rawValue: "join-call"),
StreamChat.ChannelCapability(rawValue: "ban-channel-members"),
StreamChat.ChannelCapability(rawValue: "update-thread"),
StreamChat.ChannelCapability(rawValue: "leave-channel"),
StreamChat.ChannelCapability(rawValue: "send-reaction"),
StreamChat.ChannelCapability(rawValue: "set-channel-cooldown"),
StreamChat.ChannelCapability(rawValue: "search-messages"),
StreamChat.ChannelCapability(rawValue: "freeze-channel"),
StreamChat.ChannelCapability(rawValue: "send-reply"),
StreamChat.ChannelCapability(rawValue: "mute-channel"),
StreamChat.ChannelCapability(rawValue: "typing-events"),
StreamChat.ChannelCapability(rawValue: "pin-message"),
StreamChat.ChannelCapability(rawValue: "delete-own-message"),
StreamChat.ChannelCapability(rawValue: "update-any-message"),
StreamChat.ChannelCapability(rawValue: "update-channel-members"),
StreamChat.ChannelCapability(rawValue: "create-call"),
StreamChat.ChannelCapability(rawValue: "flag-message"),
StreamChat.ChannelCapability(rawValue: "send-typing-events"),
StreamChat.ChannelCapability(rawValue: "connect-events"),
StreamChat.ChannelCapability(rawValue: "send-links")
]),
isFrozen: false,
memberCount: 4,
__lastActiveMembers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatChannelMember>>,
__currentlyTypingUsers: StreamChat.CoreDataLazy<Swift.Set<StreamChat.ChatUser>>,
membership: Optional(StreamChat.ChatChannelMember),
__lastActiveWatchers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatUser>>,
watcherCount: 2,
team: nil,
__unreadCount: StreamChat.CoreDataLazy<StreamChat.ChannelUnreadCount>,
__latestMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
__lastMessageFromCurrentUser: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>,
__pinnedMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
reads: [
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:54:09 +0000,
lastReadMessageId: Optional("352afc7f-be4e-40f0-8d25-414ce1e3f19b"),
unreadMessagesCount: 0,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-13 21:24:53 +0000,
lastReadMessageId: Optional("88b5f86f-1337-4cce-b9a0-eaeddc39b0f6"),
unreadMessagesCount: 64,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-15 19:12:26 +0000,
lastReadMessageId: Optional("93dd2b8f-289d-40a8-bc23-87216599bdce"),
unreadMessagesCount: 62,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:53:58 +0000,
lastReadMessageId: Optional("352afc7f-be4e-40f0-8d25-414ce1e3f19b"),
unreadMessagesCount: 1,
user: StreamChat.ChatUser
)
],
__muteDetails: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.MuteDetails>>,
cooldownDuration: 0,
extraData: ["disabled": StreamChat.RawJSON.bool(false)],
__previewMessage: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>
)
| Controller: StreamChat.ChatChannelController
2024-03-24 02:54:09.675 SiteCapture[2920:7007]
2024-03-24 02:54:44.872 SiteCapture[2920:460f] [CHAT]: FNProjectContainerViewController: didUpdateChannel.
--> 0 || channel.item.unreadCount -> ChannelUnreadCount(messages: 0, mentions: 0)
---> Channel: Update:
ChatChannel(
cid: messaging:project-542409,
name: Optional("Boom mighnyt"),
imageURL: nil,
lastMessageAt: Optional(2024-03-23 18:54:42 +0000),
createdAt: 2024-03-05 13:47:51 +0000,
updatedAt: 2024-03-23 18:54:38 +0000,
deletedAt: nil,
truncatedAt: nil,
isHidden: false,
createdBy: Optional(StreamChat.ChatUser),
config: StreamChat.ChannelConfig,
ownCapabilities: Set([
StreamChat.ChannelCapability(rawValue: "create-call"),
StreamChat.ChannelCapability(rawValue: "quote-message"),
StreamChat.ChannelCapability(rawValue: "read-events"),
StreamChat.ChannelCapability(rawValue: "search-messages"),
StreamChat.ChannelCapability(rawValue: "send-custom-events"),
StreamChat.ChannelCapability(rawValue: "delete-channel"),
StreamChat.ChannelCapability(rawValue: "update-channel"),
StreamChat.ChannelCapability(rawValue: "mute-channel"),
StreamChat.ChannelCapability(rawValue: "join-channel"),
StreamChat.ChannelCapability(rawValue: "send-message"),
StreamChat.ChannelCapability(rawValue: "send-typing-events"),
StreamChat.ChannelCapability(rawValue: "send-reply"),
StreamChat.ChannelCapability(rawValue: "update-channel-members"),
StreamChat.ChannelCapability(rawValue: "update-own-message"),
StreamChat.ChannelCapability(rawValue: "freeze-channel"),
StreamChat.ChannelCapability(rawValue: "send-links"),
StreamChat.ChannelCapability(rawValue: "update-any-message"),
StreamChat.ChannelCapability(rawValue: "leave-channel"),
StreamChat.ChannelCapability(rawValue: "flag-message"),
StreamChat.ChannelCapability(rawValue: "ban-channel-members"),
StreamChat.ChannelCapability(rawValue: "upload-file"),
StreamChat.ChannelCapability(rawValue: "send-reaction"),
StreamChat.ChannelCapability(rawValue: "delete-any-message"),
StreamChat.ChannelCapability(rawValue: "set-channel-cooldown"),
StreamChat.ChannelCapability(rawValue: "typing-events"),
StreamChat.ChannelCapability(rawValue: "connect-events"),
StreamChat.ChannelCapability(rawValue: "update-thread"),
StreamChat.ChannelCapability(rawValue: "join-call"),
StreamChat.ChannelCapability(rawValue: "pin-message"),
StreamChat.ChannelCapability(rawValue: "delete-own-message")
]),
isFrozen: false,
memberCount: 4,
__lastActiveMembers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatChannelMember>>,
__currentlyTypingUsers: StreamChat.CoreDataLazy<Swift.Set<StreamChat.ChatUser>>,
membership: Optional(StreamChat.ChatChannelMember),
__lastActiveWatchers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatUser>>,
watcherCount: 2,
team: nil,
__unreadCount: StreamChat.CoreDataLazy<StreamChat.ChannelUnreadCount>,
__latestMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
__lastMessageFromCurrentUser: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>,
__pinnedMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
reads: [
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:54:44 +0000,
lastReadMessageId: Optional("e10af15c-81d5-41aa-80bc-773e9642a94f"),
unreadMessagesCount: 0,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-15 19:12:26 +0000,
lastReadMessageId: Optional("93dd2b8f-289d-40a8-bc23-87216599bdce"),
unreadMessagesCount: 63,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:54:42 +0000,
lastReadMessageId: Optional("e10af15c-81d5-41aa-80bc-773e9642a94f"),
unreadMessagesCount: 0,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-13 21:24:53 +0000,
lastReadMessageId: Optional("88b5f86f-1337-4cce-b9a0-eaeddc39b0f6"),
unreadMessagesCount: 65,
user: StreamChat.ChatUser
)
],
__muteDetails: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.MuteDetails>>,
cooldownDuration: 0,
extraData: ["disabled": StreamChat.RawJSON.bool(false)],
__previewMessage: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>
)
| Controller: StreamChat.ChatChannelController
2024-03-24 02:54:44.873 SiteCapture[2920:a91b]
2024-03-24 02:54:45.384 SiteCapture[2920:a91b] [CHAT]: setBadgeCount 0 | PROJECT ID: 542409
2024-03-24 02:54:45.384 SiteCapture[2920:a91b] [CHAT]: FNProjectContainerViewController: didUpdateChannel.
--> 0 || channel.item.unreadCount -> ChannelUnreadCount(messages: 0, mentions: 0)
---> Channel: Update:
ChatChannel(
cid: messaging:project-542409,
name: Optional("Boom mighnyt"),
imageURL: nil,
lastMessageAt: Optional(2024-03-23 18:54:42 +0000),
createdAt: 2024-03-05 13:47:51 +0000,
updatedAt: 2024-03-23 18:54:38 +0000,
deletedAt: nil,
truncatedAt: nil,
isHidden: false,
createdBy: Optional(StreamChat.ChatUser),
config: StreamChat.ChannelConfig,
ownCapabilities: Set([
StreamChat.ChannelCapability(rawValue: "create-call"),
StreamChat.ChannelCapability(rawValue: "quote-message"),
StreamChat.ChannelCapability(rawValue: "read-events"),
StreamChat.ChannelCapability(rawValue: "search-messages"),
StreamChat.ChannelCapability(rawValue: "send-custom-events"),
StreamChat.ChannelCapability(rawValue: "delete-channel"),
StreamChat.ChannelCapability(rawValue: "update-channel"),
StreamChat.ChannelCapability(rawValue: "mute-channel"),
StreamChat.ChannelCapability(rawValue: "join-channel"),
StreamChat.ChannelCapability(rawValue: "send-message"),
StreamChat.ChannelCapability(rawValue: "send-typing-events"),
StreamChat.ChannelCapability(rawValue: "send-reply"),
StreamChat.ChannelCapability(rawValue: "update-channel-members"),
StreamChat.ChannelCapability(rawValue: "update-own-message"),
StreamChat.ChannelCapability(rawValue: "freeze-channel"),
StreamChat.ChannelCapability(rawValue: "send-links"),
StreamChat.ChannelCapability(rawValue: "update-any-message"),
StreamChat.ChannelCapability(rawValue: "leave-channel"),
StreamChat.ChannelCapability(rawValue: "flag-message"),
StreamChat.ChannelCapability(rawValue: "ban-channel-members"),
StreamChat.ChannelCapability(rawValue: "upload-file"),
StreamChat.ChannelCapability(rawValue: "send-reaction"),
StreamChat.ChannelCapability(rawValue: "delete-any-message"),
StreamChat.ChannelCapability(rawValue: "set-channel-cooldown"),
StreamChat.ChannelCapability(rawValue: "typing-events"),
StreamChat.ChannelCapability(rawValue: "connect-events"),
StreamChat.ChannelCapability(rawValue: "update-thread"),
StreamChat.ChannelCapability(rawValue: "join-call"),
StreamChat.ChannelCapability(rawValue: "pin-message"),
StreamChat.ChannelCapability(rawValue: "delete-own-message")
]),
isFrozen: false,
memberCount: 4,
__lastActiveMembers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatChannelMember>>,
__currentlyTypingUsers: StreamChat.CoreDataLazy<Swift.Set<StreamChat.ChatUser>>,
membership: Optional(StreamChat.ChatChannelMember),
__lastActiveWatchers: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatUser>>,
watcherCount: 2,
team: nil,
__unreadCount: StreamChat.CoreDataLazy<StreamChat.ChannelUnreadCount>,
__latestMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
__lastMessageFromCurrentUser: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>,
__pinnedMessages: StreamChat.CoreDataLazy<Swift.Array<StreamChat.ChatMessage>>,
reads: [
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-13 21:24:53 +0000,
lastReadMessageId: Optional("88b5f86f-1337-4cce-b9a0-eaeddc39b0f6"),
unreadMessagesCount: 65,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:54:44 +0000,
lastReadMessageId: Optional("047cadcc-86ce-4637-a115-4cce27dabbb2"),
unreadMessagesCount: 0,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-15 19:12:26 +0000,
lastReadMessageId: Optional("93dd2b8f-289d-40a8-bc23-87216599bdce"),
unreadMessagesCount: 63,
user: StreamChat.ChatUser
),
StreamChat.ChatChannelRead(
lastReadAt: 2024-03-23 18:54:42 +0000,
lastReadMessageId: Optional("e10af15c-81d5-41aa-80bc-773e9642a94f"),
unreadMessagesCount: 0,
user: StreamChat.ChatUser
)
],
__muteDetails: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.MuteDetails>>,
cooldownDuration: 0,
extraData: ["disabled": StreamChat.RawJSON.bool(false)],
__previewMessage: StreamChat.CoreDataLazy<Swift.Optional<StreamChat.ChatMessage>>
)
| Controller: StreamChat.ChatChannelController
2024-03-24 02:54:45.385 SiteCapture[2920:d30b]
from stream-chat-swift.
Hi @nuno-vieira , after some debugging, I found out the reason of the delayed "seen" is this delayed markRead from chatChannelVC
.
open func channelController(
_ channelController: ChatChannelController,
didUpdateMessages changes: [ListChange<ChatMessage>]
) {
messageListVC.setPreviousMessagesSnapshot(messages)
messageListVC.setNewMessagesSnapshot(channelController.messages)
messageListVC.updateMessages(with: changes) { [weak self] in
guard let self = self else { return }
if let unreadCount = channelController.channel?.unreadCount.messages, channelController.firstUnreadMessageId == nil && unreadCount == 0 {
self.hasSeenFirstUnreadMessage = true
}
self.updateJumpToUnreadRelatedComponents()
if self.shouldMarkChannelRead {
self.throttler.execute {
self.markRead()
}
} else if !self.hasSeenFirstUnreadMessage {
self.updateUnreadMessagesBannerRelatedComponents()
}
}
viewPaginationHandler.updateElementsCount(with: channelController.messages.count)
}
Is there a way to somehow override this function to remove the call to self.markRead()
, or the throttler
to make it a second? Removing the markRead()
resolves my problem - only by unlocking the Pod.
from stream-chat-swift.
Hello @glennposadas!
The Throttler should actually be public so that you can customize it. We need to change this, indeed. Another thing that does not look right is that the default value for the Throttler is 3 seconds, which is very high. We also need to change this.
We will make this change as soon as possible, and we will let you know once that is fixed.
Just one more question, the problem in your case is that markRead()
is performed even after you left the ChatChannelVC
?
from stream-chat-swift.
Okay, great! Yes, it still gets triggered even after leaving the chat screen.
from stream-chat-swift.
Thanks, @nuno-vieira . May I suggest improving the implementation of ChatChannelControllerDelegate
's didUpdateMessages
in ChatChannelVC
?
It is open
, however, there are properties that are internal
functions called. I could've removed the line self.markRead()
.
from stream-chat-swift.
Hi @glennposadas,
At the moment, we don't want to make that public because we want to be careful about how markRead()
is called so that it does not overload our servers.
The current solution we have in mind is to cancel the debouncer whenever we leave the Channel. In this case, it should fix the problem since we guarantee the markRead()
is not executed after leaving the channel.
We just need to prioritise this issue, and once we start working on it, we will let you know 👍
Best,
Nuno
from stream-chat-swift.
Hi @nuno-vieira Just wondering if we have any updates on this? Thanks a lot!
from stream-chat-swift.
Hi @glennposadas, we have been busy with a lot of stuff, so we did not have the opportunity to work on this.
We should be able to pick up this one soon. I'll let you know once we do it 👍
Best,
Nuno
from stream-chat-swift.
Hi @glennposadas!
Just to let you know we already have an open PR to fix this 👍
Best,
Nuno
from stream-chat-swift.
Hi @glennposadas!
This is now available on the latest release 👍
Best,
Nuno
from stream-chat-swift.
Thank you @nuno-vieira and your team for your hard work.
from stream-chat-swift.
Hi @nuno-vieira . I still experience this same issue.
Do I open a new ticket?
I've checked your fix here:
https://github.com/GetStream/stream-chat-swift/pull/3193/files
Throttle isn't still overridable. Sometimes, when exiting the chat screen, the value of delay
is 3
instead of 0
which causes random delay.
func execute(_ action: @escaping () -> Void) {
workItem?.cancel()
let workItem = DispatchWorkItem { [weak self] in
guard let workItem = self?.workItem, !workItem.isCancelled else { return }
action()
self?.previousRun = Date()
self?.workItem = nil
}
self.workItem = workItem
let timeSinceLastRun = Date().timeIntervalSince(previousRun)
let delay = timeSinceLastRun > interval ? 0 : interval
// If the delay is 0, we always execute the action immediately.
// If the delay is bigger than 0, we only execute it if `latest` was enabled.
if delay == 0 || delay > 0 && broadcastLatestEvent {
print("----- delay ---> \(delay)")
queue.asyncAfter(deadline: .now() + delay, execute: workItem)
}
}
I'm wondering if Throttling is the right approach for this 'preventing spamming of markRead()`, or Debouncing should be better.
from stream-chat-swift.
Hi @glennposadas!
Even with Throttling, cancelling the throttler should cancel the delayed request 🤔
One thing that looks suspicious is that, you say that when you leave the channel the didUpdateMessages
delegate is called, how is that possible? Shouldn't your custom ChatChannelVC view be destroyed at this point? Do you have a reference for ChatChannelVC? The throttler will only be canceled if the viewWillDisappear
is triggered.
from stream-chat-swift.
Hi @nuno-vieira I just wanna say that while I've resolved the retain-cycle issue on my end (Adding callback to the tapping of chat title), the 3-second long throttle still causes me the same issue.
Example: The ChatChannelVC
a second after its deinit, the callback from the throttle still happens.
from stream-chat-swift.
@glennposadas Maybe you are overriding the viewWillDisappear? Can you verify that the throttler is cancelled? Can you share some logs or video?
from stream-chat-swift.
Related Issues (20)
- Token provider keeps retrying after calling disconnect HOT 5
- Passing an Invalid Token during connection triggers an infinity loop. HOT 3
- Unable to receive push Notifications: error "DeviceTokenNotForTopic" HOT 2
- Missing super.init in AsyncOperation HOT 2
- Error "'shared' is unavailable in application extensions for iOS..." when using UNNotificationServiceExtension HOT 1
- App crash on creating a new 1:1 chat, found nil when unwrapping optional in ListDataBaseObserver HOT 26
- Composer text input not resizing correctly HOT 6
- Message author miscomputed after user id change during the same session HOT 3
- Upload Image to GetStream CDN HOT 1
- See Original and Translated Message HOT 6
- Message Search Not Working HOT 11
- Custom subview of ChatMessageContentView is not sized correctly HOT 5
- TokenProvider not triggering refresh and causing infinite API calls HOT 5
- Is it possible for me to query a channel to direct message only? HOT 1
- Test
- Mute intervals for channels doesn't seem to work HOT 4
- Extra Data not able to search using contain key it alway give blank response (UserListFilterScope) HOT 2
- Message Search Not Working HOT 1
- Search Channel By User Name HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from stream-chat-swift.