mastodon-ios/Mastodon/Diffiable/Compose/AutoCompleteSection.swift

99 lines
4.4 KiB
Swift

//
// AutoCompleteSection.swift
// Mastodon
//
// Created by MainasuK Cirno on 2021-5-17.
//
import UIKit
import MastodonSDK
import MastodonMeta
import MastodonAsset
import MastodonLocalization
enum AutoCompleteSection: Equatable, Hashable {
case main
}
extension AutoCompleteSection {
static func tableViewDiffableDataSource(
for tableView: UITableView
) -> UITableViewDiffableDataSource<AutoCompleteSection, AutoCompleteItem> {
UITableViewDiffableDataSource(tableView: tableView) { tableView, indexPath, item in
switch item {
case .hashtag(let hashtag):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: AutoCompleteTableViewCell.self), for: indexPath) as! AutoCompleteTableViewCell
configureHashtag(cell: cell, hashtag: hashtag)
return cell
case .hashtagV1(let hashtagName):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: AutoCompleteTableViewCell.self), for: indexPath) as! AutoCompleteTableViewCell
configureHashtag(cell: cell, hashtagName: hashtagName)
return cell
case .account(let account):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: AutoCompleteTableViewCell.self), for: indexPath) as! AutoCompleteTableViewCell
configureAccount(cell: cell, account: account)
return cell
case .emoji(let emoji):
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: AutoCompleteTableViewCell.self), for: indexPath) as! AutoCompleteTableViewCell
configureEmoji(cell: cell, emoji: emoji, isFirst: indexPath.row == 0)
return cell
case .bottomLoader:
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TimelineBottomLoaderTableViewCell.self), for: indexPath) as! TimelineBottomLoaderTableViewCell
cell.startAnimating()
return cell
}
}
}
}
extension AutoCompleteSection {
private static func configureHashtag(cell: AutoCompleteTableViewCell, hashtag: Mastodon.Entity.Tag) {
let metaContent = PlaintextMetaContent(string: "#" + hashtag.name)
cell.titleLabel.configure(content: metaContent)
cell.subtitleLabel.text = {
let count = (hashtag.history ?? [])
.sorted(by: { $0.day > $1.day })
.prefix(2)
.compactMap { Int($0.accounts) }
.reduce(0, +)
return L10n.Plural.peopleTalking(count)
}()
cell.avatarImageView.isHidden = true
}
private static func configureHashtag(cell: AutoCompleteTableViewCell, hashtagName: String) {
let metaContent = PlaintextMetaContent(string: "#" + hashtagName)
cell.titleLabel.configure(content: metaContent)
cell.subtitleLabel.text = " "
cell.avatarImageView.isHidden = true
}
private static func configureAccount(cell: AutoCompleteTableViewCell, account: Mastodon.Entity.Account) {
let mastodonContent = MastodonContent(content: account.displayNameWithFallback, emojis: account.emojiMeta)
do {
let metaContent = try MastodonMetaContent.convert(document: mastodonContent)
cell.titleLabel.configure(content: metaContent)
} catch {
let metaContent = PlaintextMetaContent(string: account.displayNameWithFallback)
cell.titleLabel.configure(content: metaContent)
}
cell.subtitleLabel.text = "@" + account.acct
cell.avatarImageView.isHidden = false
cell.avatarImageView.configure(configuration: .init(url: URL(string: account.avatar)))
}
private static func configureEmoji(cell: AutoCompleteTableViewCell, emoji: Mastodon.Entity.Emoji, isFirst: Bool) {
let metaContent = PlaintextMetaContent(string: ":" + emoji.shortcode + ":")
cell.titleLabel.configure(content: metaContent)
// FIXME: handle spacer enter to complete emoji
// cell.subtitleLabel.text = isFirst ? L10n.Scene.Compose.AutoComplete.spaceToAdd : " "
cell.subtitleLabel.text = " "
cell.avatarImageView.isHidden = false
cell.avatarImageView.configure(configuration: .init(url: URL(string: emoji.url)))
}
}