2020-09-23 03:00:56 +02:00
|
|
|
// Copyright © 2020 Metabolist. All rights reserved.
|
|
|
|
|
2021-01-31 08:43:48 +01:00
|
|
|
import Mastodon
|
2020-10-30 08:11:24 +01:00
|
|
|
import UIKit
|
2020-09-23 03:00:56 +02:00
|
|
|
import ViewModels
|
|
|
|
|
2020-10-15 09:44:01 +02:00
|
|
|
extension CollectionItem {
|
2020-10-30 08:11:24 +01:00
|
|
|
static let cellClasses = [
|
2021-01-29 07:22:13 +01:00
|
|
|
StatusTableViewCell.self,
|
|
|
|
AccountTableViewCell.self,
|
|
|
|
LoadMoreTableViewCell.self,
|
|
|
|
NotificationTableViewCell.self,
|
|
|
|
ConversationTableViewCell.self,
|
2021-01-25 08:42:39 +01:00
|
|
|
TagTableViewCell.self,
|
2021-04-25 21:38:36 +02:00
|
|
|
AnnouncementTableViewCell.self,
|
2021-02-09 03:48:02 +01:00
|
|
|
SeparatorConfiguredTableViewCell.self]
|
2020-10-15 09:44:01 +02:00
|
|
|
|
2020-09-23 03:00:56 +02:00
|
|
|
var cellClass: AnyClass {
|
|
|
|
switch self {
|
|
|
|
case .status:
|
2021-01-29 07:22:13 +01:00
|
|
|
return StatusTableViewCell.self
|
2020-09-23 03:00:56 +02:00
|
|
|
case .account:
|
2021-01-29 07:22:13 +01:00
|
|
|
return AccountTableViewCell.self
|
2020-10-02 05:19:14 +02:00
|
|
|
case .loadMore:
|
2021-01-29 07:22:13 +01:00
|
|
|
return LoadMoreTableViewCell.self
|
2020-10-30 08:11:24 +01:00
|
|
|
case let .notification(_, statusConfiguration):
|
2021-01-29 07:22:13 +01:00
|
|
|
return statusConfiguration == nil ? NotificationTableViewCell.self : StatusTableViewCell.self
|
2020-10-29 07:03:45 +01:00
|
|
|
case .conversation:
|
2021-01-29 07:22:13 +01:00
|
|
|
return ConversationTableViewCell.self
|
2021-01-24 04:12:30 +01:00
|
|
|
case .tag:
|
|
|
|
return TagTableViewCell.self
|
2021-04-25 21:38:36 +02:00
|
|
|
case .announcement:
|
|
|
|
return AnnouncementTableViewCell.self
|
2021-01-25 08:42:39 +01:00
|
|
|
case .moreResults:
|
2021-02-09 03:48:02 +01:00
|
|
|
return SeparatorConfiguredTableViewCell.self
|
2020-09-23 03:00:56 +02:00
|
|
|
}
|
|
|
|
}
|
2021-01-19 01:46:38 +01:00
|
|
|
|
2021-01-26 01:06:35 +01:00
|
|
|
func estimatedHeight(width: CGFloat, identityContext: IdentityContext) -> CGFloat {
|
2021-01-19 01:46:38 +01:00
|
|
|
switch self {
|
2021-02-08 02:46:51 +01:00
|
|
|
case let .status(status, configuration, _):
|
2021-01-19 01:46:38 +01:00
|
|
|
return StatusView.estimatedHeight(
|
|
|
|
width: width,
|
2021-01-26 01:06:35 +01:00
|
|
|
identityContext: identityContext,
|
2021-01-19 01:46:38 +01:00
|
|
|
status: status,
|
|
|
|
configuration: configuration)
|
2021-02-08 02:46:51 +01:00
|
|
|
case let .account(account, configuration, _):
|
2021-01-26 07:57:44 +01:00
|
|
|
return AccountView.estimatedHeight(width: width, account: account, configuration: configuration)
|
2021-01-20 03:47:21 +01:00
|
|
|
case .loadMore:
|
|
|
|
return LoadMoreView.estimatedHeight
|
|
|
|
case let .notification(notification, configuration):
|
|
|
|
return NotificationView.estimatedHeight(
|
|
|
|
width: width,
|
2021-01-26 01:06:35 +01:00
|
|
|
identityContext: identityContext,
|
2021-01-20 03:47:21 +01:00
|
|
|
notification: notification,
|
|
|
|
configuration: configuration)
|
|
|
|
case let .conversation(conversation):
|
|
|
|
return ConversationView.estimatedHeight(
|
|
|
|
width: width,
|
2021-01-26 01:06:35 +01:00
|
|
|
identityContext: identityContext,
|
2021-01-20 03:47:21 +01:00
|
|
|
conversation: conversation)
|
2021-01-24 04:12:30 +01:00
|
|
|
case let .tag(tag):
|
|
|
|
return TagView.estimatedHeight(width: width, tag: tag)
|
2021-04-25 21:38:36 +02:00
|
|
|
case let .announcement(announcement):
|
|
|
|
return AnnouncementView.estimatedHeight(width: width, announcement: announcement)
|
2021-01-25 08:42:39 +01:00
|
|
|
case .moreResults:
|
|
|
|
return UITableView.automaticDimension
|
2021-01-19 01:46:38 +01:00
|
|
|
}
|
|
|
|
}
|
2021-01-31 08:43:48 +01:00
|
|
|
|
|
|
|
func mediaPrefetchURLs(identityContext: IdentityContext) -> Set<URL> {
|
|
|
|
switch self {
|
2021-02-08 02:46:51 +01:00
|
|
|
case let .status(status, _, _):
|
2021-01-31 08:43:48 +01:00
|
|
|
return status.mediaPrefetchURLs(identityContext: identityContext)
|
2021-02-08 02:46:51 +01:00
|
|
|
case let .account(account, _, _):
|
2021-01-31 08:43:48 +01:00
|
|
|
return account.mediaPrefetchURLs(identityContext: identityContext)
|
|
|
|
case let .notification(notification, _):
|
|
|
|
var urls = notification.account.mediaPrefetchURLs(identityContext: identityContext)
|
|
|
|
|
|
|
|
if let status = notification.status {
|
|
|
|
urls.formUnion(status.mediaPrefetchURLs(identityContext: identityContext))
|
|
|
|
}
|
|
|
|
|
|
|
|
return urls
|
|
|
|
case let .conversation(conversation):
|
|
|
|
return conversation.accounts.reduce(Set<URL>()) {
|
|
|
|
$0.union($1.mediaPrefetchURLs(identityContext: identityContext))
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
return []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private extension Account {
|
|
|
|
func mediaPrefetchURLs(identityContext: IdentityContext) -> Set<URL> {
|
2021-03-29 08:04:14 +02:00
|
|
|
var urls = Set(emojis.map {
|
|
|
|
(identityContext.appPreferences.animateCustomEmojis ? $0.url : $0.staticUrl).url
|
|
|
|
})
|
2021-01-31 08:43:48 +01:00
|
|
|
|
2021-03-06 03:25:18 +01:00
|
|
|
if identityContext.appPreferences.animateAvatars == .everywhere {
|
2021-03-29 08:04:14 +02:00
|
|
|
urls.insert(avatar.url)
|
2021-01-31 08:43:48 +01:00
|
|
|
} else {
|
2021-03-29 08:04:14 +02:00
|
|
|
urls.insert(avatarStatic.url)
|
2021-01-31 08:43:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return urls
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private extension Status {
|
|
|
|
func mediaPrefetchURLs(identityContext: IdentityContext) -> Set<URL> {
|
|
|
|
displayStatus.account.mediaPrefetchURLs(identityContext: identityContext)
|
2021-03-29 08:04:14 +02:00
|
|
|
.union(displayStatus.mediaAttachments.compactMap(\.previewUrl?.url))
|
|
|
|
.union(displayStatus.emojis.map {
|
|
|
|
(identityContext.appPreferences.animateCustomEmojis ? $0.url : $0.staticUrl).url
|
|
|
|
})
|
2021-01-31 08:43:48 +01:00
|
|
|
}
|
2020-09-23 03:00:56 +02:00
|
|
|
}
|