chore: code clean up

This commit is contained in:
CMK 2022-11-13 22:40:36 +08:00
parent b47f8ead37
commit 26c6b8f2ee
6 changed files with 9 additions and 529 deletions

View File

@ -8,7 +8,6 @@
import UIKit
import Combine
import MastodonCore
import MastodonUI
final class AutoCompleteTopChevronView: UIView {

View File

@ -66,9 +66,9 @@ extension ComposeContentViewModel {
guard let replyTo = status.object(in: context.managedObjectContext) else { return }
cell.statusView.configure(status: replyTo)
}
case .hashtag(let hashtag):
case .hashtag:
break
case .mention(let user):
case .mention:
break
}
}

View File

@ -185,7 +185,7 @@ public final class ComposeContentViewModel: NSObject, ObservableObject {
return
}
let author = authContext.mastodonAuthenticationBox.authenticationRecord.object(in: context.managedObjectContext)?.user
var mentionAccts: [String] = []
if author?.id != status.author.id {
mentionAccts.append("@" + status.author.acct)
@ -204,7 +204,7 @@ public final class ComposeContentViewModel: NSObject, ObservableObject {
self.isContentWarningActive = true
self.contentWarning = spoilerText
}
let initialComposeContent = mentionAccts.joined(separator: " ")
let preInsertedContent: String? = initialComposeContent.isEmpty ? nil : initialComposeContent + " "
self.initialContent = preInsertedContent ?? ""
@ -342,11 +342,6 @@ extension ComposeContentViewModel {
return true
}
isMediaUploadAllSuccess.sink { result in
print(result)
}
.store(in: &disposeBag)
let isPollOptionsAllValid = $pollOptions
.map { options in
return Publishers.MergeMany(options.map { $0.$text })
@ -517,14 +512,15 @@ extension ComposeContentViewModel {
}
extension ComposeContentViewModel {
public enum AttachmentPrecondition: Error, LocalizedError {
case videoAttachWithPhoto
case moreThanOneVideo
public var errorDescription: String? {
return L10n.Common.Alerts.PublishPostFailure.title
}
public var failureReason: String? {
switch self {
case .videoAttachWithPhoto:
@ -534,13 +530,14 @@ extension ComposeContentViewModel {
}
}
}
// check exclusive limit:
// - up to 1 video
// - up to N photos
public func checkAttachmentPrecondition() throws {
let attachmentViewModels = self.attachmentViewModels
guard !attachmentViewModels.isEmpty else { return }
var photoAttachmentViewModels: [AttachmentViewModel] = []
var videoAttachmentViewModels: [AttachmentViewModel] = []
attachmentViewModels.forEach { attachmentViewModel in

View File

@ -7,74 +7,12 @@
import os.log
import UIKit
import Combine
import MetaTextKit
import UITextView_Placeholder
import MastodonAsset
import MastodonLocalization
import UIHostingConfigurationBackport
//protocol ComposeStatusContentTableViewCellDelegate: AnyObject {
// func composeStatusContentTableViewCell(_ cell: ComposeStatusContentTableViewCell, textViewShouldBeginEditing textView: UITextView) -> Bool
//}
final class ComposeContentTableViewCell: UITableViewCell {
let logger = Logger(subsystem: "ComposeContentTableViewCell", category: "View")
// var disposeBag = Set<AnyCancellable>()
// weak var delegate: ComposeStatusContentTableViewCellDelegate?
//
// let statusView = StatusView()
//
// let statusContentWarningEditorView = StatusContentWarningEditorView()
//
// let textEditorViewContainerView = UIView()
//
// static let metaTextViewTag: Int = 333
// let metaText: MetaText = {
// let metaText = MetaText()
// metaText.textView.backgroundColor = .clear
// metaText.textView.isScrollEnabled = false
// metaText.textView.keyboardType = .twitter
// metaText.textView.textDragInteraction?.isEnabled = false // disable drag for link and attachment
// metaText.textView.textContainer.lineFragmentPadding = 10 // leading inset
// metaText.textView.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 17, weight: .regular))
// metaText.textView.attributedPlaceholder = {
// var attributes = metaText.textAttributes
// attributes[.foregroundColor] = Asset.Colors.Label.secondary.color
// return NSAttributedString(
// string: L10n.Scene.Compose.contentInputPlaceholder,
// attributes: attributes
// )
// }()
// metaText.paragraphStyle = {
// let style = NSMutableParagraphStyle()
// style.lineSpacing = 5
// style.paragraphSpacing = 0
// return style
// }()
// metaText.textAttributes = [
// .font: UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 17, weight: .regular)),
// .foregroundColor: Asset.Colors.Label.primary.color,
// ]
// metaText.linkAttributes = [
// .font: UIFontMetrics(forTextStyle: .body).scaledFont(for: .systemFont(ofSize: 17, weight: .semibold)),
// .foregroundColor: Asset.Colors.brand.color,
// ]
// return metaText
// }()
//
// // output
// let contentWarningContent = PassthroughSubject<String, Never>()
//
// override func prepareForReuse() {
// super.prepareForReuse()
//
// metaText.delegate = nil
// metaText.textView.delegate = nil
// }
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
_init()
@ -93,79 +31,6 @@ extension ComposeContentTableViewCell {
selectionStyle = .none
layer.zPosition = 999
backgroundColor = .clear
// let containerStackView = UIStackView()
// containerStackView.axis = .vertical
// containerStackView.translatesAutoresizingMaskIntoConstraints = false
// contentView.addSubview(containerStackView)
// NSLayoutConstraint.activate([
// containerStackView.topAnchor.constraint(equalTo: contentView.topAnchor),
// containerStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
// containerStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
// containerStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
// ])
// containerStackView.preservesSuperviewLayoutMargins = true
//
// containerStackView.addArrangedSubview(statusContentWarningEditorView)
// statusContentWarningEditorView.setContentHuggingPriority(.required - 1, for: .vertical)
//
// let statusContainerView = UIView()
// statusContainerView.preservesSuperviewLayoutMargins = true
// containerStackView.addArrangedSubview(statusContainerView)
// statusView.translatesAutoresizingMaskIntoConstraints = false
// statusContainerView.addSubview(statusView)
// NSLayoutConstraint.activate([
// statusView.topAnchor.constraint(equalTo: statusContainerView.topAnchor, constant: 20),
// statusView.leadingAnchor.constraint(equalTo: statusContainerView.leadingAnchor),
// statusView.trailingAnchor.constraint(equalTo: statusContainerView.trailingAnchor),
// statusView.bottomAnchor.constraint(equalTo: statusContainerView.bottomAnchor),
// ])
// statusView.setup(style: .composeStatusAuthor)
//
// containerStackView.addArrangedSubview(textEditorViewContainerView)
// metaText.textView.translatesAutoresizingMaskIntoConstraints = false
// textEditorViewContainerView.addSubview(metaText.textView)
// NSLayoutConstraint.activate([
// metaText.textView.topAnchor.constraint(equalTo: textEditorViewContainerView.topAnchor),
// metaText.textView.leadingAnchor.constraint(equalTo: textEditorViewContainerView.layoutMarginsGuide.leadingAnchor),
// metaText.textView.trailingAnchor.constraint(equalTo: textEditorViewContainerView.layoutMarginsGuide.trailingAnchor),
// metaText.textView.bottomAnchor.constraint(equalTo: textEditorViewContainerView.bottomAnchor),
// metaText.textView.heightAnchor.constraint(greaterThanOrEqualToConstant: 64).priority(.defaultHigh),
// ])
// statusContentWarningEditorView.textView.delegate = self
}
}
// MARK: - UITextViewDelegate
//extension ComposeStatusContentTableViewCell: UITextViewDelegate {
//
// func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
// return delegate?.composeStatusContentTableViewCell(self, textViewShouldBeginEditing: textView) ?? true
// }
//
// func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// switch textView {
// case statusContentWarningEditorView.textView:
// // disable input line break
// guard text != "\n" else { return false }
// return true
// default:
// assertionFailure()
// return true
// }
// }
//
// func textViewDidChange(_ textView: UITextView) {
// logger.debug("\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): text: \(textView.text ?? "<nil>")")
// guard textView === statusContentWarningEditorView.textView else { return }
// // replace line break with space
// // needs check input state to prevent break the IME
// if textView.markedTextRange == nil {
// textView.text = textView.text.replacingOccurrences(of: "\n", with: " ")
// }
// contentWarningContent.send(textView.text)
// }
//
//}

View File

@ -1,172 +0,0 @@
//
// ComposeStatusAttachmentTableViewCell.swift
// Mastodon
//
// Created by MainasuK Cirno on 2021-6-29.
//
import UIKit
import SwiftUI
import Combine
import AlamofireImage
import MastodonAsset
import MastodonCore
import MastodonLocalization
import UIHostingConfigurationBackport
//final class ComposeStatusAttachmentTableViewCell: UITableViewCell {
//
// private(set) var dataSource: UICollectionViewDiffableDataSource<ComposeStatusAttachmentSection, ComposeStatusAttachmentItem>!
// weak var composeStatusAttachmentCollectionViewCellDelegate: ComposeStatusAttachmentCollectionViewCellDelegate?
// var observations = Set<NSKeyValueObservation>()
//
// private static func createLayout() -> UICollectionViewLayout {
// let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44))
// let item = NSCollectionLayoutItem(layoutSize: itemSize)
// let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44))
// let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
// let section = NSCollectionLayoutSection(group: group)
// section.contentInsetsReference = .readableContent
// return UICollectionViewCompositionalLayout(section: section)
// }
//
// private(set) var collectionViewHeightLayoutConstraint: NSLayoutConstraint!
// let collectionView: UICollectionView = {
// let collectionViewLayout = ComposeStatusAttachmentTableViewCell.createLayout()
// let collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
// collectionView.register(ComposeStatusAttachmentCollectionViewCell.self, forCellWithReuseIdentifier: String(describing: ComposeStatusAttachmentCollectionViewCell.self))
// collectionView.backgroundColor = .clear
// collectionView.alwaysBounceVertical = true
// collectionView.isScrollEnabled = false
// return collectionView
// }()
// let collectionViewHeightDidUpdate = PassthroughSubject<Void, Never>()
//
// override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
// super.init(style: style, reuseIdentifier: reuseIdentifier)
// _init()
// }
//
// required init?(coder: NSCoder) {
// super.init(coder: coder)
// _init()
// }
//
//}
//
//extension ComposeStatusAttachmentTableViewCell {
//
// private func _init() {
// backgroundColor = .clear
// contentView.backgroundColor = .clear
//
// collectionView.translatesAutoresizingMaskIntoConstraints = false
// contentView.addSubview(collectionView)
// collectionViewHeightLayoutConstraint = collectionView.heightAnchor.constraint(equalToConstant: 200).priority(.defaultHigh)
// NSLayoutConstraint.activate([
// collectionView.topAnchor.constraint(equalTo: contentView.topAnchor),
// collectionView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
// collectionView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
// collectionView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
// collectionViewHeightLayoutConstraint,
// ])
//
// collectionView.observe(\.contentSize, options: [.initial, .new]) { [weak self] collectionView, _ in
// guard let self = self else { return }
// self.collectionViewHeightLayoutConstraint.constant = collectionView.contentSize.height
// self.collectionViewHeightDidUpdate.send()
// }
// .store(in: &observations)
//
// self.dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) {
// [weak self] collectionView, indexPath, item -> UICollectionViewCell? in
// guard let _ = self else { return UICollectionViewCell() }
// switch item {
// case .attachment:
// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: ComposeStatusAttachmentCollectionViewCell.self), for: indexPath) as! ComposeStatusAttachmentCollectionViewCell
// cell.contentConfiguration = UIHostingConfigurationBackport {
// HStack {
// Image(systemName: "star")
// Text("Favorites")
// Spacer()
// }
// }
//// cell.attachmentContainerView.descriptionTextView.text = attachmentService.description.value
//// cell.delegate = self.composeStatusAttachmentCollectionViewCellDelegate
//// attachmentService.thumbnailImage
//// .receive(on: DispatchQueue.main)
//// .sink { [weak cell] thumbnailImage in
//// guard let cell = cell else { return }
//// let size = cell.attachmentContainerView.previewImageView.frame.size != .zero ? cell.attachmentContainerView.previewImageView.frame.size : CGSize(width: 1, height: 1)
//// guard let image = thumbnailImage else {
//// let placeholder = UIImage.placeholder(
//// size: size,
//// color: ThemeService.shared.currentTheme.value.systemGroupedBackgroundColor
//// )
//// .af.imageRounded(
//// withCornerRadius: AttachmentContainerView.containerViewCornerRadius
//// )
//// cell.attachmentContainerView.previewImageView.image = placeholder
//// return
//// }
//// // cannot get correct size. set corner radius on layer
//// cell.attachmentContainerView.previewImageView.image = image
//// }
//// .store(in: &cell.disposeBag)
//// Publishers.CombineLatest(
//// attachmentService.uploadStateMachineSubject.eraseToAnyPublisher(),
//// attachmentService.error.eraseToAnyPublisher()
//// )
//// .receive(on: DispatchQueue.main)
//// .sink { [weak cell, weak attachmentService] uploadState, error in
//// guard let cell = cell else { return }
//// guard let attachmentService = attachmentService else { return }
//// cell.attachmentContainerView.emptyStateView.isHidden = error == nil
//// cell.attachmentContainerView.descriptionBackgroundView.isHidden = error != nil
//// if let error = error {
//// cell.attachmentContainerView.activityIndicatorView.stopAnimating()
//// cell.attachmentContainerView.emptyStateView.label.text = error.localizedDescription
//// } else {
//// guard let uploadState = uploadState else { return }
//// switch uploadState {
//// case is MastodonAttachmentService.UploadState.Finish:
//// cell.attachmentContainerView.activityIndicatorView.stopAnimating()
//// case is MastodonAttachmentService.UploadState.Fail:
//// cell.attachmentContainerView.activityIndicatorView.stopAnimating()
//// // FIXME: not display
//// cell.attachmentContainerView.emptyStateView.label.text = {
//// if let file = attachmentService.file.value {
//// switch file {
//// case .jpeg, .png, .gif:
//// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo)
//// case .other:
//// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.video)
//// }
//// } else {
//// return L10n.Scene.Compose.Attachment.attachmentBroken(L10n.Scene.Compose.Attachment.photo)
//// }
//// }()
//// default:
//// break
//// }
//// }
//// }
//// .store(in: &cell.disposeBag)
//// NotificationCenter.default.publisher(
//// for: UITextView.textDidChangeNotification,
//// object: cell.attachmentContainerView.descriptionTextView
//// )
//// .receive(on: DispatchQueue.main)
//// .sink { notification in
//// guard let textField = notification.object as? UITextView else { return }
//// let text = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines)
//// attachmentService.description.value = text
//// }
//// .store(in: &cell.disposeBag)
// return cell
// }
// }
// }
//
//}
//

View File

@ -1,209 +0,0 @@
//
// ComposeStatusPollTableViewCell.swift
// Mastodon
//
// Created by MainasuK Cirno on 2021-6-29.
//
import os.log
import UIKit
import Combine
import MastodonAsset
import MastodonLocalization
//protocol ComposeStatusPollTableViewCellDelegate: AnyObject {
// func composeStatusPollTableViewCell(_ cell: ComposeStatusPollTableViewCell, pollOptionAttributesDidReorder options: [ComposeStatusPollItem.PollOptionAttribute])
//}
//
//final class ComposeStatusPollTableViewCell: UITableViewCell {
//
// let logger = Logger(subsystem: "ComposeStatusPollTableViewCell", category: "UI")
//
// private(set) var dataSource: UICollectionViewDiffableDataSource<ComposeStatusPollSection, ComposeStatusPollItem>!
// var observations = Set<NSKeyValueObservation>()
//
// weak var customEmojiPickerInputViewModel: CustomEmojiPickerInputViewModel?
// weak var delegate: ComposeStatusPollTableViewCellDelegate?
// weak var composeStatusPollOptionCollectionViewCellDelegate: ComposeStatusPollOptionCollectionViewCellDelegate?
// weak var composeStatusPollOptionAppendEntryCollectionViewCellDelegate: ComposeStatusPollOptionAppendEntryCollectionViewCellDelegate?
// weak var composeStatusPollExpiresOptionCollectionViewCellDelegate: ComposeStatusPollExpiresOptionCollectionViewCellDelegate?
//
// private static func createLayout() -> UICollectionViewLayout {
// let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44))
// let item = NSCollectionLayoutItem(layoutSize: itemSize)
// let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44))
// let group = NSCollectionLayoutGroup.vertical(layoutSize: groupSize, subitems: [item])
// let section = NSCollectionLayoutSection(group: group)
// section.contentInsetsReference = .readableContent
// return UICollectionViewCompositionalLayout(section: section)
// }
//
// private(set) var collectionViewHeightLayoutConstraint: NSLayoutConstraint!
// let collectionView: UICollectionView = {
// let collectionViewLayout = ComposeStatusPollTableViewCell.createLayout()
// let collectionView = UICollectionView(frame: .zero, collectionViewLayout: collectionViewLayout)
// collectionView.register(ComposeStatusPollOptionCollectionViewCell.self, forCellWithReuseIdentifier: String(describing: ComposeStatusPollOptionCollectionViewCell.self))
// collectionView.register(ComposeStatusPollOptionAppendEntryCollectionViewCell.self, forCellWithReuseIdentifier: String(describing: ComposeStatusPollOptionAppendEntryCollectionViewCell.self))
// collectionView.register(ComposeStatusPollExpiresOptionCollectionViewCell.self, forCellWithReuseIdentifier: String(describing: ComposeStatusPollExpiresOptionCollectionViewCell.self))
// collectionView.backgroundColor = .clear
// collectionView.alwaysBounceVertical = true
// collectionView.isScrollEnabled = false
// collectionView.dragInteractionEnabled = true
// return collectionView
// }()
// let collectionViewHeightDidUpdate = PassthroughSubject<Void, Never>()
//
// override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
// super.init(style: style, reuseIdentifier: reuseIdentifier)
// _init()
// }
//
// required init?(coder: NSCoder) {
// super.init(coder: coder)
// _init()
// }
//
//}
//
//extension ComposeStatusPollTableViewCell {
//
// private func _init() {
// backgroundColor = .clear
// contentView.backgroundColor = .clear
//
// collectionView.translatesAutoresizingMaskIntoConstraints = false
// contentView.addSubview(collectionView)
// collectionViewHeightLayoutConstraint = collectionView.heightAnchor.constraint(equalToConstant: 300).priority(.defaultHigh)
// NSLayoutConstraint.activate([
// collectionView.topAnchor.constraint(equalTo: contentView.topAnchor),
// collectionView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
// collectionView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
// collectionView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
// collectionViewHeightLayoutConstraint,
// ])
//
// collectionView.observe(\.contentSize, options: [.initial, .new]) { [weak self] collectionView, _ in
// guard let self = self else { return }
// self.collectionViewHeightLayoutConstraint.constant = collectionView.contentSize.height
// self.collectionViewHeightDidUpdate.send()
// }
// .store(in: &observations)
//
// self.dataSource = UICollectionViewDiffableDataSource(collectionView: collectionView) { [
// weak self
// ] collectionView, indexPath, item -> UICollectionViewCell? in
// guard let self = self else { return UICollectionViewCell() }
//
// switch item {
// case .pollOption(let attribute):
// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: ComposeStatusPollOptionCollectionViewCell.self), for: indexPath) as! ComposeStatusPollOptionCollectionViewCell
// cell.pollOptionView.optionTextField.text = attribute.option.value
// cell.pollOptionView.optionTextField.placeholder = L10n.Scene.Compose.Poll.optionNumber(indexPath.item + 1)
// cell.pollOption
// .receive(on: DispatchQueue.main)
// .assign(to: \.value, on: attribute.option)
// .store(in: &cell.disposeBag)
// cell.delegate = self.composeStatusPollOptionCollectionViewCellDelegate
// if let customEmojiPickerInputViewModel = self.customEmojiPickerInputViewModel {
// ComposeStatusSection.configureCustomEmojiPicker(viewModel: customEmojiPickerInputViewModel, customEmojiReplaceableTextInput: cell.pollOptionView.optionTextField, disposeBag: &cell.disposeBag)
// }
// return cell
// case .pollOptionAppendEntry:
// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: ComposeStatusPollOptionAppendEntryCollectionViewCell.self), for: indexPath) as! ComposeStatusPollOptionAppendEntryCollectionViewCell
// cell.delegate = self.composeStatusPollOptionAppendEntryCollectionViewCellDelegate
// return cell
// case .pollExpiresOption(let attribute):
// let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: ComposeStatusPollExpiresOptionCollectionViewCell.self), for: indexPath) as! ComposeStatusPollExpiresOptionCollectionViewCell
// cell.durationButton.setTitle(L10n.Scene.Compose.Poll.durationTime(attribute.expiresOption.value.title), for: .normal)
// attribute.expiresOption
// .receive(on: DispatchQueue.main)
// .sink { [weak cell] expiresOption in
// guard let cell = cell else { return }
// cell.durationButton.setTitle(L10n.Scene.Compose.Poll.durationTime(expiresOption.title), for: .normal)
// }
// .store(in: &cell.disposeBag)
// cell.delegate = self.composeStatusPollExpiresOptionCollectionViewCellDelegate
// return cell
// }
// }
//
// collectionView.dragDelegate = self
// collectionView.dropDelegate = self
// }
//
//}
//
//// MARK: - UICollectionViewDragDelegate
//extension ComposeStatusPollTableViewCell: UICollectionViewDragDelegate {
//
// func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
// guard let item = dataSource.itemIdentifier(for: indexPath) else { return [] }
// switch item {
// case .pollOption:
// let itemProvider = NSItemProvider(object: String(item.hashValue) as NSString)
// let dragItem = UIDragItem(itemProvider: itemProvider)
// dragItem.localObject = item
// return [dragItem]
// default:
// return []
// }
// }
//
// func collectionView(_ collectionView: UICollectionView, dragSessionIsRestrictedToDraggingApplication session: UIDragSession) -> Bool {
// // drag to app should be the same app
// return true
// }
//}
//
//// MARK: - UICollectionViewDropDelegate
//extension ComposeStatusPollTableViewCell: UICollectionViewDropDelegate {
// // didUpdate
// func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
// guard collectionView.hasActiveDrag,
// let destinationIndexPath = destinationIndexPath,
// let item = dataSource.itemIdentifier(for: destinationIndexPath)
// else {
// return UICollectionViewDropProposal(operation: .forbidden)
// }
//
// switch item {
// case .pollOption:
// return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
// default:
// return UICollectionViewDropProposal(operation: .cancel)
// }
// }
//
// // performDrop
// func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
// guard let dropItem = coordinator.items.first,
// let item = dropItem.dragItem.localObject as? ComposeStatusPollItem,
// case .pollOption = item
// else { return }
//
// guard coordinator.proposal.operation == .move else { return }
// guard let destinationIndexPath = coordinator.destinationIndexPath,
// let _ = collectionView.cellForItem(at: destinationIndexPath) as? ComposeStatusPollOptionCollectionViewCell
// else { return }
//
// var snapshot = dataSource.snapshot()
// guard destinationIndexPath.row < snapshot.itemIdentifiers.count else { return }
// let anchorItem = snapshot.itemIdentifiers[destinationIndexPath.row]
// snapshot.moveItem(item, afterItem: anchorItem)
// dataSource.apply(snapshot)
//
// coordinator.drop(dropItem.dragItem, toItemAt: destinationIndexPath)
// }
//}
//
//extension ComposeStatusPollTableViewCell: UICollectionViewDelegate {
// func collectionView(_ collectionView: UICollectionView, targetIndexPathForMoveFromItemAt originalIndexPath: IndexPath, toProposedIndexPath proposedIndexPath: IndexPath) -> IndexPath {
// logger.log(level: .debug, "\((#file as NSString).lastPathComponent, privacy: .public)[\(#line, privacy: .public)], \(#function, privacy: .public): \(originalIndexPath.debugDescription) -> \(proposedIndexPath.debugDescription)")
//
// guard let _ = collectionView.cellForItem(at: proposedIndexPath) as? ComposeStatusPollOptionCollectionViewCell else {
// return originalIndexPath
// }
//
// return proposedIndexPath
// }
//}