Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions .github/workflows/sdk-size-metrics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ jobs:
runs-on: macos-15
env:
GITHUB_TOKEN: '${{ secrets.CI_BOT_GITHUB_TOKEN }}'
GITHUB_PR_NUM: ${{ github.event.pull_request.number }}
steps:
- name: Connect Bot
uses: webfactory/[email protected]
Expand All @@ -28,10 +29,13 @@ jobs:

- uses: ./.github/actions/bootstrap

- name: Run SDK Size Metrics
- name: Run General SDK Size Metrics
run: bundle exec fastlane show_frameworks_sizes
timeout-minutes: 30
env:
GITHUB_PR_NUM: ${{ github.event.pull_request.number }}
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}

- name: Run Detailed SDK Size Metrics
run: bundle exec fastlane size_analyze
timeout-minutes: 30
4 changes: 2 additions & 2 deletions .github/workflows/sync-mock-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ name: Mock Server

on:
schedule:
# Runs "At 00:00 on day-of-month 1 and 15"
- cron: '0 0 1,15 * *'
# Runs "At 00:00 on day-of-month 1"
- cron: '0 0 1 * *'

workflow_dispatch:

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ App Thinning Size Report.txt
app-thinning.plist
*.dmg
*.pkg*
*LinkMap.txt

# gcloud
google-cloud-sdk
Expand Down
5 changes: 2 additions & 3 deletions .swiftformat
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
--rules fileHeader
--rules indent
--rules initCoderUnavailable
--rules isEmpty
--rules leadingDelimiters
--rules linebreakAtEndOfFile
--rules linebreaks
Expand All @@ -35,7 +34,7 @@
--rules redundantRawValues
--rules redundantVoidReturnType
--rules semicolons
--rules sortedImports
--rules sortImports
--rules spaceAroundBraces
--rules spaceAroundBrackets
--rules spaceAroundComments
Expand Down Expand Up @@ -81,4 +80,4 @@
--wrapcollections before-first

# Exclude paths
--exclude **/Generated,Sources/StreamChatUI/StreamNuke,Sources/StreamChatUI/StreamSwiftyGif,Sources/StreamChatUI/StreamDifferenceKit
--exclude **/Generated,Sources/StreamChatUI/StreamNuke,Sources/StreamChatUI/StreamSwiftyGif,Sources/StreamChatUI/StreamDifferenceKit,vendor/bundle,Pods,spm_cache,derived_data,.build
9 changes: 0 additions & 9 deletions .swiftlint.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
excluded:
- Scripts
- Package.swift
- Dependencies
- Sources/StreamChatUI/Generated
- Sources/StreamChatUI/StreamSwiftyGif
- Sources/StreamChatUI/StreamNuke
- Sources/StreamChat/StreamStarscream
- Sources/StreamChatUI/StreamDifferenceKit
- vendor
- UISDKdocumentation
- Tests
- TestTools
- Pods
- .build
- spm_cache
- vendor/bundle
- .ruby-lsp
- derived_data

only_rules:
Expand Down Expand Up @@ -56,7 +51,6 @@ only_rules:
- trailing_comma
- trailing_newline
- trailing_semicolon
- trailing_whitespace
- unneeded_break_in_switch
- unneeded_override
- unused_closure_parameter
Expand All @@ -68,9 +62,6 @@ only_rules:
multiline_arguments:
only_enforce_after_first_closure_on_first_line: true

trailing_whitespace:
ignores_empty_lines: true

file_name_no_space:
severity: error

Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### 🔄 Changed

# [4.91.0](https://github.com/GetStream/stream-chat-swift/releases/tag/4.91.0)
_October 22, 2025_

## StreamChat
### ✅ Added
- Add support for deleting messages only for the current user [#3836](https://github.com/GetStream/stream-chat-swift/pull/3836)
- Add `ChatMessageController.deleteMessageForMe()`
- Add `ChatMessage.deletedForMe`
- Allow observing poll changes in `PollVoteListController` [#3849](https://github.com/GetStream/stream-chat-swift/pull/3849)
### 🐞 Fixed
- Fix logout not clearing token when current user had no device registered [#3838](https://github.com/GetStream/stream-chat-swift/pull/3838)
- Fix `PollVoteListController` not updating votes on the vote cast event [#3849](https://github.com/GetStream/stream-chat-swift/pull/3849)
- Fix showing channel when receiving a campaign message with `show_channels` false [#3851](https://github.com/GetStream/stream-chat-swift/pull/3851)

## StreamChatUI
### 🐞 Fixed
- Fix `PollResultsVoteListVC` not updating the vote count [#3849](https://github.com/GetStream/stream-chat-swift/pull/3849)

# [4.90.0](https://github.com/GetStream/stream-chat-swift/releases/tag/4.90.0)
_October 07, 2025_

Expand Down
32 changes: 32 additions & 0 deletions DemoApp/StreamChat/Components/DemoChatMessageActionsVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ final class DemoChatMessageActionsVC: ChatMessageActionsVC {
if message?.isSentByCurrentUser == true {
if AppConfig.shared.demoAppConfig.isHardDeleteEnabled {
actions.append(hardDeleteActionItem())
actions.append(deleteForMeActionItem())
}
}

Expand Down Expand Up @@ -108,6 +109,22 @@ final class DemoChatMessageActionsVC: ChatMessageActionsVC {
)
}

func deleteForMeActionItem() -> ChatMessageActionItem {
DeleteForMeActionItem(
action: { [weak self] _ in
guard let self = self else { return }
self.alertsRouter.showMessageDeletionConfirmationAlert { confirmed in
guard confirmed else { return }

self.messageController.deleteMessageForMe { _ in
self.delegate?.chatMessageActionsVCDidFinish(self)
}
}
},
appearance: appearance
)
}

func translateActionItem() -> ChatMessageActionItem {
TranslateActionitem(
action: { [weak self] _ in
Expand Down Expand Up @@ -224,6 +241,21 @@ final class DemoChatMessageActionsVC: ChatMessageActionsVC {
}
}

struct DeleteForMeActionItem: ChatMessageActionItem {
var title: String { "Delete only for me" }
var isDestructive: Bool { true }
let icon: UIImage
let action: (ChatMessageActionItem) -> Void

init(
action: @escaping (ChatMessageActionItem) -> Void,
appearance: Appearance = .default
) {
self.action = action
icon = appearance.images.messageActionDelete
}
}

struct TranslateActionitem: ChatMessageActionItem {
var title: String { "Translate to Turkish" }
var isDestructive: Bool { false }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ final class DemoChatMessageContentView: ChatMessageContentView {
timestampLabel?.text?.append(" - Translated to Turkish")
}

if content?.deletedForMe == true {
timestampLabel?.text?.append(" - Deleted only for me")
}

if content?.isPinned == true, let pinInfoLabel = pinInfoLabel {
pinInfoLabel.text = "📌 Pinned"
if let pinDetails = content?.pinDetails {
Expand Down
9 changes: 1 addition & 8 deletions DemoShare/DemoShareView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import StreamChatUI
import SwiftUI

struct DemoShareView: View {

@StateObject var viewModel: DemoShareViewModel

init(
Expand Down Expand Up @@ -42,7 +41,7 @@ struct DemoShareView: View {
.padding(.vertical)

HStack {
if viewModel.channels.count == 0 {
if viewModel.channels.isEmpty {
ProgressView()
} else {
Text("Select a channel")
Expand All @@ -61,7 +60,6 @@ struct DemoShareView: View {
}

struct TopView: View {

@ObservedObject var viewModel: DemoShareViewModel

var body: some View {
Expand Down Expand Up @@ -89,7 +87,6 @@ struct TopView: View {
}
})
.disabled(viewModel.selectedChannel == nil)

}
.padding(.vertical, 8)
.padding(.horizontal, 16)
Expand All @@ -102,7 +99,6 @@ struct TopView: View {
}

struct ImageToShareView: View {

private let imageHeight: CGFloat = 180

var image: UIImage
Expand All @@ -115,11 +111,9 @@ struct ImageToShareView: View {
.frame(height: imageHeight)
.cornerRadius(8)
}

}

struct ShareChannelsView: View {

@ObservedObject var viewModel: DemoShareViewModel

var body: some View {
Expand Down Expand Up @@ -149,7 +143,6 @@ struct ShareChannelsView: View {
}
}
}

}

extension ChatChannel: Identifiable {
Expand Down
5 changes: 2 additions & 3 deletions DemoShare/DemoShareViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@

import Combine
import CoreServices
import UIKit
import StreamChat
import Social
import StreamChat
import UIKit

@MainActor
class DemoShareViewModel: ObservableObject, ChatChannelControllerDelegate {

private let chatClient: ChatClient
private let userCredentials: UserCredentials
private var channelListController: ChatChannelListController?
Expand Down
5 changes: 2 additions & 3 deletions DemoShare/ShareViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
// Copyright © 2025 Stream.io Inc. All rights reserved.
//

import UIKit
import CoreServices
import Social
import StreamChat
import SwiftUI
import CoreServices
import UIKit

class ShareViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

Expand Down
7 changes: 1 addition & 6 deletions Examples/EdgeCases/ViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,4 @@

import UIKit

class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
class ViewController: UIViewController {}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ final class YTChatComposerViewController: ComposerVC {
preferredStyle: .actionSheet
)
["😃", "😇", "😅", "😂"].forEach { emoji in

let action = UIAlertAction(title: emoji, style: .default) { _ in
let inputTextView = self.composerView.inputMessageView.textView
inputTextView.replaceSelectedText(emoji)
Expand Down
1 change: 0 additions & 1 deletion Examples/iMessageClone/iMessageComposerVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ final class iMessageComposerVC: ComposerVC {
)

["😃", "😇", "😅", "😂"].forEach { emoji in

let action = UIAlertAction(title: emoji, style: .default) { _ in
let inputTextView = self.composerView.inputMessageView.textView
inputTextView.replaceSelectedText(emoji)
Expand Down
19 changes: 12 additions & 7 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,11 @@ GEM
fastlane
pry
fastlane-plugin-sonarcloud_metric_kit (0.2.1)
fastlane-plugin-stream_actions (0.3.90)
fastlane-plugin-stream_actions (0.3.101)
xctest_list (= 1.2.1)
fastlane-plugin-versioning (0.7.1)
fastlane-plugin-xcsize (1.1.0)
xcsize (= 1.1.0)
fastlane-sirp (1.0.0)
sysrandom (~> 1.0)
faye-websocket (0.12.0)
Expand Down Expand Up @@ -287,7 +289,7 @@ GEM
molinillo (0.8.0)
multi_json (1.17.0)
multipart-post (2.4.1)
mustermann (3.0.3)
mustermann (3.0.4)
ruby2_keywords (~> 0.0.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
Expand Down Expand Up @@ -322,8 +324,8 @@ GEM
puma (6.6.1)
nio4r (~> 2.0)
racc (1.8.1)
rack (3.2.0)
rack-protection (4.1.1)
rack (3.2.3)
rack-protection (4.2.0)
base64 (>= 0.1.0)
logger (>= 1.6.0)
rack (>= 3.0.0, < 4)
Expand Down Expand Up @@ -378,11 +380,11 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
sinatra (4.1.1)
sinatra (4.2.0)
logger (>= 1.6.0)
mustermann (~> 3.0)
rack (>= 3.0.0, < 4)
rack-protection (= 4.1.1)
rack-protection (= 4.2.0)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
slather (2.8.5)
Expand Down Expand Up @@ -431,6 +433,8 @@ GEM
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
xcsize (1.1.0)
commander (>= 4.6, < 6.0)
xctest_list (1.2.1)

PLATFORMS
Expand All @@ -445,8 +449,9 @@ DEPENDENCIES
fastlane-plugin-create_xcframework
fastlane-plugin-lizard
fastlane-plugin-sonarcloud_metric_kit
fastlane-plugin-stream_actions (= 0.3.90)
fastlane-plugin-stream_actions (= 0.3.101)
fastlane-plugin-versioning
fastlane-plugin-xcsize (= 1.1.0)
faye-websocket
json
lefthook
Expand Down
Loading
Loading