- Default
UITableView.loadingCell
changed:- from
func loadingCell(at indexPath: IndexPath) -> UITableViewCell
- to
func loadingCell(at indexPath: IndexPath, textColor: UIColor) -> UITableViewCell
- from
- Default
UITableView.statusCell
changed:- from
func statusCell(... subtitle: String? = nil, highlighted: Bool) -> UITableViewCell
- to
func statusCell(... subtitle: String? = nil, textColor: UIColor) -> UITableViewCell
- from
- Banner animation without bouncing.
- Customization for message actions.
- Added
Event.reactionUpdated
. - Opened
MessageTableViewCell
. - Opened
ChannelTableViewCell
. - More customization for a message and channel cells.
- Added
AvatarViewStyle
- Added
SeparatorStyle
- Added
Spacing
- Added
ChannelTableViewCell.VerticalTextAlignment
MessageTableViewCell.avatarViewStyle: AvatarViewStyle?
MessageTableViewCell.spacing: Spacing
MessageTableViewCell.edgeInsets: UIEdgeInsets
ChannelTableViewCell.avatarViewStyle: AvatarViewStyle?
ChannelTableViewCell.separatorStyle: SeparatorStyle
ChannelTableViewCell.nameNumberOfLines: Int
ChannelTableViewCell.messageNumberOfLines: Int
ChannelTableViewCell.height: CGFloat
ChannelTableViewCell.spacing: Spacing
ChannelTableViewCell.edgeInsets: UIEdgeInsets
ChannelTableViewCell.verticalTextAlignment: VerticalTextAlignment
- Added
- Added a customization for message actions.
- Example app for a memory leak.
- Keyboard events replays.
- Handling keyboard notifications for ChatViewController in rx way.
- Scroll the table view to the bottom safely.
- Fixed a crash when the token was expired.
- Fixed
StatusTableViewCell
layout.
December 16th, 2019
- The order of parameters in
Message.init
- Removed members from
ChannelResponse
. Now it's only inside the channel of the response.
- Improved Token validation.
- Public
Attachment.init(...)
. - Public
Reaction.init(...)
. - Public
Reaction(counts: [ReactionType: Int])
. - Public
User.unknown
. - Example app with Cocoapods.
- Example app with Carthage.
- A new authorization in the Example app.
✈️ Offline mode insideInternetConnection
.- Improved connection flow.
- Extension
Data.hex
. - Extension
String.md5
,String.url?
. Filter.description
.Sorting.description
.- A variable
JSONDecoder.default
. Now you can change the default JSON decoder. - Variables
JSONEncoder.default
andJSONEncoder.defaultGzip
. Now you can change default JSON encoders. - A channel for a direct messages will use a member avatar as default channel image by default.
- Docs for the
ClientLogger
. - Hide a channel with clearing messages history.
- Added a new event
Event.channelHidden(HiddenChannelResponse, EventType)
.
- ComposerView position related to the keyboard with an opaque
UITabBar
. - A proper way to check if members are empty.
November 27th, 2019
Fix tap on a link with disabled reactions.
November 27th, 2019
Client.channel(query: ChannelQuery)
ComposerView
and keyboard events crashes.ComposerView
position for embeddedChatViewController
.- Parse now can properly ignore bad channel name.
November 26th, 2019
- Layout
ComposerView
depends on keyboard events.
- Token update.
November 23th, 2019
-
Added levels for
ClientLogger
. -
Error Level:
-
ClientLogger.Options.requestsError
-
ClientLogger.Options.webSocketError
-
ClientLogger.Options.notificationsError
-
ClientLogger.Options.error
— all errors -
Debug Level:
-
ClientLogger.Options.requests
-
ClientLogger.Options.webSocket
-
ClientLogger.Options.notifications
-
ClientLogger.Options.debug
— all debug -
Info Level:
-
ClientLogger.Options.requestsInfo
-
ClientLogger.Options.webSocketInfo
-
ClientLogger.Options.notificationsInfo
-
ClientLogger.Options.info
— all info -
MessageViewStyle.showTimeThreshold
to show additional time for messages from the same user at different times.
AdditionalDateStyle.messageAndDate
. . . AdditionalDateStyle.userNameAndDate
-
Optimized MessageTableViewCell rendering.
-
Channel name. If it's empty:
-
for 2 members: the 2nd member name
-
for more than 2 members: member name + N others.
-
channel
id
. -
Channel.isDirectMessage
— checks if only 2 members in the channel and the channel name was generated. -
Improved work with
ExtraData
. -
A custom
ChannelType.custom(String)
- Removed a
channelType
parameter inChannelsPresenter.init
. - Renamed
ExtraData.data
->ExtraData.object
Channel.currentUnreadCount
update.
- Detecting and highlighting URL's in messages.
- Skip empty messages.
ChatFooterView
with a white circle.- A user avatar missing.
November 14th, 2019
Fixed DataDetector.
November 14th, 2019
- The current user mentioned unread count
// The current unread count.
let count: Int = channel.currentMentionedUnreadCount
// An observable unread count.
channel.mentionedUnreadCount
.drive(onNext: { count in
print(count)
})
.disposed(by: disposeBag)
- Map an observable value to void.
.void()
November 12th, 2019
- A custom data for
User
. - Detect links in messages and open them in WebView.
November 11th, 2019
Fixed ComposerView for a keyboard position with different orientations and opaque Tabbar.
November 8th, 2019
Channel.currentUnreadCount
value to show the number in table view.- Get a message by id:
Client.message(with messageId: String)
- Mark all messages as reader:
Client.markAllRead()
User.isInvisible
- Flag/unflag users:
Client.flag(user: User)
oruser.flag()
. - Ban user:
Chanel.ban(user: User, timeoutInMinutes: Int? = nil, reason: String? = nil)
. - Channel ban options:
Channel. banEnabling
:
/// Disabled for everyone.
case disabled
/// Enabled for everyone.
/// The default timeout in minutes until the ban is automatically expired.
/// The default reason the ban was created.
case enabled(timeoutInMinutes: Int?, reason: String?)
/// Enabled for channel members with a role of moderator or admin.
/// The default timeout in minutes until the ban is automatically expired.
/// The default reason the ban was created.
case enabledForModerators(timeoutInMinutes: Int?, reason: String?)
- Event
userBanned
- Debug info when API key is empty.
- More logs for Notifications errors.
ChannelPresenter. messageRead
for the current user.- Client API key property is public and mutable for development in different environments. Not recommended for production.
- Hiding the keyboard on landscape mode to add attachments.
- Message search.
- New flow to invite members to a channel:
// 1. Invite members with a creating of a new channel
let channel = Channel(type: .messaging,
id: "awesome-chat",
members: [tomasso, thierry]
invitedMembers: [nick])
channel.create().subscribe().disposed(by: disposeBag)
// 2. Invite user(s) to an existing channel.
channel.invite(nick).subscribe().disposed(by: disposeBag)
ChannelsQuery
:.messageLimit
→.messagesLimit
.User
:.online
→.isOnline
.
ClientLogger
updatedAtomic
from:
typealias DidSetCallback = (T?) -> Void
to:
typealias DidSetCallback = (_ value: T?, _ oldValue: T?) -> Void
Channel.watch(options: QueryOptions = [])
with query options.
BannerView
memory leak.- A bug with the composer attachment button, when a channel config wasn't loaded.
- ComposerView position with opaque Tabbar.
- Reconnection after sleep for 10+ minutes.
- Popup menu for iPad.
- ReactionsView for iPhone in landscape orientation.
- ComposerView bottom constraint when iPhone on the landscape orientation.
October 24th, 2019
- Added events filter in presenters.
October 22th, 2019
- Update a channel data:
update(name: String? = nil, imageURL: URL? = nil, extraData: Codable? = nil)
Channel.watch()
October 21th, 2019
- Response errors
- A crash of a date formatter for iOS 11.1 and below.
October 21th, 2019
ChannelId
type (id: String
+type: ChannelType
).- Added
Channel.add(members:)
,Channel.remove(members:)
. ChannelsViewController
will update the table view with only invalidated rows or reload completely.ChannelPresenter.channelDidUpdate
observable (for example to get updated members).ChannelsViewController
UI warnings. It tries to update itself when it's not in the hierarchy view.
- Changed
Client.userDidUpdate
asDriver
.