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: 4 additions & 4 deletions .github/workflows/cron-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ jobs:
setup_runtime: false
- ios: 17.5
xcode: 15.4
os: macos-15
os: macos-14
device: "iPhone 15 Pro"
setup_runtime: false
- ios: 16.4
Expand Down Expand Up @@ -101,7 +101,7 @@ jobs:
setup_runtime: false
- ios: 17.5
xcode: 15.4
os: macos-15
os: macos-14
device: "iPhone 15 Pro"
setup_runtime: false
- ios: 16.4
Expand Down Expand Up @@ -148,7 +148,7 @@ jobs:

build-old-xcode:
name: Build LLC + UI (Xcode 15)
runs-on: macos-15
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
steps:
Expand All @@ -175,7 +175,7 @@ jobs:

automated-code-review:
name: Automated Code Review
runs-on: macos-15
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
steps:
Expand Down
32 changes: 32 additions & 0 deletions .github/workflows/merge-main-to-develop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: "Merge main to develop"

on:
workflow_dispatch:

permissions:
contents: write

jobs:
merge:
name: Merge
runs-on: ubuntu-latest
steps:
- uses: actions/[email protected]
with:
token: ${{ secrets.ADMIN_API_TOKEN }}
fetch-depth: 0

- uses: ./.github/actions/ruby-cache

- run: bundle exec fastlane merge_main
env:
GITHUB_TOKEN: ${{ secrets.ADMIN_API_TOKEN }}

- uses: 8398a7/action-slack@v3
if: failure()
with:
status: ${{ job.status }}
text: "⚠️ <!subteam^S030AAHLDLN>, the merge of `main` to `develop` failed on CI. Consider using this command locally: `bundle exec fastlane merge_main`"
fields: repo,commit,author,workflow
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
8 changes: 0 additions & 8 deletions .github/workflows/release-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,3 @@ jobs:
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
run: bundle exec fastlane publish_release --verbose

- uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
text: "🎉 The new release has been shipped! 🚢\n\n⚠️ <!subteam^S030AAHLDLN>, don't forget to merge `main` back to `develop` from `localhost` using the command: `bundle exec fastlane merge_main`"
fields: repo
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
6 changes: 3 additions & 3 deletions .github/workflows/smoke-checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ jobs:

automated-code-review:
name: Automated Code Review
runs-on: macos-15
runs-on: macos-14
env:
XCODE_VERSION: "15.4"
if: ${{ github.event.inputs.record_snapshots != 'true' }}
Expand All @@ -56,7 +56,7 @@ jobs:
fetch-depth: 100
- uses: ./.github/actions/bootstrap
- name: Run Danger
run: bundle exec danger
run: bundle exec fastlane lint_pr
- name: Run Fastlane Linting
run: bundle exec fastlane rubocop
- name: Run SwiftFormat Linting
Expand All @@ -67,7 +67,7 @@ jobs:

build-old-xcode:
name: Build LLC + UI (Xcode 15)
runs-on: macos-15
runs-on: macos-14
if: ${{ github.event.inputs.record_snapshots != 'true' }}
env:
XCODE_VERSION: "15.4"
Expand Down
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

### 🔄 Changed

# [4.80.0](https://github.com/GetStream/stream-chat-swift/releases/tag/4.80.0)
_June 17, 2025_

## StreamChat
### ✅ Added
- Add new `Filter.isNil` to make it easier to query by nil values [#3623](https://github.com/GetStream/stream-chat-swift/pull/3623)
- Add Message Reminders [#3623](https://github.com/GetStream/stream-chat-swift/pull/3623)
- Add `ChatMessageController.createReminder()`
- Add `ChatMessageController.updateReminder()`
- Add `ChatMessageController.deleteReminder()`
- Add `MessageReminderListController` and `MessageReminderListQuery`

# [4.79.1](https://github.com/GetStream/stream-chat-swift/releases/tag/4.79.1)
_June 03, 2025_

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ struct DemoAppConfig {
var shouldShowConnectionBanner: Bool
/// A Boolean value to define if the premium member feature is enabled. This is to test custom member data.
var isPremiumMemberFeatureEnabled: Bool
/// A Boolean value to define if the reminders feature is enabled.
var isRemindersEnabled: Bool
/// A Boolean value to define if the poll should be deleted when the message is deleted.
var shouldDeletePollOnMessageDeletion: Bool

Expand Down Expand Up @@ -53,6 +55,7 @@ class AppConfig {
tokenRefreshDetails: nil,
shouldShowConnectionBanner: false,
isPremiumMemberFeatureEnabled: false,
isRemindersEnabled: true,
shouldDeletePollOnMessageDeletion: false
)

Expand All @@ -64,6 +67,7 @@ class AppConfig {
demoAppConfig.isHardDeleteEnabled = true
demoAppConfig.shouldShowConnectionBanner = true
demoAppConfig.isPremiumMemberFeatureEnabled = true
demoAppConfig.isRemindersEnabled = true
demoAppConfig.shouldDeletePollOnMessageDeletion = true
StreamRuntimeCheck.assertionsEnabled = true
}
Expand Down Expand Up @@ -177,6 +181,7 @@ class AppConfigViewController: UITableViewController {
case tokenRefreshDetails
case shouldShowConnectionBanner
case isPremiumMemberFeatureEnabled
case isRemindersEnabled
}

enum ComponentsConfigOption: String, CaseIterable {
Expand Down Expand Up @@ -342,6 +347,10 @@ class AppConfigViewController: UITableViewController {
cell.accessoryView = makeSwitchButton(demoAppConfig.isPremiumMemberFeatureEnabled) { [weak self] newValue in
self?.demoAppConfig.isPremiumMemberFeatureEnabled = newValue
}
case .isRemindersEnabled:
cell.accessoryView = makeSwitchButton(demoAppConfig.isRemindersEnabled) { [weak self] newValue in
self?.demoAppConfig.isRemindersEnabled = newValue
}
}
}

Expand Down Expand Up @@ -739,6 +748,9 @@ class AppConfigViewController: UITableViewController {
guard let selectedOption = options.first else { return }
apiKeyString = selectedOption.rawValue
StreamChatWrapper.replaceSharedInstance(apiKeyString: apiKeyString)
if let baseURL = selectedOption.customBaseURL {
self?.chatClientConfig.baseURL = .init(url: baseURL)
}
self?.tableView.reloadData()
}

Expand Down
43 changes: 39 additions & 4 deletions DemoApp/Screens/DemoAppTabBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,31 @@ import StreamChat
import StreamChatUI
import UIKit

class DemoAppTabBarController: UITabBarController, CurrentChatUserControllerDelegate {
class DemoAppTabBarController: UITabBarController, CurrentChatUserControllerDelegate, MessageReminderListControllerDelegate {
let channelListVC: UIViewController
let threadListVC: UIViewController
let draftListVC: UIViewController
let reminderListVC: UIViewController
let currentUserController: CurrentChatUserController
let allRemindersListController: MessageReminderListController

// Events controller for listening to chat events
private var eventsController: EventsController!

init(
channelListVC: UIViewController,
threadListVC: UIViewController,
draftListVC: UIViewController,
currentUserController: CurrentChatUserController
reminderListVC: UIViewController,
currentUserController: CurrentChatUserController,
allRemindersListController: MessageReminderListController
) {
self.channelListVC = channelListVC
self.threadListVC = threadListVC
self.draftListVC = draftListVC
self.reminderListVC = reminderListVC
self.currentUserController = currentUserController
self.allRemindersListController = allRemindersListController
super.init(nibName: nil, bundle: nil)
}

Expand Down Expand Up @@ -52,6 +61,12 @@ class DemoAppTabBarController: UITabBarController, CurrentChatUserControllerDele
currentUserController.delegate = self
unreadCount = currentUserController.unreadCount

// Update reminders badge if the feature is enabled.
if AppConfig.shared.demoAppConfig.isRemindersEnabled {
allRemindersListController.delegate = self
updateRemindersBadge()
}

tabBar.backgroundColor = Appearance.default.colorPalette.background
tabBar.isTranslucent = true

Expand All @@ -65,14 +80,34 @@ class DemoAppTabBarController: UITabBarController, CurrentChatUserControllerDele

draftListVC.tabBarItem.title = "Drafts"
draftListVC.tabBarItem.image = UIImage(systemName: "bubble.and.pencil")

reminderListVC.tabBarItem.title = "Reminders"
reminderListVC.tabBarItem.image = UIImage(systemName: "bell")

viewControllers = [channelListVC, threadListVC, draftListVC]
// Only show reminders tab if the feature is enabled
if AppConfig.shared.demoAppConfig.isRemindersEnabled {
viewControllers = [channelListVC, threadListVC, draftListVC, reminderListVC]
} else {
viewControllers = [channelListVC, threadListVC, draftListVC]
}
}

func currentUserController(_ controller: CurrentChatUserController, didChangeCurrentUserUnreadCount: UnreadCount) {
let unreadCount = didChangeCurrentUserUnreadCount
self.unreadCount = unreadCount
let totalUnreadBadge = unreadCount.channels + unreadCount.threads
UIApplication.shared.applicationIconBadgeNumber = totalUnreadBadge
}

func controller(
_ controller: MessageReminderListController,
didChangeReminders changes: [ListChange<MessageReminder>]
) {
updateRemindersBadge()
}

private func updateRemindersBadge() {
let reminders = allRemindersListController.reminders
reminderListVC.tabBarItem.badgeValue = reminders.isEmpty ? nil : "\(reminders.count)"
}
}
Loading
Loading