Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
e8b99ba
Fixed blank space issue in chat screen.
ios-wingman Feb 11, 2026
220c348
Removed wallet related code and pod updated
ios-wingman Feb 11, 2026
4429726
Fixed issues in View controllers
ios-wingman Feb 11, 2026
3c71e77
Fixed issue where the replied message card UI was blank
acegreen1 Feb 12, 2026
eaef05d
Fixed replied message card highlight issue
acegreen1 Feb 12, 2026
ef003ae
Special characters are not allowed in the display name.
ios-wingman Feb 13, 2026
88e94d3
Fixed the issue with the copy button being hidden in the chat input box.
ios-wingman Feb 13, 2026
9f38955
Fixed the long-press issue that occurs when a message is loading
acegreen1 Feb 13, 2026
6e0c2e7
Fixed toast message display issue
acegreen1 Feb 13, 2026
7282f88
Fixed contact info screen issues
acegreen1 Feb 13, 2026
69f541f
Restricted special characters in display name (Create Secret Group & …
ios-wingman Feb 13, 2026
83fcf77
Code refactor: Pin view
ios-wingman Feb 16, 2026
142f38f
Disabled auto navigation in the pin view
ios-wingman Feb 16, 2026
28f3c88
Fix: Allow spaces in Display Name and Secret Group fields
ios-wingman Feb 18, 2026
e1b2634
Fix scanning screen stuck issue
acegreen1 Feb 18, 2026
f8173ab
Merge pull request #164 from Beldex-Coin/qr-scanner-freeze
ios-wingman Feb 18, 2026
7dc0b26
Fix UI glitch where action icons appear after unpin/archive
ios-wingman Feb 18, 2026
9360373
Fix duplicate chat appearing after swipe actions
acegreen1 Feb 18, 2026
7d871ca
Fix play, pause, and mute button tap issues on video screen
ios-wingman Feb 19, 2026
1e4806b
Fix: UI overlap and spacing issues on chat screen
ios-wingman Feb 23, 2026
4d6308b
Fixed Xcode26 build issues
acegreen1 Feb 25, 2026
ed1060b
Fix: Disabled liquid glass UI in Info.plist
ios-wingman Feb 25, 2026
3b86dda
Merge pull request #165 from Beldex-Coin/xcode26-fixes
ios-wingman Feb 25, 2026
9551863
Fix: chat screen pan swipe navigating to home
ios-wingman Feb 27, 2026
fc053e5
Fix chat screen UI issues: last message hidden & attachment icons ove…
ios-wingman Feb 27, 2026
32b3e9b
Fix: Chat items not ordered by last received message time after seed …
acegreen1 Feb 27, 2026
0ddfa28
Merge pull request #166 from Beldex-Coin/bugfix-thread-sorting
ios-wingman Feb 27, 2026
57fc983
Fix: Change log updated and minor bug fixes on Video & Home screens
ios-wingman Mar 3, 2026
e6c07ce
Fix: forward icon UI mismatch between light and dark themes on Video …
ios-wingman Mar 4, 2026
caa6740
Fix: Audio recording UI issues on chat screen
ios-wingman Mar 4, 2026
51c2b3e
Fix: Disappearing messages re-enabled after seed restore and messages…
acegreen1 Mar 5, 2026
822214a
Merge pull request #167 from Beldex-Coin/bugfix-disappearing-message
ios-wingman Mar 5, 2026
be4a717
Fix: Copy disabled for media messages & alert shown for blocked contacts
ios-wingman Mar 6, 2026
e831ca2
Fix: Search UI issue on chat screen
acegreen1 Mar 6, 2026
3cbc67c
Fix: Chat screen search bar freeze issue
acegreen1 Mar 9, 2026
6ca81c8
Merge pull request #168 from Beldex-Coin/bugfix-searchbar
ios-wingman Mar 9, 2026
a838a89
Fix: Message text box not visible after unblocking contact until chat…
acegreen1 Mar 9, 2026
42fa0d4
Merge pull request #169 from Beldex-Coin/bugfix-unblock
ios-wingman Mar 9, 2026
ee1d4ed
Fix: "Match Found" content not visible after closing keyboard in chat…
ios-wingman Mar 12, 2026
53d6929
Fix: Prevent chat auto-scroll when replying to last message
ios-wingman Mar 12, 2026
608cc5c
Fix: Search Conversation & Clear conversation history issues
ios-wingman Mar 16, 2026
f467c71
Fix: iOS 26 liquid glass effect issues
ios-wingman Mar 16, 2026
5e23433
Fix: Chat screen issues
ios-wingman Mar 19, 2026
071c8ca
Fix: show mic icon for whitespace input & remove empty UI on pending …
acegreen1 Mar 19, 2026
472c58a
Fix: Show home screen after password screen in restore flow
acegreen1 Mar 19, 2026
47208bc
Fix: Hide message requests on the Home screen when the dropdown is cl…
acegreen1 Mar 20, 2026
386e872
Merge pull request #173 from Beldex-Coin/minor-fixes
ios-wingman Mar 20, 2026
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
482 changes: 185 additions & 297 deletions BChat.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -643,7 +643,7 @@ struct Wallet
virtual int countBns() = 0;

/**
* @brief listCurrentStakes - returns a list of the wallets locked stakes, provides both service node address and the staked amount
* @brief listCurrentStakes - returns a list of the wallets locked stakes, provides both master node address and the staked amount
* @return
*/
virtual std::vector<stakeInfo>* listCurrentStakes() const = 0;
Expand Down
11 changes: 0 additions & 11 deletions BChat/Calls/CallVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1127,17 +1127,6 @@ final class CallVC: BaseVC, VideoPreviewDelegate, RTCVideoViewDelegate {
debugPrint("Unknown audio route change.")
}
}

func getProfilePicture(of size: CGFloat, for publicKey: String) -> UIImage? {
guard !publicKey.isEmpty else { return nil }
if let profilePicture = OWSProfileManager.shared().profileAvatar(forRecipientId: publicKey) {
return profilePicture
} else {
// TODO: Pass in context?
let displayName = Storage.shared.getContact(with: publicKey)?.name ?? publicKey
return Identicon.generatePlaceholderIcon(seed: publicKey, text: displayName, size: size)
}
}

@objc private func handleFullScreenVideoViewTapped() {
let isHidden = callDurationLabel.alpha < 0.5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ extension ContextMenuVC {
}
}
}
if viewItem.canCopyMedia() { result.append(Action.copy(viewItem, delegate)) }
// if viewItem.canCopyMedia() { result.append(Action.copy(viewItem, delegate)) }
if viewItem.canSaveMedia() { result.append(Action.save(viewItem, delegate)) }

// Message Detail For OutgoingMessage
Expand Down
4 changes: 4 additions & 0 deletions BChat/Conversations/Context Menu/ContextMenuVC.swift
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,10 @@ final class ContextMenuVC : UIViewController {
if thread.isBlocked() {
emojiBarView.isHidden = true
}
guard let message = viewItem.interaction as? TSOutgoingMessage else { return }
if message.messageState == .sending || message.messageState == .failed {
emojiBarView.isHidden = true
}
}
}

Expand Down
12 changes: 8 additions & 4 deletions BChat/Conversations/ConversationSearch.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,13 @@ public class ConversationSearchController : NSObject {
} else {
uiSearchController.dimsBackgroundDuringPresentation = false
}
uiSearchController.searchBar.inputAccessoryView = resultsBar
if #available(iOS 26, *) {
resultsBar.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: (UIWindow.keyWindow?.safeAreaInsets.bottom ?? 0) + 44)
uiSearchController.searchBar.inputAccessoryView = resultsBar
} else {
uiSearchController.searchBar.inputAccessoryView = resultsBar
}
uiSearchController.searchBar.reloadInputViews()
}

// MARK: Dependencies
Expand Down Expand Up @@ -141,8 +147,6 @@ public final class SearchResultsBar : UIView {
var currentIndex: Int?
weak var resultsBarDelegate: SearchResultsBarDelegate?

public override var intrinsicContentSize: CGSize { CGSize.zero }

private lazy var label: UILabel = {
let result = UILabel()
result.text = ""
Expand Down Expand Up @@ -170,7 +174,7 @@ public final class SearchResultsBar : UIView {
}()

override init(frame: CGRect) {
super.init(frame: frame)
super.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: (UIWindow.keyWindow?.safeAreaInsets.bottom ?? 0) + 44))
setUpViewHierarchy()
}

Expand Down
57 changes: 53 additions & 4 deletions BChat/Conversations/ConversationVC+Interaction.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
let settingsVC = ChatSettingsVC()
settingsVC.configure(with: thread, viewItems: viewItems, uiDatabaseConnection: OWSPrimaryStorage.shared().uiDatabaseConnection)
settingsVC.conversationSettingsViewDelegate = self
navigationController!.pushViewController(settingsVC, animated: true, completion: nil)
navigationController!.pushViewController(settingsVC, animated: true) {
self.cancelVoiceMessageRecording()
}
}

func handleScrollToBottomButtonTapped() {
Expand Down Expand Up @@ -120,6 +122,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
},
completion: {
self.snInputView.isHidden = false
self.showInputAccessoryView()
if let clearChatButtonStackView = self.view.viewWithTag(111) {
clearChatButtonStackView.removeFromSuperview()
}
Expand Down Expand Up @@ -272,6 +275,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
}

func handleDocumentButtonTapped() {
snInputView.resignFirstResponder()
// UIDocumentPickerModeImport copies to a temp file within our container.
// It uses more memory than "open" but lets us avoid working with security scoped URLs.
let documentPickerVC = UIDocumentPickerViewController(forOpeningContentTypes: [.item],
Expand Down Expand Up @@ -462,7 +466,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
// flags appropriately
let oldThreadShouldBeVisible: Bool = thread.shouldBeVisible
let linkPreviewDraft = snInputView.linkPreviewInfo?.draft
let tsMessage = TSOutgoingMessage.from(message, associatedWith: thread)
let tsMessage = TSOutgoingMessage.from(message, quotedMessage: nil, associatedWith: thread)

let promise: Promise<Void> = self.approveMessageRequestIfNeeded(
for: self.thread,
Expand Down Expand Up @@ -563,7 +567,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
// use it to determine if the user is creating a new thread and update the 'isApproved'
// flags appropriately
let oldThreadShouldBeVisible: Bool = thread.shouldBeVisible
let tsMessage = TSOutgoingMessage.from(message, associatedWith: thread)
let tsMessage = TSOutgoingMessage.from(message, quotedMessage: nil, associatedWith: thread)

let promise: Promise<Void> = self.approveMessageRequestIfNeeded(
for: self.thread,
Expand Down Expand Up @@ -642,6 +646,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
SSKEnvironment.shared.typingIndicators.didStartTypingOutgoingInput(inThread: thread)
}
inputTextView.textColor = Colors.text
updateAttachmentButtonLayout()
if !thread.isGroupThread() { return }
updateMentions(for: newText)
applyColorToMentionedUsers(text: newText)
Expand Down Expand Up @@ -761,7 +766,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
guard let message = viewItem.interaction as? TSMessage else { return }
if let messageOutgoing = message as? TSOutgoingMessage {
let status = MessageRecipientStatusUtils.recipientStatus(outgoingMessage: messageOutgoing)
if status == .sent || status == .delivered || status == .skipped {} else { return }
if status == .sent || status == .delivered || status == .skipped || status == .uploading || status == .sending {} else { return }
}

// Show the context menu if applicable
Expand Down Expand Up @@ -890,6 +895,8 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
if location.y < 65 || (viewItem.messageCellType == .mediaMessage && location.y < 80 && isTrusted) {
guard let indexPath = viewModel.ensureLoadWindowContainsQuotedReply(reply) else { return }
messagesTableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.middle, animated: true)
focusedMessageIndexPath = indexPath
highlightFocusedMessageIfNeeded()
return
}
}
Expand All @@ -915,6 +922,8 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
if (location.y < 125 && viewItem.mediaAlbumItems?.first?.attachment.contentType == "image/gif") || (location.y < 125 && message?.sharedContactMessage != nil) {
guard let indexPath = viewModel.ensureLoadWindowContainsQuotedReply(reply) else { return }
messagesTableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.middle, animated: true)
focusedMessageIndexPath = indexPath
highlightFocusedMessageIfNeeded()
return
}
}
Expand Down Expand Up @@ -978,6 +987,8 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
// Scroll to the source of the reply
guard let indexPath = viewModel.ensureLoadWindowContainsQuotedReply(reply) else { return }
messagesTableView.scrollToRow(at: indexPath, at: UITableView.ScrollPosition.middle, animated: true)
focusedMessageIndexPath = indexPath
highlightFocusedMessageIfNeeded()
} else if let message = viewItem.interaction as? TSIncomingMessage, let name = message.openGroupInvitationName,
let url = message.openGroupInvitationURL {
hideInputAccessoryView()
Expand Down Expand Up @@ -1393,6 +1404,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
bottomConstraintOfAttachmentButton = 4
resetAttachmentOptions()
snInputView.quoteDraftInfo = nil
updateFrame(false)
view.layoutIfNeeded()
}

Expand Down Expand Up @@ -1426,6 +1438,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
}
func handleReplyButtonTapped(for viewItem: ConversationViewItem) {
reply(viewItem)
updateFrame(true)
}

func resetAttachmentOptions() {
Expand All @@ -1437,6 +1450,7 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
}

func showUserDetails(for bchatID: String) {
hideInputAccessoryView()
let userDetailsSheet = UserDetailsSheet(for: bchatID)
userDetailsSheet.modalPresentationStyle = .overFullScreen
userDetailsSheet.modalTransitionStyle = .crossDissolve
Expand Down Expand Up @@ -2064,6 +2078,41 @@ extension ConversationVC {
// The attributed string
return attributedString
}

func updateAttachmentButtonLayout() {
var constraintValue: CGFloat = 4
let inputTextViewLines = snInputView.inputTextView.numberOfVisibleLines
if inputTextViewLines >= 2 {
constraintValue = inputTextViewLines == 3 ? 16 :
inputTextViewLines >= 4 ? 28 : constraintValue
}

if snInputView.quoteDraftInfo != nil {
let msg: VisibleMessage = VisibleMessage()
msg.quote = VisibleMessage.Quote.from(snInputView.quoteDraftInfo?.model)
if let quoteText = msg.quote?.text {
constraintValue += quoteText.count >= 100 ? 78 : 68
} else {
constraintValue += 68
}
}

DispatchQueue.main.async {
UIView.animate(withDuration: 0.25) {
bottomConstraintOfAttachmentButton = constraintValue
}
}
}

func updateFrame(_ isUpdate: Bool) {
if !isKeyboardPresented {
UIView.animate(withDuration: 0.25) {
self.messageRequestsViewBotomConstraint?.constant = isUpdate ? -170 : -105
self.scrollButtonBottomConstraint?.constant = isUpdate ? -170 : -105
self.messagesTableView.contentInset.bottom = isUpdate ? 170 : 121
}
}
}
}

struct CustomSlideView {
Expand Down
Loading