Avoid redundant database lookups

This commit is contained in:
Shadowfacts 2020-12-24 17:13:44 -05:00
parent 4ac3292183
commit e67f6b2ad8
3 changed files with 16 additions and 14 deletions

View File

@ -133,16 +133,15 @@ extension MenuPreviewProvider {
] ]
} }
func actionsForStatus(statusID: String, sourceView: UIView?) -> [UIMenuElement] { func actionsForStatus(_ status: StatusMO, sourceView: UIView?) -> [UIMenuElement] {
guard let mastodonController = mastodonController, guard let mastodonController = mastodonController else { return [] }
let status = mastodonController.persistentContainer.status(for: statusID) else { return [] }
guard mastodonController.loggedIn else { guard mastodonController.loggedIn else {
return [ return [
openInSafariAction(url: status.url!), openInSafariAction(url: status.url!),
createAction(identifier: "share", title: "Share...", systemImageName: "square.and.arrow.up", handler: { [weak self] (_) in createAction(identifier: "share", title: "Share...", systemImageName: "square.and.arrow.up", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
self.navigationDelegate?.showMoreOptions(forStatus: statusID, sourceView: sourceView) self.navigationDelegate?.showMoreOptions(forStatus: status.id, sourceView: sourceView)
}) })
] ]
} }
@ -153,11 +152,11 @@ extension MenuPreviewProvider {
var actionsSection = [ var actionsSection = [
createAction(identifier: "reply", title: "Reply", systemImageName: "arrowshape.turn.up.left", handler: { [weak self] (_) in createAction(identifier: "reply", title: "Reply", systemImageName: "arrowshape.turn.up.left", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
self.navigationDelegate?.compose(inReplyToID: statusID) self.navigationDelegate?.compose(inReplyToID: status.id)
}), }),
createAction(identifier: "bookmark", title: bookmarked ? "Unbookmark" : "Bookmark", systemImageName: bookmarked ? "bookmark.fill" : "bookmark", handler: { [weak self] (_) in createAction(identifier: "bookmark", title: bookmarked ? "Unbookmark" : "Bookmark", systemImageName: bookmarked ? "bookmark.fill" : "bookmark", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
let request = (bookmarked ? Status.unbookmark : Status.bookmark)(statusID) let request = (bookmarked ? Status.unbookmark : Status.bookmark)(status.id)
self.mastodonController?.run(request) { (response) in self.mastodonController?.run(request) { (response) in
if case let .success(status, _) = response { if case let .success(status, _) = response {
self.mastodonController?.persistentContainer.addOrUpdate(status: status, incrementReferenceCount: false) self.mastodonController?.persistentContainer.addOrUpdate(status: status, incrementReferenceCount: false)
@ -166,7 +165,7 @@ extension MenuPreviewProvider {
}), }),
createAction(identifier: "mute", title: muted ? "Unmute" : "Mute", systemImageName: muted ? "speaker" : "speaker.slash", handler: { [weak self] (_) in createAction(identifier: "mute", title: muted ? "Unmute" : "Mute", systemImageName: muted ? "speaker" : "speaker.slash", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
let request = (muted ? Status.unmuteConversation : Status.muteConversation)(statusID) let request = (muted ? Status.unmuteConversation : Status.muteConversation)(status.id)
self.mastodonController?.run(request) { (response) in self.mastodonController?.run(request) { (response) in
if case let .success(status, _) = response { if case let .success(status, _) = response {
self.mastodonController?.persistentContainer.addOrUpdate(status: status, incrementReferenceCount: false) self.mastodonController?.persistentContainer.addOrUpdate(status: status, incrementReferenceCount: false)
@ -179,7 +178,7 @@ extension MenuPreviewProvider {
let pinned = status.pinned ?? false let pinned = status.pinned ?? false
actionsSection.append(createAction(identifier: "", title: pinned ? "Unpin" : "Pin", systemImageName: pinned ? "pin.slash" : "pin", handler: { [weak self] (_) in actionsSection.append(createAction(identifier: "", title: pinned ? "Unpin" : "Pin", systemImageName: pinned ? "pin.slash" : "pin", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
let request = (pinned ? Status.unpin : Status.pin)(statusID) let request = (pinned ? Status.unpin : Status.pin)(status.id)
self.mastodonController?.run(request, completion: { [weak self] (response) in self.mastodonController?.run(request, completion: { [weak self] (response) in
guard let self = self else { return } guard let self = self else { return }
if case let .success(status, _) = response { if case let .success(status, _) = response {
@ -193,7 +192,7 @@ extension MenuPreviewProvider {
openInSafariAction(url: status.url!), openInSafariAction(url: status.url!),
createAction(identifier: "share", title: "Share...", systemImageName: "square.and.arrow.up", handler: { [weak self] (_) in createAction(identifier: "share", title: "Share...", systemImageName: "square.and.arrow.up", handler: { [weak self] (_) in
guard let self = self else { return } guard let self = self else { return }
self.navigationDelegate?.showMoreOptions(forStatus: statusID, sourceView: sourceView) self.navigationDelegate?.showMoreOptions(forStatus: status.id, sourceView: sourceView)
}), }),
] ]
@ -203,7 +202,7 @@ extension MenuPreviewProvider {
return return
} }
// todo: this should try to find an existing session // todo: this should try to find an existing session
UIApplication.shared.requestSceneSessionActivation(nil, userActivity: UserActivityManager.showConversationActivity(mainStatusID: statusID, accountID: id), options: nil, errorHandler: nil) UIApplication.shared.requestSceneSessionActivation(nil, userActivity: UserActivityManager.showConversationActivity(mainStatusID: status.id, accountID: id), options: nil, errorHandler: nil)
})) }))
#endif #endif

View File

@ -212,7 +212,7 @@ class BaseStatusTableViewCell: UITableViewCell {
if #available(iOS 14.0, *) { if #available(iOS 14.0, *) {
// keep menu in sync with changed states e.g. bookmarked, muted // keep menu in sync with changed states e.g. bookmarked, muted
moreButton.menu = UIMenu(title: "", image: nil, identifier: nil, options: [], children: actionsForStatus(statusID: statusID, sourceView: moreButton)) moreButton.menu = UIMenu(title: "", image: nil, identifier: nil, options: [], children: actionsForStatus(status, sourceView: moreButton))
} }
} }
@ -230,7 +230,7 @@ class BaseStatusTableViewCell: UITableViewCell {
func updateUIForPreferences(account: AccountMO, status: StatusMO) { func updateUIForPreferences(account: AccountMO, status: StatusMO) {
avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarImageView) avatarImageView.layer.cornerRadius = Preferences.shared.avatarStyle.cornerRadius(for: avatarImageView)
attachmentsView.contentHidden = Preferences.shared.blurAllMedia || (mastodonController.persistentContainer.status(for: statusID)?.sensitive ?? false) attachmentsView.contentHidden = Preferences.shared.blurAllMedia || status.sensitive
updateStatusIconsForPreferences(status) updateStatusIconsForPreferences(status)

View File

@ -180,10 +180,13 @@ class TimelineStatusTableViewCell: BaseStatusTableViewCell {
} }
override func getStatusCellPreviewProviders(for location: CGPoint, sourceViewController: UIViewController) -> BaseStatusTableViewCell.PreviewProviders? { override func getStatusCellPreviewProviders(for location: CGPoint, sourceViewController: UIViewController) -> BaseStatusTableViewCell.PreviewProviders? {
guard let mastodonController = mastodonController else { return nil } guard let mastodonController = mastodonController,
let status = mastodonController.persistentContainer.status(for: statusID) else {
return nil
}
return ( return (
content: { ConversationTableViewController(for: self.statusID, state: self.statusState.copy(), mastodonController: mastodonController) }, content: { ConversationTableViewController(for: self.statusID, state: self.statusState.copy(), mastodonController: mastodonController) },
actions: { self.actionsForStatus(statusID: self.statusID, sourceView: self) } actions: { self.actionsForStatus(status, sourceView: self) }
) )
} }