feat: input box menu

This commit is contained in:
Lakr
2025-06-19 01:25:11 +08:00
parent 1e861e54ee
commit 92887791fc
7 changed files with 88 additions and 16 deletions
@@ -18,7 +18,7 @@ let package = Package(
.package(url: "https://github.com/apple/swift-collections", from: "1.2.0"),
.package(url: "https://github.com/devxoul/Then", from: "3.0.0"),
.package(url: "https://github.com/SnapKit/SnapKit.git", from: "5.0.1"),
.package(url: "https://github.com/SwifterSwift/SwifterSwift.git", from: "6.0.0")
.package(url: "https://github.com/SwifterSwift/SwifterSwift.git", from: "6.0.0"),
],
targets: [
.target(name: "Intelligents", dependencies: [
@@ -1,5 +1,5 @@
//
// File.swift
// MainViewController+Header.swift
// Intelligents
//
// Created by on 6/19/25.
@@ -8,6 +8,22 @@
import UIKit
extension MainViewController: InputBoxDelegate {
func inputBoxDidSelectTakePhoto(_ inputBox: InputBox) {
print(#function, inputBox)
}
func inputBoxDidSelectPhotoLibrary(_ inputBox: InputBox) {
print(#function, inputBox)
}
func inputBoxDidSelectAttachFiles(_ inputBox: InputBox) {
print(#function, inputBox)
}
func inputBoxDidSelectEmbedDocs(_ inputBox: InputBox) {
print(#function, inputBox)
}
func inputBoxDidSelectAttachment(_ inputBox: InputBox) {
print(#function, inputBox)
}
@@ -1,5 +1,5 @@
//
// File.swift
// AccentColor.swift
// Intelligents
//
// Created by on 6/19/25.
@@ -70,7 +70,7 @@ class InputBox: UIView {
updateTextViewHeight()
}
}
override init(frame: CGRect = .zero) {
super.init(frame: frame)
setupViews()
@@ -164,15 +164,15 @@ class InputBox: UIView {
func updateTextViewHeight() {
let size = textView.sizeThatFits(CGSize(width: textView.frame.width, height: CGFloat.greatestFiniteMagnitude))
let newHeight = max(minTextViewHeight, min(maxTextViewHeight, size.height))
let height = textView.frame.height
guard height != newHeight else { return }
textViewHeightConstraint?.update(offset: newHeight)
textView.isScrollEnabled = size.height > maxTextViewHeight
if height == 0 || superview == nil || window == nil || isHidden { return }
UIView.animate(
withDuration: 0.5,
delay: 0,
@@ -231,8 +231,20 @@ class InputBox: UIView {
// MARK: - InputBoxFunctionBarDelegate
extension InputBox: InputBoxFunctionBarDelegate {
func functionBarDidTapAttachment(_: InputBoxFunctionBar) {
delegate?.inputBoxDidSelectAttachment(self)
func functionBarDidTapTakePhoto(_: InputBoxFunctionBar) {
delegate?.inputBoxDidSelectTakePhoto(self)
}
func functionBarDidTapPhotoLibrary(_: InputBoxFunctionBar) {
delegate?.inputBoxDidSelectPhotoLibrary(self)
}
func functionBarDidTapAttachFiles(_: InputBoxFunctionBar) {
delegate?.inputBoxDidSelectAttachFiles(self)
}
func functionBarDidTapEmbedDocs(_: InputBoxFunctionBar) {
delegate?.inputBoxDidSelectEmbedDocs(self)
}
func functionBarDidTapTool(_: InputBoxFunctionBar) {
@@ -8,7 +8,10 @@
import UIKit
protocol InputBoxDelegate: AnyObject {
func inputBoxDidSelectAttachment(_ inputBox: InputBox)
func inputBoxDidSelectTakePhoto(_ inputBox: InputBox)
func inputBoxDidSelectPhotoLibrary(_ inputBox: InputBox)
func inputBoxDidSelectAttachFiles(_ inputBox: InputBox)
func inputBoxDidSelectEmbedDocs(_ inputBox: InputBox)
func inputBoxDidSend(_ inputBox: InputBox)
func inputBoxTextDidChange(_ text: String)
}
@@ -3,7 +3,10 @@ import Then
import UIKit
protocol InputBoxFunctionBarDelegate: AnyObject {
func functionBarDidTapAttachment(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapTakePhoto(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapPhotoLibrary(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapAttachFiles(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapEmbedDocs(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapTool(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapNetwork(_ functionBar: InputBoxFunctionBar)
func functionBarDidTapDeepThinking(_ functionBar: InputBoxFunctionBar)
@@ -20,7 +23,8 @@ class InputBoxFunctionBar: UIView {
$0.setImage(UIImage(named: "inputbox.add.attachment", in: .module, with: nil), for: .normal)
$0.tintColor = unselectedColor
$0.imageView?.contentMode = .scaleAspectFit
$0.addTarget(self, action: #selector(attachmentButtonTapped), for: .touchUpInside)
$0.showsMenuAsPrimaryAction = true
$0.menu = createAttachmentMenu()
}
lazy var toolButton = UIButton(type: .system).then {
@@ -131,12 +135,49 @@ class InputBoxFunctionBar: UIView {
sendButton.alpha = canSend ? 1.0 : 0.5
}
// MARK: - Actions
// MARK: - Private Methods
@objc private func attachmentButtonTapped() {
delegate?.functionBarDidTapAttachment(self)
private func createAttachmentMenu() -> UIMenu {
let takePhotoAction = UIAction(
title: "Take Photo or Video",
image: UIImage(systemName: "camera")
) { [weak self] _ in
guard let self else { return }
delegate?.functionBarDidTapTakePhoto(self)
}
let photoLibraryAction = UIAction(
title: "Photo Library",
image: UIImage(systemName: "photo.on.rectangle")
) { [weak self] _ in
guard let self else { return }
delegate?.functionBarDidTapPhotoLibrary(self)
}
let attachFilesAction = UIAction(
title: "Attach Files (pdf, txt, csv)",
image: UIImage(systemName: "arrow.up.doc")
) { [weak self] _ in
guard let self else { return }
delegate?.functionBarDidTapAttachFiles(self)
}
let embedDocsAction = UIAction(
title: "Embed AFFINE Docs",
image: UIImage(systemName: "doc.text")
) { [weak self] _ in
guard let self else { return }
delegate?.functionBarDidTapEmbedDocs(self)
}
return UIMenu(
options: [.displayInline],
children: [takePhotoAction, photoLibraryAction, attachFilesAction, embedDocsAction].reversed()
)
}
// MARK: - Actions
@objc private func toolButtonTapped() {
delegate?.functionBarDidTapTool(self)
}